|
现在的AT89C2051单片机极其便宜,淘宝上不到2元钱,里面带一个比较器,因此利用它来做保护电路性价比不错
保护电路实现如下功能
1.直流检测
保护电路要检测正负窗口电压,但现在是在单电源下,如果要另外加DC检测,就失去了电路的简洁性,所以设计了如下单电源下的DC检测电路,只需一只单电源的比较器即可
单电源 正负窗口电压比较器 (原文件名:1.png)
AT89C2051里面的比较器也是单电源的比较器,其输入电压可以等于地电平,因此用在这里很合适。
当输入电压为0时,两个二极管都不通,比较器负输入端电压为820K/39K分压,大概为0.22V,正输入端为0,因此比较器出0
正电平检测闸值为二极管导通电压+0.22V,仿真大约是0.75V
而负电平检测时,此时D1不通,比较器+输入端电压约为0,但-输入端为+0.22V,此时只要输入端电压小于一定程度,D2会导通,会将-输入端的电压拉低,直到为负的电压,此时比较器反转。仿真大约是-0.55V触发。
2.交流断电检测
这里交流检测是检测交流过零脉冲,检测电路由光耦组成,交流电是50Hz,因此光耦每20mS会导通,产生一个中断脉冲,MCU用这个脉冲复位定时器。
一旦在50mS内检测不到交流的脉冲,程序就认为是掉电了,就将继电器断开。
3.延时
任何故障排除后,都延时9秒左右时间才将继电器吸合。
4.外接扩充信号控制
用于扩展其功能,例如过流保护等等。。。
5.报警显示
在故障状态(交流断电、DC保护、外接信号有效)时,故障灯闪烁
在排除了故障后,正常灯会闪烁一段时间,然后才将继电器吸合,并正常灯常亮。
电路图如下:
原理图 (原文件名:2.gif)
源码如下,
#include <AT89X51.h>
#define FLASHTIME 6000 //闪烁计时
#define DELAYTIME 100000L //延时时间
#define H_50mS 22 //看门狗定时时间,时钟14.318M,大约延时50mS,即超过2个50HZ交流周期。
#define L_50mS 0
//(65535-22*256)*12/14.318MHz=50.2ms
#define OK_STATE 0 //正常状态
#define DELAY_STATE 1 //正常,但在延时状态
#define FAULT_STATE 2 //故障状态
#define RELAY P1_5 //驱动继电器,0--》继电器吸合
#define RLED P1_6 //故障灯 0-》亮
#define GLED P1_7 //正常灯 0--》亮
#define ProtectLine P3_5 //外接其他信号
#define AC_LINE P3_2 //交流信号检测,接在int0端子
#define DCProtect P3_6 //AT2051内部比较器接在P3.6口的。
unsigned char state;
long DelayCount; //延时计数器
unsigned int FlashCount; //闪烁计数器
bit AC_OK; //交流电正常标志
//市电交流过零时触发int0,中断程序重新初始化定时器0,
//因为定时器0是50ms才中断,但50Hz交流电周期是20mS,如果市电正常的话,那么定时器0永远不会产生计数溢出。
void Int0_int(void) interrupt 0
{
EA=0;
AC_OK=1;
TH0=H_50mS;
TL0=L_50mS;
EA=1;
}
//定时器0溢出中断,用于设置交流断电标志。
void Time0_int(void) interrupt 1
{
AC_OK=0;
TH0=H_50mS;
TL0=L_50mS;
}
void main(void)
{
TMOD|=0x1;
TH0=H_50mS;
TL0=L_50mS;
state=DELAY_STATE;
DelayCount=0;
AC_OK=1;
RELAY=1;
TR0=1;
ET0=1;
IT0=1;
EX0=1;
EA=1;
for(; ;)
{
if (AC_OK==0 || ProtectLine==0 || DCProtect ==1)
{state=FAULT_STATE; //故障状态
RELAY=1; //继电器释放
GLED=1; //绿色LED灭
FlashCount++; //红色LED闪烁
if (FlashCount>FLASHTIME)
{RLED=!RLED;
FlashCount=0;
}
}
else
{if (state==FAULT_STATE) //如果刚才是故障状态,但现在已正常,那么进入延时状态
{state=DELAY_STATE;
DelayCount=0;
}
if (state==DELAY_STATE)
{DelayCount++; //延时计数器计数,计数结束才进入正常状态
if (DelayCount>DELAYTIME)
state=OK_STATE;
}
if (state==OK_STATE)
{RELAY=0; //正常状态 ,继电器吸合
GLED=0; //绿色亮
RLED=1; //红色灭
}
else
{RELAY=1; //延时状态 继电器释放
RLED=1; //红色灭
FlashCount++; //绿色闪
if (FlashCount>FLASHTIME)
{GLED=!GLED;
FlashCount=0;
}
}
}
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|