摘要:本设计采用互感器作为监测中心,ADC0809实现数模(A /D)转换,AT89C52单片机作为控制中心进行数据的逻辑运算处理,从而实现单相用电器分析监测。本设计用于测试并储存各单件电路在各种状态下用于识别电器并显示出用电器的工作状态。电路中有用电器工作时,互感器产生互感电压经过整流降压之后将数字信号转入 ADC0809中,ADC0809将数字信号转化为模拟信号转给单片机进行处理,最后结果显示于显示屏上。本产品是根据互感电路的方式来实现电流的检测,结构简单可靠,寿命较长,价格较低.便于维护。
关键词:互感器检测 用电器检测 数模信号转换
1. 方案的选择与设计原理 1.1 方案的比较与选择
方案一:串电阻检測电流
可以选择一个欧的精密电阻,连接到电路中用差分放大电路采集电阻的电压差,对电压差放大求出电流,这种做法可以实现测电流但是误差比较大。
优点:电路结构清晰,成本低,实时性好,精度较高
缺点:温漂(环境温度变化时会引起晶体管参数的变化)较大,测量误差较大,无隔离效果,量程较大时,需要分多个挡来处理结果,容易受地的干扰。
方案二:霍尔电流传感器测量电流
输入为电流输出为电压,测量结果精度和线性度都比较高,测量范围有一定的限制。使用ACS712芯片电路比较简单,测量的电流范围较大。相比于ACS712电路比较简单,MAX471不用外加电源供电,但是电流测量范围只在0~3A,该电流测量范围不符合,监测基本要求。
方案三:电流互感器检测电流
理想电流互感器两侧的额定电流大小和它们的绕组匝数成反比,并且常数为K。K=I1/I2=N1/N2。
电流互感器的一次电流取决于一次性电路的电压和阻抗,电流互感器的工作状态接近于短路状态,因此对电能的消耗量较小。
优点:结构简单可靠,寿命较长,便于维护。价格较低。
缺点:不能用于高频检测,但可用于市区电检测。
综合对三个方案比较分析,方案三更适合用于单相用电器分析监测,故采用方案三。
1.2 方案设计
运用电流互感器检测电路中的电流,利用整流电路将220v交流电转化为直流电实现单相用电器分析监测。采用大规模集成电路 ADC0809实现数模(A/D)转换,就是把模拟量信号转换成对应的数字量信号。数字信号传入单片机进行数据处理及控制,然后通过显示屏显示具体的电流值及各电性参数,能达到理想精确值。
2. 检测电路设计及理论分析 2.1 检测电路设计
检测电路设计见附件1中的图2所示。
当一次绕组中有电流1I通过时.一次绕组的磁动势1I产生的磁通绝大部分通过铁芯而闭合,从而在二次绕组中感应出电动势2E。如果二次绕接有负载,那么二次绕组中就有电流2I通过,有电流就有磁动势,所以二次绕组中由磁动势2 2I产生磁通,这个磁通绝大部分也是经过铁芯而闭合。因此铁芯中的磁通是由一、二次绕组的磁动势共同产生的合成磁通为主磁通。根据磁动势平衡原理可以得到:
I1N1+I2N2=I10N1
I10N1---励磁动势。
电流互感器两侧的额定电流大小和它们的绕组匝数成反比,并且常数为K。K=I1/I2=N2/N1
运用电流互感器检测电路中的电流、功率和电能大小。
2.2 特征参量设计 2.2.1设计要求及思路
设计要求:电路电流范围一。
设计思路:由互感器测量电流值(运用K=I1/12=N2/N1),运用整流电路将交流电转化为直流电,再采用大规模集成电路ADC0809实现数模(A/D)转换,把模拟量信号转换成对应的数字量信号。数字信号传入单片机进行数据处理,然后通过显示屏显示具体的电压值和电流值及各电性参数。
2.2.2 参量设计
所使用的互感器的匝数比为 I1/I2=N2/N1=850/10。
半波整流电路由于二极管的单向导电作用,使流过负载电阻的电流为脉动电流,电压也为一单向脉动电压,其电压的平均值(输出直流分量)为方程式
流过负载平均电流为:
流过二极管D的平均电流(即正向电流为):
加在二极管两端的反向电压为:
3. 硬件电路设计与程序设计 3.1 硬件电路设计
检测整流电路设计见附件1中图3所示。
互感器将一次系统的高电压,大电流变换为二次测的低电压(标准值),小电流(标准值),使测量,计量仪表和继电器等装置标准化,小型化,并降低了对二次设备的绝缘要求。
采用整流电路具有单向导电性能的整流元件,将正负交替的正弦交流电整流成为单向的脉动电,再用滤波器将输入或输出经过过滤而得到纯净的直流电。对特定频率的频点或该频点以外的频率进行有效滤除。在自动测量和控制系统中,利用滤波电路进行模拟信号的处理,用于数据传送,抑制干扰。
利用 78LDS 和电阻对直流电进行降压,稳压得到理想的直流电。
选用 ADC0809,单片机 AT89C51
(1)数模(A/D)转换电路图
数模(A/D)转换电路图见附件2图1所示。
(2)模数(A/D)转换原理
数模(A/D)转换,就是把模拟量信号转换成对应的数字量信号。
(3)单片机 AT89C52 电路设计
单片机 AT89C52 电路设计见附件1图4所示。单片机是由运算器,控制器,主要寄存器组成。具有执行各项逻辑运算,指令控制等功能。本设计运用单片机处理数据信息及调控显示时间。
3.2 程序设计
程序设计思路:本系统是以AT89C52单片机为核心,以电流互感器作为监测中心,实时读取ADC0809芯片内采集到的电源线上的电参数信息,通过一定的算法计算出有效电流值,电压值,有效功率等,并且根据电压值,电流值等多种参数的变化,综合判断电源线上用电器的种类和用电状态,并将判断所得结果提供给LCD液晶显示屏上进行显示。
程序代码见附件4所示
4 测量结果分析
用电器 |
电流 |
电压 |
范围 |
显示用电器 |
最大值 |
最小值 |
|||
自制电器 |
7.6mA |
1.2V |
1.0V |
ON1 |
小风扇 |
7.6mA |
1.8V |
1.6V |
ON2 |
小夜灯 |
23mA |
2.8V |
2.6V |
ON3 |
灯泡 |
20.3mA |
3.8V |
3.6V |
ON4 |
吹风机一档 |
1590mA |
4.3V |
4.1V |
ON5 |
吹风机二档 |
3470mA |
5.1V |
4.9V |
ON6 |
水壶 |
8500mA |
5.1 |
5.2V |
ON7 |
(注:测量列表频率为 5.5KHZ)
存在测量误差:由于使用不同的测量电器其内阻不同。因此所得到的电压值范围有所偏移。
数模(A/D)转换得到二进制代码,经过单片机控制响应时间不大于2,及识别代码从而识别用电器类型。通过显示器直接显示电源线上的电特征参数,电器的种类及其工作状态。
随机增加用电器(电风扇,USB 充电器(带负载)和热水壶同时使用),可以实时指示用电器的类别和工作状态。+
用电阻自制一件最小电流的用电器,可以识别的最小电流值为 0.00lmA。
参考资料:
[1]余孟尝.数字电子技术基础简明教程(第三版)高等教育出版社 2006 年 7月
[2]杨素行.模拟电子技术基础简明教程(第三版)高等教育出版社 2006 年 5月
[3]侯殿有.单片机 C语言程序设计 北京:人民邮电出版社 2010 年11月
[4]孙焕铭.51 单片机 C 程序应用实例详解北京航空航天大学出版2011年3 月
附件1:
图1:电路总图
图片4:单片机AD89C51电路图
附件2:
图1:数模A/D转换电路
附件3:调试结果图
图1:电路通电后LCD显示图
图2:用电器检测图
附件4:程序代码
程序目录:
#include<reg52.h>
#include <intrins.h>
#include <stdio.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
sbit ST=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
sbit CLK=P3^3;
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit lcden=P2^2;
void delayms(uint z);//延时 1ms 函数
uint ADC_convert(); //ADC 转换
void init(); //液晶初始化+
void write_com(uchar com); //1602 写指令。
void write_date(uchar date);//1602 写数据。
void Refresh_show();//刷新显示+
void LCD_display(uchar*str);//输出字符串。
uint dat_adc0808;
uchar display_buffer[][16]={
{"Current voltage"},
{" (vol)=0.00V"}
};
uchar code table1[]={"DIAN LIU GUO DA "};//14 电流过大
uchar code table2[]={" JIAN CE BU DAO "};//11 检测不到
uchar code table3[]={"i=7.6mA ON1"}; // 自制电器
uchar code table4[]={"i=7.6mA ON2"}; // 小风扇一档
uchar code table5[]={"i=23mA ON3"}; // 小夜灯
uchar code table6[]={"i=20.3mA ON4"};// 灯泡
uchar code table7[]={"i=1670mA ON5"}; // 吹风机一档
uchar code table8[]={"i=3740mA ON6"}; // 吹风机二档
uchar code table9[]={"i=8500mA ON7"}; //水壶
/*&&&&&&&&&&&&&&&& 向 1602 写指令函数 &&&&&&&&&&&&&&&&*/
void write_com(uchar com)
{
lcdrs=0;
lcdrw=0;
lcden=0;
P1=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
/*&&&&&&&&&&&&&&& 向 1602 写指令结束 &&&&&&&&&&&&&&&&&&*/
/*%%%%%%%%%%%%%向 1602 写数据函数%%%%%%%%%%%%%%%%%%%%%*/
void write_date(uchar date){
lcdrs=1;
lcdrw=0;
lcden=0;
P1=date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
/*%%%%%%%%%%%%%%%%%%%%向 1602 写数据结束%%%%%%%%%%%%%%%%%*/
/******************液晶初始化**********************/
void LCD_init() {
uchar num;
write_com(0x38);//初始化 显示模块设置。
write_com(0x0c);//显示光标+
write_com(0x06);//当读或写一个字符后地址指针加 1,且光标加 1
write_com(0x01);//显示清屏。
write_com(0x80);//不显示光标
for(num=0;num<10;num++) //显示 table1[]=[" POWER SOURCE ")有十四个字
{
write_date(table1[num]);
delayms(10);
}
write_com(0x80+0x40);//指针设置 这里让他第二行开始显示
for(num=0;num<16;num++){ //table2[]=["welcome";//11
write_date(table2[num]);
delayms(10);
}
}
/*****************液晶初始化结束***********/
/*****************模数转化并用于显示***********/
uint ADC_convert()
{
while(1)
{
ST=0;
ST=1;
ST=0;
while(1)
{CLK=!CLK;if(EOC==1)break;}//等待转换结束。
OE=1;
dat_adc0808=P0;
OE=0;
return dat_adc0808;
}
}
/*************模数转换结束**********************
/*&&&&&&&&&&&&&&刷新显示函数&&&&&&&&&&&&&&&&&&*/
void Refresh_show()
{
uint t=dat_adc0808*500.0/256;
display_buffer[1][7]=t/100.0+'0';
display_buffer[1][9]=t/10%10+'0';
display_buffer[1][10]=t%10+'0';
}
/*&&&&&&&&&&&&&&&刷新显示函数结束&&&&&&&&&&&&&&&&&&&*/
/***************lcd 显示字符串*******************/
void LCD_display(uchar*str){
uchar i;
for(i=0;i<strlen(str);i++)
{
write_date(str[i]);
delayms(5);
}
}
/***************lcd 显示字符串结束*******************/
/*###################延时1ms子函数####################*/
void delayms(uint z){
uint x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
/*##############延时1ms子函数结束################*/
void main(){
uchar num;
LCD_init();
while(1)
{
ADC_convert(); //模数转换
Refresh_show(); // 刷新显示
write_com(0x80); //向1602写指令不显示光标
LCD_display(display_buffer[1]); //输出字符串。
Refresh_show(); // 刷新显示
delayms(5);
write_com(0xC0); //向1602写指令
if((display_buffer[1][7]>='9'))//电流过大
{
for(num=0;num<16;num++) //显示:
{
write_date(table1[num]);
delayms(20);}
}
if ((display_buffer[1][7]>='1')&&(display_buffer[1][7]<='8'))
{
if((display_buffer[1][7]=='1')&&('6'<=display_buffer[1][9]<='8') )//自制电器
{
for(num=0;num<16;num++)
{
write_date(table4[num]);
delayms(20);}
}
if((display_buffer[1][7]=='1')&&('6'<=display_buffer[1][9]<='8') )//小风扇小档位1.7
{
for(num=0;num<16;num++)
{
write_date(table4[num]);
delayms(20);}
}
if((display_buffer[1][7]=='2')&&('6'<=display_buffer[1][9]<='8'))//小夜灯2.7
{
for(num=0;num<16;num++)
{
write_date(table5[num]);
delayms(20);}
}
if((display_buffer[1][7]=='3')&&('8'<=display_buffer[1][9]<='9')) //灯泡3.9
{
for(num=0;num<16;num++)
{
write_date(table6[num]);
delayms(20);}
}
if((display_buffer[1][7]=='4')&&('1'<=display_buffer[1][9]<='4'))//吹风机一档4.2
{
for(num=0;num<16;num++)
{
write_date(table7[num]);
delayms(20); }
}
if((display_buffer[1][7]=='5')&&(display_buffer[1][9]<='1'))// 吹风机二档5.0
{
for(num=0;num<16;num++)
{
write_date(table8[num]);
delayms(20); }
}
if((display_buffer[1][7]=='5')&&('5'<=display_buffer[1][9]<='8'))//水壶5.6
{
for(num=0;num<16;num++)
{
write_date(table9[num]);
delayms(20); }
}
}
else // 检测不到
{
for(num=0;num<16;num++)
{
write_date(table2[num]);
delayms(20); }
}
}
}