首先用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=(TMR1H<<8|TMR1L); //h-->l
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_temp<0xffff-1000) time1_temp+=20;}//功率(电压)上限
else
{if (time1_temp>buff)time1_temp-=20;} //功率(电压)下限
for (i=1000;i!=0;i--) {;}
init();
}
}
}
上一篇:PIC32编译器和谐说明
下一篇:PIC单片机学习精华心得
推荐阅读最新更新时间:2024-03-16 15:47
- 热门资源推荐
- 热门放大器推荐
设计资源 培训 开发板 精华推荐
- 捉虫行动二:争做EE下载中心黑猫警长!
- RIGOL那些年我们用过的仪器出炉,赶紧为你喜欢的作品投票吧!
- 阅读是德科技 Power Supply、汽车电子精彩专题,让您的设计更精准!参与答题赢好礼!
- 免费下载——Maxim 面向工业应用的参考设计
- Microchip直播:单片机编程不再难, 利用MPLAB®代码配置器(MCC)实现快速开发
- 有奖报名|TI MSPM0 在【电力输送和工厂自动化与控制系统】、【家用电器和电机控制】中的典型应用
- “西北模电王”新概念模拟电路3——《运放电路的频率特性和滤波器》
- 点评下载资料,参加幸运抽奖,让我们迈开技术交流分享的步伐!!
- 有奖直播|罗彻斯特电子半导体全周期解决方案 助您应对供应链中断和元器件停产的挑战