普渡众生哈哈哈,交流交流,(5元买的,大家有积分就阔以下载哦)
传统的RLC参数测量的方法种类很多,例如:直接用欧姆表测量电阻,或者对电阻两端施加一定的电压,利用电流表测得流过的电流值,再按照欧姆定理计算出电阻值;而对电感或电容的测试采用测量阻抗角和负阻抗,然后利用数学公式计算出电容和电抗的参数。此外还可以采用过渡过程分析方法,此方法用于计算含有储能元器件L、C的电路的时间常数,因研究的是一个电路从一个稳态过渡到另一个稳态,此方法涉及到初始值稳态值等数据。算出时间常数,由于电路中使用已知的固定的电阻,所以可以通过公式,计算得出电抗参数。在要求测试准确度高的情况下还可以采用交流电桥法,通过调整已知参数使得电桥达到平衡,读出电感或电容值。以上方法必须采用手工操作,而且有些方法需要测量多个数据,再进行人工计算,准确度不大,且太费时费力。在这种情况下,数字式的RLC测量仪应运而生。
电路原理图如下:
单片机源程序如下:
- #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黑下载附件…………
复制代码
所有资料51hei提供下载:
2.电路城资料.rar
(327.8 KB, 下载次数: 128)
|