找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6431|回復: 9
打印 上一主題 下一主題
收起左側(cè)

51單片機的RLC自動測量電路+程序設計

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:465223 發(fā)表于 2019-3-12 16:46 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
普渡眾生哈哈哈,交流交流,(5元買的,大家有積分就闊以下載哦)
傳統(tǒng)的RLC參數(shù)測量的方法種類很多,例如:直接用歐姆表測量電阻,或者對電阻兩端施加一定的電壓,利用電流表測得流過的電流值,再按照歐姆定理計算出電阻值;而對電感或電容的測試采用測量阻抗角和負阻抗,然后利用數(shù)學公式計算出電容和電抗的參數(shù)。此外還可以采用過渡過程分析方法,此方法用于計算含有儲能元器件L、C的電路的時間常數(shù),因研究的是一個電路從一個穩(wěn)態(tài)過渡到另一個穩(wěn)態(tài),此方法涉及到初始值穩(wěn)態(tài)值等數(shù)據(jù)。算出時間常數(shù),由于電路中使用已知的固定的電阻,所以可以通過公式,計算得出電抗參數(shù)。在要求測試準確度高的情況下還可以采用交流電橋法,通過調(diào)整已知參數(shù)使得電橋達到平衡,讀出電感或電容值。以上方法必須采用手工操作,而且有些方法需要測量多個數(shù)據(jù),再進行人工計算,準確度不大,且太費時費力。在這種情況下,數(shù)字式的RLC測量儀應運而生。

電路原理圖如下:


單片機源程序如下:
  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;                                  //模擬開關(guān)地址位
  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. /*子函數(shù)定義
  29. /********************************************************************/

  30. /****************************************/
  31. /* 函數(shù)名:unsigned int read()
  32. /* 功能:  讀取計數(shù)器中的值
  33. /* 輸入: 無
  34. /* 輸出: 計數(shù)器中的數(shù)值
  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計數(shù)器工作正常
  44.                         break;
  45.         }
  46.         val=(th1<<8)+tl;                          
  47.         return val;
  48. }
  49. /****************************************/
  50. /* 函數(shù)名:unsigned int LcdDisplayInt(unsigned int num)
  51. /* 功能:  打印數(shù)字
  52. /* 輸入: 數(shù)值
  53. /* 輸出:LCD打印INT數(shù)字
  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. /* 函數(shù)名:        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. /* 函數(shù)名:        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. /* 函數(shù)名:        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. /* 函數(shù)名:        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. /* 函數(shù)名:        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. /* 函數(shù)名:        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. /* 函數(shù)名:Init()
  198. /* 功能:初始化
  199. /* 輸入: 無
  200. /* 輸出: 無
  201. /****************************************/
  202. void Init(){
  203.         TMOD = 0x15;                                        //設置計數(shù)器和計時器1的工作模式
  204.         //Falg初始化
  205.         f = 0;
  206.         //配置中斷
  207.         EA = 1;
  208.         ET0 = 1;
  209.         ET1 = 1;
  210.         //初始化計數(shù)器
  211.         TH0 = 0;
  212.         TL0 = 0;
  213.         TR0 = 1;
  214.         //初始化定時器
  215.         TH1 = (65536-45782)/256;
  216.         TL1 = (65536-45782)%256;
  217.         TR1 = 1;
  218.         //初始化開關(guān)
  219.         A1 = 0;
  220.         B1 = 0;
  221.         //初始化繼電器
  222.         sr = 0;
  223.         sc = 0;
  224. }

  225. /*********************************************************************/
  226. /*主函數(shù)
  227. /********************************************************************/

  228. /****************************************/
  229. /* 函數(shù)名:void main()
  230. /* 功能: 主函數(shù)
  231. /* 輸入: 無
  232. /* 輸出: 無
  233. /****************************************/
  234. void main(){
  235.         //延時以便增加電路穩(wěn)定
  236.         Lcd1602_Delay1ms(1000);
  237.         Lcd1602_Delay1ms(1000);
  238.            LcdInit();
  239.     Init();
  240.         //=======初始化完成=======
  241.                
  242.         //主循環(huán)
  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. /*中斷子函數(shù)
  256. /********************************************************************/

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

  259. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


所有資料51hei提供下載:
2.電路城資料.rar (327.8 KB, 下載次數(shù): 128)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2019-3-16 02:25 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:135915 發(fā)表于 2019-3-16 11:56 | 只看該作者
很好,贊
回復

使用道具 舉報

地板
ID:491577 發(fā)表于 2019-3-16 12:26 | 只看該作者
這個只是適合學習用,了解一下LRC測量原理是可以的,實用誤差太大。真正LRC測量重點在模擬電路部分,準確度是由模擬電路來保證的,單片機只是計算,顯示而已。
回復

使用道具 舉報

5#
ID:465223 發(fā)表于 2019-3-23 10:29 | 只看該作者
hhh402 發(fā)表于 2019-3-16 12:26
這個只是適合學習用,了解一下LRC測量原理是可以的,實用誤差太大。真正LRC測量重點在模擬電路部分,準確度 ...

說得對,這個只是一個原理,要是高精度的話那肯定需要做出很大的改進的
回復

使用道具 舉報

6#
ID:380985 發(fā)表于 2019-4-7 18:13 來自手機 | 只看該作者
好資料
回復

使用道具 舉報

7#
ID:465223 發(fā)表于 2019-4-16 16:42 | 只看該作者
hhh402 發(fā)表于 2019-3-16 12:26
這個只是適合學習用,了解一下LRC測量原理是可以的,實用誤差太大。真正LRC測量重點在模擬電路部分,準確度 ...

這個有一個可以調(diào)節(jié)誤差的參數(shù),但是需要程序上分類討論,可能很麻煩,但是確實是一種改進誤差的方法
回復

使用道具 舉報

8#
ID:511461 發(fā)表于 2019-8-7 21:32 | 只看該作者
精度能達到多少
回復

使用道具 舉報

9#
ID:741786 發(fā)表于 2020-4-30 15:48 | 只看該作者
過的
下順德區(qū)
回復

使用道具 舉報

10#
ID:626187 發(fā)表于 2020-11-20 14:33 | 只看該作者
請問這個電阻、電容的換擋測量范圍是多少?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表