簡易數字式電阻、電容和電感測量儀設計報告
寫在前面:這是這次參加電子設計大賽我寫的設計報告,但是我本人現在對硬件不是很熟悉,所以很對原理敘述不是很到位啊,不過整個作品用到知識點和原理都基本說清楚了。
簡易數字式電阻、電容和電感測量儀設計報告
摘要:本系統利用TI公司的16位超低功耗單片機MSP430F149和ICL8038精密函數發生器實現對電阻、電容和電感參數的測量。本系統以自制電源作為LRC數字電橋和各個主要控制芯片的輸入電源,并采用ICL8038芯片產生高精度的正弦波信號流經待測的電阻、電容或者電感和標準電阻的串聯電路,通過測量電阻、電容或者電感和標準電阻各自的電壓,利用電壓比例計算的方法推算出電阻值、電容值或者電感值。利用MSP430F149單片機控制測量和計算結果,運用自校準電路提高測量精度,同時用差壓法,消除了電源波動對結果的影響。測量結果采用12864液晶模塊實時顯示。實驗測試結果表明,本系統性能穩定,測量精度高。
關鍵詞:LRC數字電橋、電壓比例法、液晶模塊、MSP430F149、電阻電容電感測量
目 錄
一、設計內容及功能... 1
1.1設計內容... 1
1.2 具體要求... 2
1.3系統功能... 2
二、系統方案設計與選擇... 2
三、系統設計... 3
3.1系統總體設計... 3
3.2系統模塊設計... 4
四、理論分析與計算... 5
五、系統硬件設計... 5
5.1 電源電路... 5
5.2 LRC測量電路... 6
5.3 整流濾波電路... 6
六、系統軟件設計... 8
6.1 控制測量程序模塊... 8
6.2 按鍵處理程序模塊... 8
6.3電阻電感電容計算程序... 9
6.4液晶顯示程序模塊... 10
七、系統測試... 10
7.1 測試原理... 10
7.2 測試方法... 10
7.3 測試儀器... 10
7.4 測試結果... 10
7.5 測試分析... 11
八、系統總結... 12
附件一、本系統的主要程序... 12
一、設計內容及功能
1.1設計內容
設計并制作一臺簡易數字式電阻、電容和電感參數測量儀,由測量對象、測量儀、LCD顯示和自制電源組成,系統模塊劃分如下圖所示:

1.2 具體要求
1. 測量范圍
(1)基本測量范圍:電阻100Ω~1MΩ;電容100pF~10000pF;電感100μH~10mH。
(2)發揮測量范圍:電阻10Ω~10MΩ;電容50pF~10μF;電感50μH~1H。
2. 測量精度
(1)基本測量精度:電阻 ±5% ;電容 ±10% ;電感 ±5% 。
(2)發揮測量精度:電阻 ±2% ;電容 ±8% ;電感 ±8% 。
3. 利用128*64液晶顯示器,顯示測量數值、類型和單位。
4. 自制電源
5. 使用按鍵來設置測量的種類和單位
1.3系統功能
1. 基本完成以上具體要求
2. 使用三個按鍵分別控制R、C、L的測試
3. 采用液晶顯示器顯示測量結果
二、系統方案設計與選擇
電阻、電容、電感測試儀的設計目前有多種方案可以實現,例如、使用可編程邏輯控制器(PLC)、振蕩電路與單片機結合或CPLD與EDA相結合等等來實現。在設計前本文對各種方案進行了比較:
方案一.基于模擬電路的測量儀
利用模擬電路,電阻可用比例運算器法和積分運算器法,電容可用恒流法和比較法,電感可用時間常數發和同步分離法等,雖然避免了編程的麻煩,但電路復雜,所用器件較多,靈活性差,測量精度低,現在已較少使用。
方案二.可編程邏輯控制器(PLC)
此方案采用PLC對硬件進行控制,應用較為廣泛。它能夠非常方便地集成到工業控制系統中。其速度快,體積小,可靠性和精度都較好,在設計中可采用PLC對硬件進行控制,但是用PLC實現價格相對昂貴,因而成本過高。
方案三.采用CPLD或FPGA實現
此方案則采用廣泛應用的VHDL硬件電路描述語言,實現電阻,電容,電感測試儀的設計,利用MAXPLUSII集成開發環境進行綜合、仿真,并下載到CPLD或FPGA可編程邏輯器件中,完成系統的控制作用。但相對而言設計規模大,系統結構復雜。
方案四.利用LRC數字電橋與單片機結合
利用LRC數字電橋將電阻、電容和電感參數轉化為電壓模擬信號,此模擬量由高精度AD轉換芯片轉換為數字量。這樣由單片機處理數字量,能夠滿足測量精度高、易于實現自動化測量等設計需要,而且單片機構成的應用系統有較大的可靠性、系統擴展、系統配置靈活,容易構成各種規模的系統。
通過對上述方案的比較,利用LRC數字電橋與單片機結合實現電阻、電容、電感測試儀更為簡便可行,節約成本。所以,本文選定以單片機為核心來實現對電阻、電容和電感測量的設計。
三、系統設計
3.1系統總體設計
本系統包括硬件設計和軟件設計兩部分內容。
硬件設計主要分為七部分:第一部分采用AMS1117芯片制作的電源,輸出穩定的3.3V電壓。第二部分為ICL8038芯片產生正弦波。第三部分用RC和RL電路實現LRC數字電橋的功能。第四部分是對正弦波進行精密濾波的功能。第五部分利用MSP430F149單片機自帶的AD實現模擬信號轉換為數字信號的功能。第六部分為MSP430F149單片機接收轉換后的數字信號并做相應的處理,根據按鍵狀態控制測量的類型和單位。第七部分為測量結果顯示部分,采用的是128*64液晶顯示器。
系統硬件總體框圖如下:

圖1 系統硬件總體框圖
軟件由4 部分組成:(1) 控制測量程序,單片機控制測量程序不僅擔負著量程的識別與轉換,而且還負責數據的修正和傳輸;因此主控制器的工作狀態直接決定著整個測量系統能否正常工作,所以控制測量程序對整個測量來說至關重要; (2) 按鍵處理程序,根據按鍵的狀態做相應的功能設置; (3) 電阻電感電容計算程序,單片機根據A/ D 轉換得到的電壓值計算出電阻、電感或者電容值; (4) 液晶模塊顯示程序。本系統的程序框圖如圖2 所示。

圖2 程序框圖
3.2系統模塊設計
3.2.1 電源模塊
輸入的外部電源首先經過橋式整流、濾波電路濾波,再經過AMS1117芯片穩壓成3.3V的直流電壓,向MSP430F149主控制器供電。
3.2.2 信號產生模塊
標準正弦波是保證測量儀的重要條件,特別是在測量電抗元件電容和電感時,正弦波的失真將產生難以修正的錯誤,直接影響測量精度,因此在該測量儀中為保證測量精度,采用了ICL8038芯片產生正弦波。ICL8038精密函數發生器是采用肖特基勢壘二極管等先進工藝制作成的單片集成電路芯片,電源電壓范圍寬、穩定度高、易用等優點,外部只需接入很少的元件即可工作,可產生多種頻率正弦波,其函數波形的頻率受內部或外部電壓控制。
3.2.3 整流濾波模塊
整流濾波模塊采用LM324的集成運放和LC電路對LRC測試模塊產生的信號進行整流濾波,因為測試模塊產生的信號是正弦波,而AD采樣沒辦法采集負信號,所以要通過整流濾波給后面的AD采樣。因為整流濾波是高阻輸入,但也不是無窮大,所以在做測試模塊時,分壓電阻最好小于100K。
3.2.4 AD采樣模塊
本模塊利用MSP430F149單片機自帶的AD轉換功能把整流濾波后的模擬信號轉換為單片機能夠處理的數字信號,并傳送給處理器。
3.2.5 主控制模塊
本模塊采用低功耗的MSP430F149微處理器控制AD裝換,并對轉換結果數據進行接收和處理;通過按鍵控制測量的類型和單位。
3.2.6 顯示模塊
通過LCD驅動程序對MSP430F149處理后的結果數據進行穩定顯示,在測試期間顯示能夠保持穩定狀態,當離開測試能夠迅速歸零。
四、理論分析與計算
本系統主要的功能就是電阻、電容和電感的測量,因此對電阻、電容和電感測量的原理做詳細的分析。
電阻高精度測量較好的方法之一是采用與標準電阻相比較的方法。其主要原理:是在待測電阻
與標準電阻
的串聯電路中加一電流
。這樣
和
上將得到電壓
和
,則測量電阻為:

在設計中,我們采用了與測量電阻相同的測量方法——電壓相除法來測量電容和電感。由于電容和電感屬電抗元件,因此不能采用直流來產生測量信號,而只能采用交流信號。在角頻率為的交流信號的作用下,電容和電感獲得的電壓分別為:


為待測電容和電感。這樣一來,標準元件的選擇就有許多種方法。但為了提高測量精度和降低成本,該測量儀采用了標準電阻,且與電阻測量公用一套標準電阻。所以有:

經過計算可得:


其中
的模值。由公式(5)、(6)式可見,為保證測量精度,必須保證電阻的精度和的高穩定值。為此,我們在該設計中采用了高精度的ICL8038芯片產生正弦波,同時輸出緩沖器采用了運算放大器。為保證波形精度采用了閉環深度負反饋方式。此外,本設計中還采用了運算放大器補償實現無失真AC-DC的轉換,以確保測量精度。
五、系統硬件設計
5.1 電源電路
MSP430F149微處理器需要3.3V電壓供電,但是外部輸入的電壓通常不是3.3V的電壓源,所以需要設計電路把外部輸入電壓轉換為穩定的3.3V電壓,如圖3所示,采用的是AMS1117芯片,可以輸出3.3V電壓,然后經過濾波輸出穩定的3.3V供給MSP430F149。

圖3 穩壓3.3V產生電路
5.2 LRC測量電路
如圖4所示,LRC各元件的測量是通過基本的RR電路,RL電路和RC電路來進行的。當探針的兩端接電阻元件時,此電路就組成的是基本的RR電路;當探針的兩端接電容元件時,此電路就組成的是基本的RC電路;當探針的兩端接電感元件時,此電路就組成的是基本的RL電路。輸入的正弦波可以接頻率為100HZ、1KZ和10KHZ。

圖4 LRC測量電路
5.3 整流濾波電路
此電路采用LM324的集成運放和LC電路對LRC測試模塊產生的信號進行整流濾波。因為測試電路產生的信號是正弦波,而AD采樣沒辦法采集負信號,所以要通過電路整流濾波給后面的AD采樣,電路圖如圖5所示。

圖5整流濾波電路
整流濾波前的波形圖如下圖6所示。

圖6整流濾波前的波形圖
整流濾波后的波形圖如下圖7所示。

圖7整流濾波后的波形圖
六、系統軟件設計
6.1 控制測量程序模塊
單片機控制測量程序不僅擔負著量程的識別與轉換,而且還負責數據的修正和傳輸;因此主控制器的工作狀態直接決定著整個測量系統能否正常工作,所以控制測量程序對整個測量來說至關重要。控制測量流程圖如圖8所示。

圖8 控制測量程序流程圖
6.2 按鍵處理程序模塊
按鍵處理程序的主要功能是設置測量的類型和測量的檔位,當有按鍵被按下時就執行相應的按鍵功能,流程如圖9所示。

圖9 按鍵處理程序流程圖
6.3電阻電感電容計算程序
單片機根據A/ D 轉換得到的電壓值計算出電阻、電感或者電容值,該程序流程圖如圖10所示。

圖10電阻電感電容計算程序流程圖
6.4液晶顯示程序模塊
該程序模塊只有一個功能,就是對測量結果清晰正確的顯示出來,并能夠保持穩定。程序流程圖如圖11所示。

圖11液晶顯示程序模塊流程圖
七、系統測試
7.1 測試原理:在系統設計中,以MSP430F149單片機為核心的電阻、電容、電感測試儀,將電阻,電容,電感,使用對應的振蕩電路轉化為電壓實現各個參數的測量。其中100HZ/1MHZ/10MHZ的正弦波是采用ICL8038芯片產生的,將模擬電壓信號送入AD采樣,通過AD把模擬信號轉換為數字信號,再把數字信號送入MSP430F149單片機處理。以IAR Embedded Workbench為仿真平臺,使用C語言編寫了系統應用軟件;包括主控制模塊、顯示模塊、電阻測試模塊、電容測試模塊和電感測試模塊。
7.2 測試方法:在測試時將被測參數通過本系統測量出來的示值與參數的標稱值進行對比,得到本系統的測量精度。
7.3 測試儀器:示波器,萬用表。
7.4 測試結果:通過按鍵操作,實現測量類型和量程的選擇,根據測量結果對設計進一步進行校正和對實現功能的可靠性的確認。
測試結果如下:
1.電阻測試數據如表1所示。
表1電阻測試數據
|
標稱值 (Ω) |
系統測量 (Ω) |
相對誤差 (%) |
|
20.0 |
20.01 |
0.05 |
|
200.0 |
199.77 |
0.115 |
|
6000.0 |
5993.75 |
0.104 |
|
50000.0 |
49926.63 |
0.147 |
|
301000.0 |
252990.00 |
15.950 |
2.電容測試數據如表 2所示。
表 2電容測試數據
|
讀取示值 (pF) |
標稱值 (pF) |
相對誤差值 (%) |
|
104 |
100 |
4.0 |
|
34.1 |
33 |
3.3 |
|
9.2 |
10 |
8.0 |
3.電感測試數據如表3所示。
表 3電感測試數據
|
讀取示值 (mH) |
標稱值 (mH) |
相對誤差值 (%) |
|
219.47 |
218.29 |
0.54 |
|
16.68 |
16.55 |
0.78 |
|
0.862 |
0.854 |
0.93 |
7.5 測試分析:
根據以上的測試結果表明,本系統完成了文章開始所提出設計內容和功能。本測量儀的測量范圍較寬,并且達到了很好的精度,相對誤差小于1 %。
在實際測量中,由于測試環境,測試儀器,測試方法等都對測試值有一定的影響,都會導致測量結果或多或少地偏離被測量的真值。為了減小本設計中誤差的大小,主要利用修正的方法來減小本測試儀的測量誤差。所謂修正的方法就是在測量前或測量過程中,求取某類系統誤差的修正值。在測量的數據處理過程中選取合適的修正值很關鍵,修正值的獲得有三種途徑。第一種途徑是從相關資料中查取;第二種途徑是通過理論推導求取;第三種途徑是通過實驗求取。
本測試修正值選取主要通過實驗求取,對影響測量讀數的各種影響因素,如溫度、濕度、電源電壓等變化引起的系統誤差。通過對相同被測參數的多次測量結果和不同被測參數的多次測量選取平均值,最后確定被測參數公式的常數K值,從而達到減小本設計系統誤差的目的。由于振蕩電路外圍器件由電容電阻分立元件搭接而成,所以由振蕩電路產生的被測參數對應的頻率有一定的誤差,所以只能通過多次實驗測量,選取合適的修正值來盡可能的減少本測試系統的誤差。
八、系統總結
本系統采用單片機和LRC數字電橋結合的方式實現了一個簡易數字式電阻、電容和電感測量儀,到達了系統基本要求。本儀器利用單片機技術實現了電感電容測量的智能化設計,而且系統性能穩定,測量精度較高,相對誤差小于1 % ,操作簡單,具有較強的實用性。
當然本系統還存在著許多需要改進的地方,比如還可以繼續提高測量的精度和加大測量的范圍。因為是采用單片機實現的,利用其可以編程的特性,使測量的值結合一些數據處理方式使測量更加接近真實值。
本系統也還有許多可以擴展的功能,可以增加語音功能,每次測量值穩定的時候就通過語音報告出來;也可以增加在線測量的功能,這樣就更能夠測量出元件工作時的正常值,而不僅僅是靜態時的值。
1.LCD顯示
1./*********************************************************************
2.函數名稱:DispStr
3.功 能:讓液晶從某個位置起連續顯示一個字符串
4.參 數:unsigned char *s
5. s--指向字符串存放位置的指針
6.返回值 :無
7.*********************************************************************/
8.void DisStr(unsigned char *s)
9.{
10. while(*s>0) //是否是結束字符
11. {
12. LcdWriteData(*s); //寫字符
13. s++;
14. _NOP();
15. }
16.}
17./*********************************************************************
18.函數名稱:LcdReset
19.功 能:對1602液晶模塊進行復位操作
20.參 數:無
21.返回值 :無
22.*********************************************************************/
23.void LcdReset(void)
24.{
25. CtrlDir |= 0x70; //控制線端口設為輸出狀態
26. DataDir = 0xFF; //數據端口設為輸出狀態
27. Delay5ms();
28. LcdWriteCommand(0x30, 1); //規定的復位操作
29. Delay5ms();
30. LcdWriteCommand(0x30, 1);
31. Delay5ms();
32. LcdWriteCommand(0x0c, 1);
33. Delay5ms();
34. LcdWriteCommand(0x01, 1); //顯示清屏
35. Delay5ms();
36. LcdWriteCommand(0x06, 1); //寫字符時整體不移動
37.}
38./*********************************************************************
39.函數名稱:LcdWriteCommand
40.功 能:向液晶模塊寫入命令
41.參 數:cmd--命令,
42. chk--是否判忙的標志,1:判忙,0:不判
43.返回值 :無
44.*********************************************************************/
45.void LcdWriteCommand(uchar cmd,uchar chk)
46.{
47.
48. if (chk) WaitForEnable(); // 檢測忙信號?
49. _NOP();
50. CLR_RS;
51. CLR_RW; //寫命令
52. _NOP();
53. DataPort = cmd; //產生使能脈沖信號
54. _NOP();
55. _NOP();
56. SET_EN; //將命令字寫入數據端口
57. _NOP();
58. _NOP();
59. CLR_EN;
60.}
61./*********************************************************************
62.函數名稱:LcdWriteData
63.功 能:向液晶顯示的當前地址寫入顯示數據
64.參 數:data--顯示字符數據
65.返回值 :無
66.*********************************************************************/
67.void LcdWriteData( uchar data )
68.{
69. WaitForEnable(); //等待液晶不忙
70. _NOP();
71. SET_RS;
72. CLR_RW; //寫數據
73. _NOP();
74. DataPort = data; //產生使能脈沖信號
75. _NOP();
76. SET_EN; //將顯示數據寫入數據端口
77. _NOP();
78. _NOP();
79. CLR_EN;
80.}
81./*********************************************************************
82.函數名稱:WaitForEnable
83.功 能:等待1602液晶完成內部操作
84.參 數:無
85.返回值 :無
86.*********************************************************************/
87.void WaitForEnable(void)
88.{
89. uchar lcdtemp = 0;
90. DataDir &= 0x00; //將P5口切換為輸入狀態
91. CLR_RS; //指令
92. SET_RW; //讀讀忙狀態
93. _NOP();
94. SET_EN; //使能信號
95. _NOP();
96. _NOP();
97. do //判忙
98. {
99. SET_EN;
100. _NOP();
101. lcdtemp = DataIn;
102. CLR_EN;
103. }
104. while(lcdtemp & Busy);
105. CLR_EN;
106. DataDir |= 0xFF; //將P4口切換為輸出狀態
107.}
2.主函數程序
1./************************主函數****************************/
2.void main(void)
3.{
4. WDTCTL = WDTPW+WDTHOLD; //關閉看門狗
5. LcdReset(); //12864位液晶初始化
6. P6SEL |= 0x06; // 使能ADC通道 1,2
7. ADC12CTL0 = ADC12ON+SHT0_8+MSC; // 打開ADC,設置采樣時間
8. ADC12CTL1 = SHP+CONSEQ_3; // 使用采樣定時器
9.
10. ADC12MCTL1 = INCH_1; //通道1選擇
11. ADC12MCTL2 = INCH_2+EOS; //通道2選擇,并設為結束通道
12.
13. ADC12IE = 0x06; // 使能ADC中斷
14. ADC12CTL0 |= ENC; // 使能轉換
15. _EINT(); //全局使能
16. ADC12CTL0 |= ADC12SC; // 開始轉換
17. LPM0; //進入CPU低功耗模式
18.}
19./*******************************************
20.函數名稱:ADC12ISR
21.功 能:ADC中斷服務函數,在這里用多次平均的
22. 計算P6.0口的模擬電壓數值
23.參 數:無
24.返回值 :無
25.********************************************/
26.#pragma vector=ADC_VECTOR
27.__interrupt void ADC12ISR (void)
28.{
29.
30. countNum++;
31. int temp;
32. ADC12CTL0 &=~ADC12SC; // 停止采樣轉換
33.
34. if(ADC12IFG & 0x02)
35. {
36. temp = ADC12MEM1;
37. max_result1 = temp>max_result1?temp:max_result1;
38. ADC12IFG &= ~0X02;
39. }
40.
41. if(ADC12IFG & 0x04)
42. {
43. temp = ADC12MEM2;
44. max_result2 = temp>max_result2?temp:max_result2;
45. ADC12IFG &= ~0X04;
46. }
47. /***********************************************************************/
48. /* 采樣輸出電壓峰峰值 */
49. /***********************************************************************/
50. volt_result1 = max_result1*2.0/4096.0*3.3;
51. sprintf(volt_buff,"電壓1:%.6fV",volt_result1);
52. LcdWriteCommand(0X80,1);
53. DisStr(volt_buff); //顯示輸出電壓單位
54.
55. /***********************************************************************/
56. /* 采樣輸入電壓峰峰值 */
57. /***********************************************************************/
58. volt_result2 = max_result2*2.0/4096.0*3.3;
59. sprintf(volt_buff,"電壓2:%.6fV",volt_result2);
60. LcdWriteCommand(0X90,1);
61. DisStr(volt_buff); //顯示輸入電壓單位
62.
63. /***********************************************************************/
64. /* 用公式計算電感 */
65. /***********************************************************************/
66. /* 電感公式
67. midTemp = sqrt(volt_result2*volt_result2-volt_result1*volt_result1);
68. midTemp = volt_result2*Rref/midTemp;
69. midTemp = midTemp - Rref*Rref;
70. midTemp = sqrt(midTemp);
71. Ctrial = midTemp/2*PI*f0;
72. */
73.
74. /*電容公式
75. midTemp = 2*PI*f0*Rref*volt_result1;
76. Ctrial = volt_result2/midTemp;
77. */
78. /*
79. midTemp = volt_result2/volt_result1-1;
80. Ctrial = midTemp/(2*PI*f0*Rref);
81. */
82.
83. midTemp = volt_result2*volt_result2;
84. midTemp = midTemp/(midTemp-volt_result1*volt_result1);
85. midTemp --;
86. midTemp = sqrt(midTemp);
87. midTemp = 2*PI*f0*Rref*midTemp;
88. Ctrial = 1/midTemp;
89.
90. sprintf(R_Buff,"電容:%.4ef",Ctrial);
91. LcdWriteCommand(0X88,1);
92. DisStr(R_Buff);
93. //采樣1000次,重新采樣
94. if(countNum==1000)
95. {
96. countNum = 0;
97. max_result1 = 0;
98. max_result2 = 0;
99. }
100. ADC12CTL0 |= ADC12SC; // 開始采樣
101.}
浙公網安備 33010602011771號