找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5863|回复: 9
收起左侧

51单片机的RLC自动测量电路+程序设计

  [复制链接]
ID:465223 发表于 2019-3-12 16:46 | 显示全部楼层 |阅读模式
普渡众生哈哈哈,交流交流,(5元买的,大家有积分就阔以下载哦)
传统的RLC参数测量的方法种类很多,例如:直接用欧姆表测量电阻,或者对电阻两端施加一定的电压,利用电流表测得流过的电流值,再按照欧姆定理计算出电阻值;而对电感或电容的测试采用测量阻抗角和负阻抗,然后利用数学公式计算出电容和电抗的参数。此外还可以采用过渡过程分析方法,此方法用于计算含有储能元器件L、C的电路的时间常数,因研究的是一个电路从一个稳态过渡到另一个稳态,此方法涉及到初始值稳态值等数据。算出时间常数,由于电路中使用已知的固定的电阻,所以可以通过公式,计算得出电抗参数。在要求测试准确度高的情况下还可以采用交流电桥法,通过调整已知参数使得电桥达到平衡,读出电感或电容值。以上方法必须采用手工操作,而且有些方法需要测量多个数据,再进行人工计算,准确度不大,且太费时费力。在这种情况下,数字式的RLC测量仪应运而生。

电路原理图如下:
0.png

单片机源程序如下:
  1. #include <reg51.h>
  2. #include"lcd.h"
  3. #include <stdio.h>                                          
  4. /*******************************************************************/
  5. /*宏定义 特征值
  6. /******************************************************************/
  7. #define RS_1 4078852                  //特征值  //328852   通过文献中的公式计算出的值
  8. #define RS_2 60134752                                        //72134752
  9. #define CS_1 45067376                                    //36067376
  10. #define CS_2 8208983                                    //48089834
  11. #define LS   545077                                            //445077 通过示波器测220uh,显示的频率反推出的值
  12. /*******************************************************************/
  13. /*I/O口申明
  14. /******************************************************************/
  15. sbit A1 = P2^0;                                  //模拟开关地址位
  16. sbit B1 = P2^1;                              

  17. sbit kr        = P2^2;                                  //电阻挡
  18. sbit kc = P2^3;                                  //电容挡
  19. sbit kl = P2^4;           //按键          //电感挡

  20. sbit sr = P1^0;                                  //继电器1 控制电阻换挡
  21. sbit sc = P1^1;           //继电器          //继电器2 控制电容换挡
  22. /*******************************************************************/
  23. /*变量定义
  24. /******************************************************************/
  25. uint tval = 0,f = 0,sr_f = 0,sc_f = 0,ft = 0,ff = 0;  //tval测量值,f元件标志位,sr_f电阻继电器标志位,Sc_f电容继电器标志位,频率标志位
  26. unsigned long rs = RS_1,cs = CS_1,ls=LS,value = 0;   //特征值初始化

  27. /*********************************************************************/
  28. /*子函数定义
  29. /********************************************************************/

  30. /****************************************/
  31. /* 函数名:unsigned int read()
  32. /* 功能:  读取计数器中的值
  33. /* 输入: 无
  34. /* 输出: 计数器中的数值
  35. /****************************************/
  36. uint read(){
  37.         uchar tl,th1,th2;
  38.         uint val;
  39.         while(1){
  40.                 th1=TH0;
  41.                 tl=TL0;
  42.                 th2=TH0;                        
  43.                 if(th1==th2)                          //保证MCU计数器工作正常
  44.                         break;
  45.         }
  46.         val=(th1<<8)+tl;                          
  47.         return val;
  48. }
  49. /****************************************/
  50. /* 函数名:unsigned int LcdDisplayInt(unsigned int num)
  51. /* 功能:  打印数字
  52. /* 输入: 数值
  53. /* 输出:LCD打印INT数字
  54. /****************************************/
  55. unsigned int LcdDisplayLong(unsigned long num){
  56.         unsigned char buff[11]=NULL;
  57.         unsigned int len,i;
  58.         len = sprintf(buff,"%ld",num);
  59.         for(i=0;i<len;i++){
  60.                 LcdWriteData(buff[i]);        
  61.         }
  62.         return 1;
  63. }
  64. /****************************************/
  65. /* 函数名:        void measure_R()
  66. /* 功能: 测量R
  67. /* 输入: 特征值
  68. /* 输出:  电阻值
  69. /****************************************/
  70. unsigned long measure_R(uint fx,unsigned long rs){
  71.    unsigned long R = 0,fr=0;
  72.    fr=ff*65535+fx;
  73.    ff=0;
  74.    if(fr != 0) R=rs/fr-110;        
  75.    return R;
  76. }
  77. /****************************************/
  78. /* 函数名:        void measure_C()
  79. /* 功能: 测量C
  80. /* 输入: 特征值
  81. /* 输出: 电容值
  82. /****************************************/
  83. unsigned long measure_C(uint fx,unsigned long cs){
  84.    unsigned long C = 0,fc=0;
  85.    fc=ff*65535+fx;
  86.    ff=0;
  87.    if(fc != 0) C=cs/fc;
  88.    return C;
  89. }
  90. /****************************************/
  91. /* 函数名:        void measure_L()
  92. /* 功能: 测量L
  93. /* 输入: 特征值
  94. /* 输出: 电感值
  95. /****************************************/
  96. unsigned long measure_L(uint fx,unsigned long ls){
  97.    unsigned long L = 0,L1 = 0,fl = 0;
  98.    fl=ff*65535+fx;
  99.    ff=0;
  100.    if(fl != 0){ L1=ls/fl;L=L1*L1;}
  101.    return L;
  102. }
  103. /****************************************/
  104. /* 函数名:        detection()
  105. /* 功能: 按键检测
  106. /* 输入: 无
  107. /* 输出: 无
  108. /****************************************/
  109. void detection(){
  110.         //按键检测         0为电阻 1为电电容 2为电感
  111.         if(kr == 0)                         { f = 0; A1 = 0;B1 = 0;}
  112.         else if(kc == 0)                 { f = 1; A1 = 0;B1 = 1;}        
  113.         else if(kl == 0)                 { f = 2; A1 = 1;B1 = 0;}                                                
  114. }
  115. /****************************************/
  116. /* 函数名:        measure()
  117. /* 功能: 测量
  118. /* 输入: 无
  119. /* 输出: 无
  120. /****************************************/
  121. void measure(){
  122.         switch (f){
  123.                 case 0:         //电阻测量
  124.                                 LcdWriteData('R');
  125.                                 LcdWriteData(':');
  126.                                 //电阻换挡
  127.                                 value = measure_R(tval,rs);
  128.                                 if(value >= 1000 && sr_f == 0) {
  129.                                         sr = 1;
  130.                                         rs = RS_2;
  131.                                         sr_f = 1;
  132.                                 }
  133.                                 else if(value < 1000 && sr_f == 1){
  134.                                         sr = 0;
  135.                                         rs = RS_1;
  136.                                         sr_f = 0;
  137.                                 }
  138.                                 value = measure_R(tval,rs);
  139.                         //        LcdDisplayLong(sr_f);                                 //显示档位
  140.                         //        LcdWriteData(':');
  141.                                 break;

  142.                 case 1:         //电容测量
  143.                                 LcdWriteData('C');
  144.                                 LcdWriteData(':');
  145.                                 value = measure_C(tval,cs);
  146.                                 //电容换挡
  147.                                 if(value < 1000 && sc_f == 0){
  148.                                         sc = 1 ;
  149.                                         cs = CS_2;
  150.                                         sc_f = 1;
  151.                                 }
  152.                                 else if(value >= 1000 && sc_f == 1){
  153.                                         sc = 0;
  154.                                         cs = CS_1;
  155.                                         sc_f = 0;
  156.                                 }
  157.                                 value = measure_C(tval,cs);
  158.                                 break;

  159.                 case 2:        //电感测量
  160.                                 LcdWriteData('L');
  161.                                 LcdWriteData(':');
  162.                                 value = measure_L(tval,ls);
  163.                                 break;

  164.                                 default:
  165.                                 break;
  166.                         }
  167. }
  168. /****************************************/
  169. /* 函数名:        unit()
  170. /* 功能:显示单位
  171. /* 输入: 无
  172. /* 输出: 无
  173. /****************************************/
  174. void unit(){
  175.         switch (f){
  176.                 case 0:
  177.                                 LcdWriteData(' ');
  178.                                 LcdWriteData('O');
  179.                                 LcdWriteData('H');
  180.                                 LcdWriteData('M');
  181.                                 break;

  182.                 case 1:
  183.                                 LcdWriteData(' ');
  184.                                 LcdWriteData('P');
  185.                                 LcdWriteData('F');
  186.                                 break;

  187.                 case 2:
  188.                                 LcdWriteData(' ');
  189.                                 LcdWriteData('U');
  190.                                 LcdWriteData('H');
  191.                                 break;

  192.                                 default:
  193.                                 break;
  194.         }
  195. }
  196. /****************************************/
  197. /* 函数名:Init()
  198. /* 功能:初始化
  199. /* 输入: 无
  200. /* 输出: 无
  201. /****************************************/
  202. void Init(){
  203.         TMOD = 0x15;                                        //设置计数器和计时器1的工作模式
  204.         //Falg初始化
  205.         f = 0;
  206.         //配置中断
  207.         EA = 1;
  208.         ET0 = 1;
  209.         ET1 = 1;
  210.         //初始化计数器
  211.         TH0 = 0;
  212.         TL0 = 0;
  213.         TR0 = 1;
  214.         //初始化定时器
  215.         TH1 = (65536-45782)/256;
  216.         TL1 = (65536-45782)%256;
  217.         TR1 = 1;
  218.         //初始化开关
  219.         A1 = 0;
  220.         B1 = 0;
  221.         //初始化继电器
  222.         sr = 0;
  223.         sc = 0;
  224. }

  225. /*********************************************************************/
  226. /*主函数
  227. /********************************************************************/

  228. /****************************************/
  229. /* 函数名:void main()
  230. /* 功能: 主函数
  231. /* 输入: 无
  232. /* 输出: 无
  233. /****************************************/
  234. void main(){
  235.         //延时以便增加电路稳定
  236.         Lcd1602_Delay1ms(1000);
  237.         Lcd1602_Delay1ms(1000);
  238.            LcdInit();
  239.     Init();
  240.         //=======初始化完成=======
  241.                
  242.         //主循环
  243.         while(1){
  244.                 detection();        //按键检测
  245.                 //屏幕显示
  246.                 Lcd1602_Delay1ms(1000);                //延时1S
  247.                 LcdWriteCom(0x01);                        //清屏
  248.                 LcdWriteCom(0x80);                        //设置指针起点
  249.                 measure();                                        //测量
  250.                 LcdDisplayLong(value);                //显示值
  251.                 unit();                                                //显示单位               
  252.         }

  253. }

  254. /*********************************************************************/
  255. /*中断子函数
  256. /********************************************************************/

  257. /****************************************/
  258. ……………………

  259. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png

所有资料51hei提供下载:
2.电路城资料.rar (327.8 KB, 下载次数: 128)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2019-3-16 02:25 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:135915 发表于 2019-3-16 11:56 | 显示全部楼层
很好,赞
回复

使用道具 举报

ID:491577 发表于 2019-3-16 12:26 | 显示全部楼层
这个只是适合学习用,了解一下LRC测量原理是可以的,实用误差太大。真正LRC测量重点在模拟电路部分,准确度是由模拟电路来保证的,单片机只是计算,显示而已。
回复

使用道具 举报

ID:465223 发表于 2019-3-23 10:29 | 显示全部楼层
hhh402 发表于 2019-3-16 12:26
这个只是适合学习用,了解一下LRC测量原理是可以的,实用误差太大。真正LRC测量重点在模拟电路部分,准确度 ...

说得对,这个只是一个原理,要是高精度的话那肯定需要做出很大的改进的
回复

使用道具 举报

ID:380985 发表于 2019-4-7 18:13 来自手机 | 显示全部楼层
好资料
回复

使用道具 举报

ID:465223 发表于 2019-4-16 16:42 | 显示全部楼层
hhh402 发表于 2019-3-16 12:26
这个只是适合学习用,了解一下LRC测量原理是可以的,实用误差太大。真正LRC测量重点在模拟电路部分,准确度 ...

这个有一个可以调节误差的参数,但是需要程序上分类讨论,可能很麻烦,但是确实是一种改进误差的方法
回复

使用道具 举报

ID:511461 发表于 2019-8-7 21:32 | 显示全部楼层
精度能达到多少
回复

使用道具 举报

ID:741786 发表于 2020-4-30 15:48 | 显示全部楼层
过的
下顺德区
回复

使用道具 举报

ID:626187 发表于 2020-11-20 14:33 | 显示全部楼层
请问这个电阻、电容的换挡测量范围是多少?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表