基于51/52单片机电容、电感、电阻参数测量系统设计与Proteus仿真
我的学记|刘航宇的博客

基于51/52单片机电容、电感、电阻参数测量系统设计与Proteus仿真

刘航宇
昨天发布 /正在检测是否收录...
电子信息类专业“一站式”考研-简历-就业宝藏分享 电子信息类专业“一站式”考研-简历-就业宝藏分享

完整程序与仿真文件见文章末尾

一、设计任务和要求

  1. 设计并制作一个元器件参数测量仪
  2. 电阻阻值测量,范围:100Ω ~ 1MΩ
  3. 电容容值测量,范围:100pF ~ 10000pF
  4. 测量精度:±5%
  5. 电感参数的测量
  6. 扩大量程
  7. 提高测量精度

二、方案设计与论证

2.1 系统总设计框图

pasted_1784990858481_sxzptf.png

图1 系统总设计框图

在测量各元件参数时,采用首先把电感、电容、电阻的参数转化为频率[1],再送至单片机检测,检测结束后,送至 LCD1602 进行显示。

2.2 方案一:电桥平衡原理

① 电阻的测量:直流电桥平衡原理

pasted_1784990980814_5yavx3.png

图2 直流电桥平衡电路图

根据电路平衡原理,不断调节电位器 R3,使得电表指针指向正中间,再测量电位器电阻值。

② 电容的测量:交流电桥平衡原理

pasted_1784991076614_jito75.png

图3 交流电桥平衡电路图

通过调节 Z1、Z2 使电桥平衡。这时电表的读数为零。通过读取 Z1、Z2、Zn 的值,即可得到被测电容的值。

③ 电感的测量:交流电桥平衡原理

pasted_1784991402619_84r7tl.png

图4 交流电桥平衡电路图

2.3 方案二:频率转换法(本设计采用)

① 电阻的测量:555 构成单稳态

pasted_1784991953296_lg44ir.png

图5 555 定时器构成单稳态电路图

根据 555 定时器构成单稳态,产生脉冲波形,通过单片机读取高低电平得出频率,通过公式换算得到电阻阻值。

② 电容的测量:555 构成单稳态

pasted_1785027612555_za97df.png
图6 555 定时器构成单稳态电路图**

根据 555 定时器构成单稳态,产生脉冲波形,通过单片机读取高低电平得出频率,通过公式换算得到电容值。

③ 电感的测量:电容三点式正弦波振荡

pasted_1785027682239_4u3sw9.png

图7 电容三点式正弦波振荡电路图

由电容三点式正弦波振荡电路得出频率,通过单片机读取高低电平得出频率,通过公式换算得到电感值。

2.4 方案对比与选择

对比项方案一(电桥法)方案二(频率法)
测量精度受人为调节影响大单片机数字化,精度高
操作难度调节麻烦,不易操作自动测量,一键显示
电感测量不易测得准确值振荡电路,相对稳定
数字化不易数字化便于单片机处理

结论: 方案二通过单片机读取转化,精确度会明显提高,且便于数字化显示。故本设计选择方案二


三、单元电路设计和参数计算

3.1 电阻的检测单元电路设计

pasted_1785027698225_mjicut.png

图8 555 定时器构成单稳态电路图

由 555 单稳态触发公式:

$$f=\frac{1}{\ln2(R_{1}+2R_x)C}$$

得:

$$R_x=\frac{1}{2}(\frac{1}{\ln2fC}-R_{1})$$

从而,可以计算得出电阻值的大小。

3.2 电容的检测单元电路设计

pasted_1785028035648_x380cp.png

图9 555 定时器构成单稳态电路图

根据 555 定时器构成单稳态,产生脉冲波形,通过单片机读取高低电平得出频率,通过公式换算得到电容值[2]。

由:

$$f=\frac{1}{\ln2^*(R_1+2R_2)^*C_x}$$

若 R1 = R2,得:

$$C_x=\frac{1}{3\ln2^*f^*R_1}$$

从而,可以计算得出电容值的大小。

3.3 电感的检测单元电路设计

pasted_1785028091408_lymeeb.png

图10 电容三点式正弦波振荡电路图

由 LC 振荡频率公式:

$$f=\frac{1}{2\pi\sqrt{\frac{C_1*C_2}{C_1+C_2}*L_x}}$$

得:

$$L_x=\frac{1}{\left(2\pi f\right)^2\frac{C_1*C_2}{C_1+C_2}}$$

从而,可以计算得出电感值的大小。


四、总原理图及元器件清单

4.1 总原理图

pasted_1785028273962_o8rzuv.png

图11 电阻、电容、电感参数测试总原理图
pasted_1785028294514_u0wku4.png
图12 测量电阻、电容部分的原理图
pasted_1785028310991_mmmde2.png
图13 测量电感以及 ±5V 发生原理图

4.2 元器件清单

元件序号型号数量备注
U1STC89C52RC1单片机
R3A103J1排阻
R2, R3, R17, R1810KΩ4电位器
X111.0592M1晶振
C325V, 10uF1电解电容
C1, C2, C11103 (0.01uF)3瓷片电容
R1, R13, R1810KΩ3电阻
J1, J2, J3, J44按键
U216021液晶
A1, A2NE5552555 定时器
R4300Ω1电阻
R5, R6510KΩ2电阻
C4~C9104 (0.1uF)6瓷片电容
R7, R9100KΩ2电阻
C1050V, 22uF1电解电容
Q1~Q3S9108 (NPN)3三极管
R102KΩ1电阻
R8, R11, R141KΩ3电阻
C12, C1350V, 47uF2电解电容
R12, R1939KΩ2电阻
R15, R1651Ω2电阻
C1425V, 470uF1电解电容
U3NE555321运放

五、程序设计

5.1 程序流程图

图14 中断程序流程图
pasted_1785028347463_kh1ui9.png

图15 主程序流程图
pasted_1785028417008_m02be6.png

初始化 (led_init, t_init, keyscan)
    ↓
清屏
    ↓
循环:
    ├── 显示频率 display_f(f)
    └── 根据 a 值分支:
        ├── case 1: 计算电阻 R,显示 display_R(R)
        ├── case 2: 计算电容 C,显示 display_C(C)
        └── case 3: 计算电感 L,显示 display_L(L)

5.2 核心代码

中断函数(频率测量)

void T0_count() interrupt 1
{
    switch(a)
    {
        case 1: // 电阻测量
            while(R_out);
            while(!R_out);
            TH0 = 0; TL0 = 0;
            while(R_out);
            while(!R_out);
            th0 = TH0; tl0 = TL0;
            TR0 = 0;
            break;
        case 2: // 电容测量
            while(C_out);
            while(!C_out);
            TH0 = 0; TL0 = 0;
            while(C_out);
            while(!C_out);
            th0 = TH0; tl0 = TL0;
            TR0 = 0;
            break;
        case 3: // 电感测量
            while(L_out);
            while(!L_out);
            TH0 = 0; TL0 = 0;
            while(L_out);
            while(!L_out);
            th0 = TH0; tl0 = TL0;
            TR0 = 0;
            break;
    }
    f = 1000000.0 / 1.085069 / (th0 * 256 + tl0) + 0.5;
}

主函数

void main()
{
    led_init();   // 液晶初始化
    t_init();     // 定时器初始化
    keyscan();    // 按键检测
    write_com(0x01);  // 清屏
    while(1)
    {
        display_f(f);
        switch(a)
        {
            case 1: // 电阻: R = (T/0.693 - 150) 换算
                R = (ulong)(5000000.0 / 0.6931472 / f - 150 + 0.5);
                display_R(R);
                break;
            case 2: // 电容: C = 换算公式
                C = (int)(100000000.0 / 153 / 0.6931472 / f + 0.5);
                display_C(C);
                break;
            case 3: // 电感: L = 1/(4π²f²C) 换算
                L = (int)(1000000000000.0 / 0.1 / PI / PI / f / f + 0.5);
                display_L(L);
                break;
        }
    }
}

显示函数

// 频率显示
void display_f(ulong f)
{
    uchar count = 0;
    ulong f0 = f;
    while(f) { f = f / 10; count++; }
    for(num = 5 + count; num > 5; num--)
    {
        table2[num] = f0 % 10 + 48;
        f0 = f0 / 10;
    }
    write_com(0x80);
    for(num = 0; num < 6 + count; num++)
    {
        write_data(table2[num]);
        delayms(5);
    }
}

// 电阻显示
void display_R(ulong R)
{
    uchar count = 0;
    ulong R0 = R;
    while(R) { R = R / 10; count++; }
    for(num = 6 + count; num > 6; num--)
    {
        table3[num] = R0 % 10 + 48;
        R0 = R0 / 10;
    }
    write_com(0x80 + 0x40);
    for(num = 0; num < 7 + count; num++)
    {
        write_data(table3[num]);
        delayms(5);
    }
}

// 电容显示
void display_C(uint C)
{
    uchar count = 0;
    uint C0 = C;
    while(C) { C = C / 10; count++; }
    for(num = 5 + count; num > 5; num--)
    {
        table4[num] = C0 % 10 + 48;
        C0 = C0 / 10;
    }
    write_com(0x80 + 0x40);
    for(num = 0; num < 6 + count; num++)
    {
        write_data(table4[num]);
        delayms(5);
    }
}

// 电感显示
void display_L(uint L)
{
    uchar count = 0;
    uint L0 = L;
    while(L) { L = L / 10; count++; }
    for(num = 5 + count; num > 5; num--)
    {
        table5[num] = L0 % 10 + 48;
        L0 = L0 / 10;
    }
    write_com(0x80 + 0x40);
    for(num = 0; num < 6 + count; num++)
    {
        write_data(table5[num]);
        delayms(5);
    }
}

键盘检测函数

void keyscan()
{
    if(key_R == 0)          // 检测电阻按键
    {
        delayms(10);        // 消抖
        if(key_R == 0) a = 1;
    }
    else if(key_C == 0)    // 检测电容按键
    {
        delayms(10);
        if(key_C == 0) a = 2;
    }
    else if(key_L == 0)    // 检测电感按键
    {
        delayms(10);
        if(key_L == 0) a = 3;
    }
    else
        while(key_R && key_C && key_L);  // 等待按键按下
}

5.3 完整程序清单及protues仿真文件(附录)

见文末附录部分。


六、安装与调试

6.1 仿真调试

(1)电阻测量电路仿真

图16 电阻测量的仿真电路图
pasted_1785028525830_e8xagf.png
图17 电阻测量的仿真输出波形
pasted_1785028553380_77yjdf.png

(2)电容测量电路仿真

图18 电容测量的仿真电路图
pasted_1785028566386_213kgj.png
图19 电容测量的仿真输出波形
pasted_1785028577785_fn2fqc.png

(3)电感测量电路仿真

图20 电感测量的仿真电路图
pasted_1785028588732_9bvoyx.png
图21 电感测量的仿真输出波形
pasted_1785028599631_39ilf2.png

调试要点

  • 接通电源,用示波器观察输出波形,若为方波,则电路焊接无误,否则检查电路[3]
  • 在调试过程中发现,若改变电源电压,输出方波的频率会发生变化,计算出的数值存在一定误差
  • 当 VCC 为 3.25V 左右时误差较小

液晶显示电路调试

  • 将测量电路的输出分别与单片机的 P1^5、P1^6、P1^7 相接,观察液晶是否显示测量结果
  • 在调试过程中发现,电阻、电容的测量误差较小
  • 由于电容三点式震荡电路的频率不稳定,电感测量的误差较大

仿真整体显示

图22 电阻测量显示
pasted_1785028620741_10mwwy.png
图23 电容测量显示
pasted_1785028631102_motyub.png
图24 电感测量显示
pasted_1785028644198_twwyn4.png
图25 电源生成模块显示
pm2vEdK.png

6.2 实物调试

实物按照仿真电路搭建,通电显示 "Welcome! RCL detector"

图26 实物开机界面
pm2vmJe.png

电阻检测

  • 插入 2.7KΩ 电阻
  • 若显示不准确,调节仿真中 R2 对应的电位器即可改变输出频率,使得检测精准
  • 检测显示 2735Ω,可见调试准确
图27 电阻检测显示
pm2vnRH.png

电容检测

  • 插入 0.1uF 电容
  • 若显示不准确,调节仿真中 R3 对应的电位器即可改变输出频率,使得检测精准
  • 检测显示 101pF,可见调试准确[4]
图28 电容检测显示
pm2vuzd.png

电感检测

  • 插入 65mH 电感
  • 若显示不准确,调节程序计算公式5,即可改显示结果,使得检测精准
  • 检测显示 65535uH,可见调试准确
图29 电感检测显示
pm2vMQA.png

八、参考文献

[1]杨沁佳.浅谈电感传感器微位移检测仪的原理与设计[J].数字通信世界,2019(09):143+159.
[2]张璐雅,阮景.一种基于555时基电路的振荡器设计[J].集成电路应用,2019,36(12):12-13.
[3]谢琪林.浅谈STC89S51单片机时序[J].电子测试,2020(24):139-140.
[4]黄江.基于STM32的高精度电容测量仪设计[J].信息技术与信息化,2020(11):140-141.
[5]王晓辉,王智永,韩智伟,胡帅可,谢印庆.基于三极管放大原理的电容三点式LC振荡器的设计[J].电子世界,2020(03):206.
[6] E. L. Pankratov. An approach to model manufacturing of an enhanced swing differential Colpitts oscillator based on heterostructures to increase density of their elements with account mismatch-induced stress: on optimization of annealing. 2020, :1-19.

九、附录-完整软件程序与protues仿真文件


// ============================================
// RCL 测量仪程序
// 基于 STC89C52RC + NE555 + LCD1602
// ============================================

#include <reg52.h>

#define uint  unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define PI    3.1415926

// ========== 字符串常量 ==========
uchar code table1[8] = "Welcome! RCL detector";
uchar table2[16] = "f(Hz)=";
uchar table3[16] = "R(Ohm)=";
uchar table4[16] = "C(pF)=";
uchar table5[16] = "L(uH)=";
支付宝支付
价格: 0.80 元
温馨提示:免登录付款后7天内可重复阅读隐藏内容,登录用户付款后可永久阅读隐藏的内容。付费后如无反应,刷新网页即可阅读。 付费可读
© 版权声明
THE END
喜欢就支持一下吧
点赞 3 分享 赞赏
评论 抢沙发
取消