过零检测电路

过零检测电路如下,光耦我用的pc817

过零检测电路

检测过零点,然后输入单片机INT0 ,过零后单片机中断延时,来控制可控硅光耦MOC3061导通时间,隔离后控制双向可控硅,负载用的是交流单相电机。但是调节到一定速度(低速时)电机会出现抖动,这是

什么原因?电路与下图相似

过零检测电路

单片机程序如下:

#include

unsigned char time;

sbit bb1=P2^0;

sbit key1 = P2^4;

sbit key2 = P2^5;

sbit key3 = P2^6;

sbit key4 = P2^7;

unsigned char k;

void delay(unsigned int t) // 延时子程序,入口参数ms,延迟时间=t*1ms,t=0~65535

{

unsigned char j; //j=0~255

while(t--) //t的值等于while()下面{}的语句执行的次数

{

for(j = 0; j < 30; j++);//j进行的内部循环,j=j+1,每执行一次加1,大约消耗单片机处理时间//8us,那么执行一次for(),注意for()后面加了分号。大约消耗CPU 8us*125=1000us=1ms

}

}

void int0() interrupt 0

{

TR0=1;

}

void PWM (void)

{

if(key1==0) //按下相应的按键

{

k=0;

}

else if (key2==0) //按下相应的按键

{

k=10;

}

else if (key3==0) //按下相应的按键

{

k=15;

}

else if (key4 ==0) //按下相应的按键

{

k=30;

}

}

void timer0() interrupt 1 {

TH0=(65536-3000)/256; TL0=(65536-3000)%256; time=0;

}

void main()

{

bb1=1;

time=1;

TMOD=0x01;

TH0=(65536-3000)/256;

TL0=(65536-3000)%256;

EA=1;

PT0=1;

EX0=1;

IT0=1;

ET0=1;

k=0;

while(1)

{

if(time==0)

{

time=1;

PWM();

bb1=0;

delay(k);

bb1=1;

TR0=0;

}

}

}

相关推荐
相关主题
热门推荐