PHILIPS 51LPC系列单片机解析方案
扫描二维码
随时随地手机看文章
1 概述
PHILIPS 51LPC系列单片机目前已包括P87LPC760/1/2/4/7/8/9共七个型号。51LPC提供高速和低速的晶振和RC振荡方式,可编程选择;具有较宽的操作电压范围2.7~6.0V,可编程I/O口线输出模式选择,可选择施密特触发输入,LED驱动输出;有内部看门狗定时器及提供掉电检测模拟功能,最大限度地减少了外部元件的使用。这些特性和改进的C51结构结合在一起,使得在设计高集成度、低成本和低功耗控制电路时具有更多的选择。该系列主要用于对系统成本有严格要求,且系统具有高抗干扰性能的低功耗应用领域,已广泛用于电子阳性能表、IC卡水表、电子称、消毒碗柜、LED显示屏、煤气表等工业控制领域。
本文介绍在市电情况下使用LPC系列微控制器P87LCP761与三象限双向晶闸管(Triac)控制感性负载交流电机的方法。使用一种全新的电流过零检测方法,不必在负载电流线路中加入旁路电阻,利用单相关波整提供控制电路的电源。LPC的高抗干扰性能使得只用极少外部零件即能完成此系统。此解决方案可通过P87LPC761系列单片机的片内RC振荡器和比较来实现,或者其它带有片内PWM、ADC和DAC等功能的LPC系列芯片。该系统可用于对电机(AC/DC)阀门、泵灯等的控制,广泛用于照明、HVAC、电源工具、仪表及工业控制等领域。表1是P87LPC761的引脚功能。
表1 P87LPC761引脚功能
2 原理
2.1 负载电压的过零控制——单输入检测
方框图1和2为该应用的总体框图。电路直接通过市电进行供电,相位控制时序取决于市电电压过零检测(Voltage Zero Crossing)(见图1)或负载电流过零检测(Current ZeroCrossing)(见图2)。采用哪种检测方式取决于实际应用的情况。控制模块计算机发时刻,LPC可直接吸收多个Triac的门电流。为了降低EMI,保证安全操作并控制相位,有必要在电流过零或一个特定的相位角时触发Triac。对于阻性负载,电流和电压过零是一致的;对于感性负载,电流滞后于电压。负载的状态决定了Triac是根据电压过零还是电流过零进行可控硅的触发。
检测电压过零最简单的方法就是测量市电电压极性的变化。LPC的+5V端连接到电源线(或中性点),而中性点(或电源线)通过限流电阻连接到任意一个I/O 口。I/O口的电压被内部钳位二极管钳制0V和+5V之间,如图3所示。微控制器可读入输入口的输入状态,并且当状态从1变为0或从0变为1时,检测到过电压的过零点。电平跳变点取决于I/O口的模式(TTL或施密特触发),过零点到检测点的延迟时间取决于电源电压的变化率(例如230V或110V系统),这些都必须纳入考虑范围。该电路的优点是简单和成本低,因为仅需要一个额外的电阻(要求高耐压值)并可使用LPC的任何一个I/O口。
2.2 电流过零检测——电流过零窗口比较器
电流过零(CZC)是Triac的换流点。在非线性负载时,由于电流过零点和电压过零(VZC)点不一致,CZC检测尤其重要;但是,监控CZC并不像监控 VZC那么容易,因为,通常检测方式需要在负载上串联一个电阻,这就分离了负载电路且浪费了电能。通常方法是通过放大和电平变换,然后和微控制器相连,这至少需要一个额外的运算放大器及其相关元件。LPC检测电流过零采用了一种全新的方法:监控Triac门极(VG)到阳极(T1)的电压。VG-T1给出了Triac即将换流的一个信号,因为VG-T1在CZC时过零,根据负载电流和Triac的特性,VG-T1可低至0.1V或大于1.2V。如图4所示电路,使用窗口比较器监控该电压即能完成CZC功能。图4窗口比较器用于门电压和电流过零检测器,VG-T1相对于线电压可正可负,取决于负载电流的方向。也就是说VG-T1相对于VCC+5V而言可正可负。因此在LPC可监控之前,必须通过R4和R5分压,以使其低于VCC并处于比较器的操作电压范围,R1、R2和R3将电压限制在过零点附近。
[!--empirenews.page--]
3 完整的LPC+Triac+Motor(AC)电路实现
在P87LPC761 和Triac的控制应用中,整个系统对电源消耗很低并具有高抗干扰性能,故可以通过阻容降压和单相半波整流由市电直接供电,而不需要昂贵且体积大的变压器,外部零件极少。此方案成本低。图5所示是一个感性负载的通用电路,同时适合阻性负载。Triac可使用BTA216 600E。像图4那样,通过查询P87LPC761的比较器来检测负载电流过零,并重新触发Triac。也可用中断驱动。启动电机时用电压过零测量并触发 Triac的门级脉冲,以减少电磁干扰,并可从主循环的开始进行控制和重定义在启负载之间软件等待整个半周期。本例在复位后通过用户按键开启负载,通过按键可进行相角控制以控制电机的不同转速。如图5所示,LED发光管闪烁的快慢能体现电机转速,LED闪烁越快电机转动越快,反之则越慢;电机停转,LED 熄灭。此电路稍经修改就可以用于其它许多类似的场合。
源程序清单:
该软件在Keil C51 V6.02上编译通过,在目标板上运动正常。如果用其它编译器必须稍加修改。
#include
#define uchar unsigned char
#define uint unsigned int
uchar s,x,y=0;
void timer0(void)interrupt 1 using 1 {/*T0中断服务程序*/
x=x+1;
if(x/10>s){
if(y= =0){P1=P1&0xfb; /*LED点亮*/
x=0;y=1;}
else {P1=P1|0x04; /*LED熄灭*/
y=0;x=0;}}
TF0=0;TH0=-(28/256);
TL0=-(28%256);
}
[!--empirenews.page--]
void speed(s){ /*电机转换控制子程序*/
uchar pulsecount, pulseduration=0;
uint i=0;
uint j=0;
if (((CMP1&0x02))&&!(CMP2&0x02)/*查询比较器*/
{for (i=0;i
{for(j=0;j<210;j++) ;} /*延时触发*/
CMP1=CMP1&0xfc;
CMP2=CMP2&0xfc;
pulsecount=1;
{P1=P1&0xfe;
pulseduration=12; /*触发脉冲宽度*/
while(pulseduration){pulseduration- -;}
P1=P1|0x01;
pulsecount- -;
}
}
}
void Initcomparatior(void){ //初始化P87LPC761//
PT0AD=0x6f; /*禁止P0口的数字功能*/
P0=0xff;
P0M1=0x2a; /*P01,P03,P05设为高阻输入*/
P0M2=0xd5; /*P00,P04,P06设为推挽方式*/
P1=0xff;
P1M1=0x82; /*P17用于VZC检测*/
P1M2=0x05;
CMP1=0x34;
CMP2=0x34;
}
void main(void)
{uchar pulsecount ,pulseduration=0x00;
uint j;i=0;
SP=0x5f;EA=0;
TH0=-(28/256);
TL0=-(28%256);
TF0=0;EA=0;TR0=0;
ET0=1;CMP1=CMP2=0;
Initcomparator();
CMP1=CMP1&0xfc;
CMP2=CMP2&0xfc;s=0;
while(P1_1) {;}
while(!P1_1){;}
while(P1&0x80){};
while(!(P1&0x80)){};
while(P1&0x80){}
while(!(P1&0x80)){};
while(P1&0x80){};
P1=P1&0xfe; //启动电机
while(1)
{if(P1_1= =0) {
x=0;
while (!x){;}
if(P1_1=0)
{P1=0xff;s=s+1;} //停止电机
if(s= =8){s=0;}
while(!P1_1){;} //等待释放按键
while(P1&0x80){};
while(!(P1&0x80)){};
while(P1&0x80)();
whie(!(P1&0x80)){};
while(P1&0x80){};
P1=P1&0xfe;} //启动电机
EA=1;TR0=1;
speed(s); }
} //结束