您现在所在的是:

单片机论坛

回帖:0个,阅读:718 [上一页] [1] [下一页]
912
sfmcu
文章数:44
年度积分:50
历史总积分:912
注册时间:2006/8/22
发站内信
08年优秀博客奖
发表于: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

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

31.2002