普渡眾生哈哈哈,交流交流,(5元買的,大家有積分就闊以下載哦)
傳統的RLC參數測量的方法種類很多,例如:直接用歐姆表測量電阻,或者對電阻兩端施加一定的電壓,利用電流表測得流過的電流值,再按照歐姆定理計算出電阻值;而對電感或電容的測試采用測量阻抗角和負阻抗,然后利用數學公式計算出電容和電抗的參數。此外還可以采用過渡過程分析方法,此方法用于計算含有儲能元器件L、C的電路的時間常數,因研究的是一個電路從一個穩態過渡到另一個穩態,此方法涉及到初始值穩態值等數據。算出時間常數,由于電路中使用已知的固定的電阻,所以可以通過公式,計算得出電抗參數。在要求測試準確度高的情況下還可以采用交流電橋法,通過調整已知參數使得電橋達到平衡,讀出電感或電容值。以上方法必須采用手工操作,而且有些方法需要測量多個數據,再進行人工計算,準確度不大,且太費時費力。在這種情況下,數字式的RLC測量儀應運而生。
電路原理圖如下:
0.png (60.02 KB, 下載次數: 55)
下載附件
2019-3-16 02:22 上傳
單片機源程序如下:
- #include <reg51.h>
- #include"lcd.h"
- #include <stdio.h>
- /*******************************************************************/
- /*宏定義 特征值
- /******************************************************************/
- #define RS_1 4078852 //特征值 //328852 通過文獻中的公式計算出的值
- #define RS_2 60134752 //72134752
- #define CS_1 45067376 //36067376
- #define CS_2 8208983 //48089834
- #define LS 545077 //445077 通過示波器測220uh,顯示的頻率反推出的值
- /*******************************************************************/
- /*I/O口申明
- /******************************************************************/
- sbit A1 = P2^0; //模擬開關地址位
- sbit B1 = P2^1;
- sbit kr = P2^2; //電阻擋
- sbit kc = P2^3; //電容擋
- sbit kl = P2^4; //按鍵 //電感擋
- sbit sr = P1^0; //繼電器1 控制電阻換擋
- sbit sc = P1^1; //繼電器 //繼電器2 控制電容換擋
- /*******************************************************************/
- /*變量定義
- /******************************************************************/
- uint tval = 0,f = 0,sr_f = 0,sc_f = 0,ft = 0,ff = 0; //tval測量值,f元件標志位,sr_f電阻繼電器標志位,Sc_f電容繼電器標志位,頻率標志位
- unsigned long rs = RS_1,cs = CS_1,ls=LS,value = 0; //特征值初始化
- /*********************************************************************/
- /*子函數定義
- /********************************************************************/
- /****************************************/
- /* 函數名:unsigned int read()
- /* 功能: 讀取計數器中的值
- /* 輸入: 無
- /* 輸出: 計數器中的數值
- /****************************************/
- uint read(){
- uchar tl,th1,th2;
- uint val;
- while(1){
- th1=TH0;
- tl=TL0;
- th2=TH0;
- if(th1==th2) //保證MCU計數器工作正常
- break;
- }
- val=(th1<<8)+tl;
- return val;
- }
- /****************************************/
- /* 函數名:unsigned int LcdDisplayInt(unsigned int num)
- /* 功能: 打印數字
- /* 輸入: 數值
- /* 輸出:LCD打印INT數字
- /****************************************/
- unsigned int LcdDisplayLong(unsigned long num){
- unsigned char buff[11]=NULL;
- unsigned int len,i;
- len = sprintf(buff,"%ld",num);
- for(i=0;i<len;i++){
- LcdWriteData(buff[i]);
- }
- return 1;
- }
- /****************************************/
- /* 函數名: void measure_R()
- /* 功能: 測量R
- /* 輸入: 特征值
- /* 輸出: 電阻值
- /****************************************/
- unsigned long measure_R(uint fx,unsigned long rs){
- unsigned long R = 0,fr=0;
- fr=ff*65535+fx;
- ff=0;
- if(fr != 0) R=rs/fr-110;
- return R;
- }
- /****************************************/
- /* 函數名: void measure_C()
- /* 功能: 測量C
- /* 輸入: 特征值
- /* 輸出: 電容值
- /****************************************/
- unsigned long measure_C(uint fx,unsigned long cs){
- unsigned long C = 0,fc=0;
- fc=ff*65535+fx;
- ff=0;
- if(fc != 0) C=cs/fc;
- return C;
- }
- /****************************************/
- /* 函數名: void measure_L()
- /* 功能: 測量L
- /* 輸入: 特征值
- /* 輸出: 電感值
- /****************************************/
- unsigned long measure_L(uint fx,unsigned long ls){
- unsigned long L = 0,L1 = 0,fl = 0;
- fl=ff*65535+fx;
- ff=0;
- if(fl != 0){ L1=ls/fl;L=L1*L1;}
- return L;
- }
- /****************************************/
- /* 函數名: detection()
- /* 功能: 按鍵檢測
- /* 輸入: 無
- /* 輸出: 無
- /****************************************/
- void detection(){
- //按鍵檢測 0為電阻 1為電電容 2為電感
- if(kr == 0) { f = 0; A1 = 0;B1 = 0;}
- else if(kc == 0) { f = 1; A1 = 0;B1 = 1;}
- else if(kl == 0) { f = 2; A1 = 1;B1 = 0;}
- }
- /****************************************/
- /* 函數名: measure()
- /* 功能: 測量
- /* 輸入: 無
- /* 輸出: 無
- /****************************************/
- void measure(){
- switch (f){
- case 0: //電阻測量
- LcdWriteData('R');
- LcdWriteData(':');
- //電阻換擋
- value = measure_R(tval,rs);
- if(value >= 1000 && sr_f == 0) {
- sr = 1;
- rs = RS_2;
- sr_f = 1;
- }
- else if(value < 1000 && sr_f == 1){
- sr = 0;
- rs = RS_1;
- sr_f = 0;
- }
- value = measure_R(tval,rs);
- // LcdDisplayLong(sr_f); //顯示檔位
- // LcdWriteData(':');
- break;
- case 1: //電容測量
- LcdWriteData('C');
- LcdWriteData(':');
- value = measure_C(tval,cs);
- //電容換擋
- if(value < 1000 && sc_f == 0){
- sc = 1 ;
- cs = CS_2;
- sc_f = 1;
- }
- else if(value >= 1000 && sc_f == 1){
- sc = 0;
- cs = CS_1;
- sc_f = 0;
- }
- value = measure_C(tval,cs);
- break;
- case 2: //電感測量
- LcdWriteData('L');
- LcdWriteData(':');
- value = measure_L(tval,ls);
- break;
- default:
- break;
- }
- }
- /****************************************/
- /* 函數名: unit()
- /* 功能:顯示單位
- /* 輸入: 無
- /* 輸出: 無
- /****************************************/
- void unit(){
- switch (f){
- case 0:
- LcdWriteData(' ');
- LcdWriteData('O');
- LcdWriteData('H');
- LcdWriteData('M');
- break;
- case 1:
- LcdWriteData(' ');
- LcdWriteData('P');
- LcdWriteData('F');
- break;
- case 2:
- LcdWriteData(' ');
- LcdWriteData('U');
- LcdWriteData('H');
- break;
- default:
- break;
- }
- }
- /****************************************/
- /* 函數名:Init()
- /* 功能:初始化
- /* 輸入: 無
- /* 輸出: 無
- /****************************************/
- void Init(){
- TMOD = 0x15; //設置計數器和計時器1的工作模式
- //Falg初始化
- f = 0;
- //配置中斷
- EA = 1;
- ET0 = 1;
- ET1 = 1;
- //初始化計數器
- TH0 = 0;
- TL0 = 0;
- TR0 = 1;
- //初始化定時器
- TH1 = (65536-45782)/256;
- TL1 = (65536-45782)%256;
- TR1 = 1;
- //初始化開關
- A1 = 0;
- B1 = 0;
- //初始化繼電器
- sr = 0;
- sc = 0;
- }
- /*********************************************************************/
- /*主函數
- /********************************************************************/
- /****************************************/
- /* 函數名:void main()
- /* 功能: 主函數
- /* 輸入: 無
- /* 輸出: 無
- /****************************************/
- void main(){
- //延時以便增加電路穩定
- Lcd1602_Delay1ms(1000);
- Lcd1602_Delay1ms(1000);
- LcdInit();
- Init();
- //=======初始化完成=======
-
- //主循環
- while(1){
- detection(); //按鍵檢測
- //屏幕顯示
- Lcd1602_Delay1ms(1000); //延時1S
- LcdWriteCom(0x01); //清屏
- LcdWriteCom(0x80); //設置指針起點
- measure(); //測量
- LcdDisplayLong(value); //顯示值
- unit(); //顯示單位
- }
- }
- /*********************************************************************/
- /*中斷子函數
- /********************************************************************/
- /****************************************/
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (5.58 KB, 下載次數: 44)
下載附件
2019-3-16 02:23 上傳
所有資料51hei提供下載:
2.電路城資料.rar
(327.8 KB, 下載次數: 128)
2019-3-12 16:45 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|