发表于:2008/8/26 21:22:00
#0楼
转载:
www.225e.cn
首先用pwm(脉宽调制)方法用于可控硅控制是有条件的,即调制频率不能大于市电频率(50hz),也就是周期不能小于20ms,否则就不能达到调制作用,调制频率超过市电频率时,可控硅即处于连续导通状态而不能达到调压目的。只有调制频率低于市电频率才能起到调压目的,即限制市电的周波通过可控硅的数量而起到调压的目的。因此用该种方法调制的电压周波数一定是小于50hz,超过了人眼视觉暂留效应,此就是用于调光产生闪烁的原因。该调压方法用在调功或对脉动电压不敏感的用途上尚可。如果采用可控硅调压用在调光上,须采用移相的调制方法,可使光连续可调。采用移相方法就需过零检测作为移相基点。过零检测其实并不难,如果要求调压比不是很高采用简单的方法即可奏效;用一只三极管即可。用单片机进行移相调压控制可以做得很精。
/********************************************************************************/
#i nclude
__config (cpd&protect&boren&mclrdis&pwrten&wdten&intio);
/********************************************************************************/
//
void init (void);
/********************************************************************************/
//
bit fg_pw,fg_vs,fg_zq;
volatile unsigned char fg_count;
volatile unsigned int time1_temp,buff;
/********************************************************************************/
#define powon gpio|=0b00110000
#define powoff gpio&=0b00001111
#define vpp gpio2
#define feedback gpio0
/********************************************************************************/
void init (void)
{ clrwdt();
trisio=0b11001111;
wpu=1;
iocb=4; //使能过零信号中断
vrcon=0;
pie1=1;
option=0;
intcon&=7;
intcon|=0b10001000;
cmcon=7;
t1con&=1;
t1con|=0x10;
}
/*********************************************************************************/
void interrupt isr_power (void)
{ gpio=gpio;
if (tmr1if&&tmr1on)
{ tmr1if=0;
if (fg_pw)
{ if (!fg_vs)
{powon;fg_vs=1;tmr1l=112;tmr1h=0xfe;} //触发宽度400us(256+144)
else
{fg_vs=0;
powoff; //关闭
tmr1on=0;
}
}
else {powoff;fg_count=0;}
}
if (gpif)
{ gpif=0;
if (fg_pw)
{fg_zq=1;
tmr1h=(time1_temp>>8);
tmr1l=(time1_temp&0xff);
//if (vpp==0) tmr1h-=3; //上下沿检测,下沿时间补偿(3*256)us
tmr1on=1;
}
else
{ if (vpp) {tmr1on=1;tmr1l=tmr1h=0;} //l-->h
else
{time1_temp=(tmr1hl
tmr1on=0;
tmr1l=tmr1h=0;
time1_temp=~time1_temp; //同步信号周期检测(时间)
time1_temp+=1000; //一个半周时间中缩短1ms开始触发
buff=time1_temp;
if (++fg_count>=4) fg_pw=1;//连续周期检测4次
}
}
}
}
/************************************************************************************/
void main (void)
{ unsigned int i;
tmr0=0;
init();
while (1)
{ if (fg_pw&&fg_zq)
{ fg_zq=0;
if (feedback) {if(time1_tempbuff)time1_temp-=20;} //功率(电压)下限
for (i=1000;i!=0;i--) {;}
init();
}
}
}
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=60480&Name=sfmcu
www.225e.cn
首先用pwm(脉宽调制)方法用于可控硅控制是有条件的,即调制频率不能大于市电频率(50hz),也就是周期不能小于20ms,否则就不能达到调制作用,调制频率超过市电频率时,可控硅即处于连续导通状态而不能达到调压目的。只有调制频率低于市电频率才能起到调压目的,即限制市电的周波通过可控硅的数量而起到调压的目的。因此用该种方法调制的电压周波数一定是小于50hz,超过了人眼视觉暂留效应,此就是用于调光产生闪烁的原因。该调压方法用在调功或对脉动电压不敏感的用途上尚可。如果采用可控硅调压用在调光上,须采用移相的调制方法,可使光连续可调。采用移相方法就需过零检测作为移相基点。过零检测其实并不难,如果要求调压比不是很高采用简单的方法即可奏效;用一只三极管即可。用单片机进行移相调压控制可以做得很精。
/********************************************************************************/
#i nclude
__config (cpd&protect&boren&mclrdis&pwrten&wdten&intio);
/********************************************************************************/
//
void init (void);
/********************************************************************************/
//
bit fg_pw,fg_vs,fg_zq;
volatile unsigned char fg_count;
volatile unsigned int time1_temp,buff;
/********************************************************************************/
#define powon gpio|=0b00110000
#define powoff gpio&=0b00001111
#define vpp gpio2
#define feedback gpio0
/********************************************************************************/
void init (void)
{ clrwdt();
trisio=0b11001111;
wpu=1;
iocb=4; //使能过零信号中断
vrcon=0;
pie1=1;
option=0;
intcon&=7;
intcon|=0b10001000;
cmcon=7;
t1con&=1;
t1con|=0x10;
}
/*********************************************************************************/
void interrupt isr_power (void)
{ gpio=gpio;
if (tmr1if&&tmr1on)
{ tmr1if=0;
if (fg_pw)
{ if (!fg_vs)
{powon;fg_vs=1;tmr1l=112;tmr1h=0xfe;} //触发宽度400us(256+144)
else
{fg_vs=0;
powoff; //关闭
tmr1on=0;
}
}
else {powoff;fg_count=0;}
}
if (gpif)
{ gpif=0;
if (fg_pw)
{fg_zq=1;
tmr1h=(time1_temp>>8);
tmr1l=(time1_temp&0xff);
//if (vpp==0) tmr1h-=3; //上下沿检测,下沿时间补偿(3*256)us
tmr1on=1;
}
else
{ if (vpp) {tmr1on=1;tmr1l=tmr1h=0;} //l-->h
else
{time1_temp=(tmr1hl
tmr1on=0;
tmr1l=tmr1h=0;
time1_temp=~time1_temp; //同步信号周期检测(时间)
time1_temp+=1000; //一个半周时间中缩短1ms开始触发
buff=time1_temp;
if (++fg_count>=4) fg_pw=1;//连续周期检测4次
}
}
}
}
/************************************************************************************/
void main (void)
{ unsigned int i;
tmr0=0;
init();
while (1)
{ if (fg_pw&&fg_zq)
{ fg_zq=0;
if (feedback) {if(time1_tempbuff)time1_temp-=20;} //功率(电压)下限
for (i=1000;i!=0;i--) {;}
init();
}
}
}
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=60480&Name=sfmcu