找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7782|回复: 16
打印 上一主题 下一主题
收起左侧

单片机做可控硅控制调光,能检测到过零脉冲但灯泡只出现不定时的闪烁,恳请大神们指点!

[复制链接]
跳转到指定楼层
楼主
本帖最后由 15240718601 于 2018-1-29 22:02 编辑

单片机能正确检查到过零脉冲,但是延时移相程序控制不了灯泡亮度,只是偶尔慢闪,跳动的特别厉害。

电路原理图:


可控硅调光的单片机源码:
  1. #include <reg52.h>//12c5a60s2单片机代码
  2. sbit beep=P2^0;
  3. sbit pwmb=P3^3;
  4. sbit key=P3^4;
  5. unsigned int a,m,n,z,i,vaule,num;
  6. void delay_ms(unsigned int z)
  7.            {
  8.                 unsigned int m,n;
  9.                 for(m=z;m>0;m--)
  10.                 for(n=880;n>0;n--);        
  11.         }
  12. void delay90us(void)   //误差 0us
  13. {
  14.     unsigned char a,b;
  15.     for(b=3;b>0;b--)
  16.         for(a=13;a>0;a--);
  17. }

  18. void di(){beep=0;delay_ms(50);beep=1;delay_ms(50);}

  19. void int0_init()                    //外部中断0初始化函数  
  20. {  
  21.     EA = 1;     //打开总中断  
  22.     IT0 = 1;    /*设置中断触发方式:  
  23.                                     ITx = 0;  //  低电平触发  
  24.                                   ITx = 1;  // 下降沿                   */  
  25.     EX0 = 1;    //打开外部中断  
  26. }
  27. void InitTimer0(void)
  28. {
  29.         TMOD = 0x01;
  30.    TH0=0xff;//定时0.1ms
  31.    TL0=0x9c;
  32.     EA = 1;
  33.     ET0 = 1;
  34.    //TR0 = 1;
  35. }
  36. void main()
  37. {
  38.         int0_init();
  39.         InitTimer0();
  40.         pwmb=1;
  41.         while(1)
  42.         {
  43.                            EA=1;
  44.                         if(key==0)
  45.                         {        
  46.                                 EA=0;                        
  47.                                 delay_ms(10);
  48.                         
  49.                                 if(key==0)
  50.                                 {
  51.                                                 di();
  52.                                         if(vaule==100)
  53.                                         vaule=0;
  54.                                         while(!key);
  55.                                         vaule++;
  56.                                 }
  57.                                 EA=1;        
  58.                         }
  59.         }        
  60. }


  61. void int0_isr(void) interrupt 0    //外部中断0服务函数  
  62. {  
  63.         i++;
  64.         TR0=1;                     
  65. }  

  66. void Timer1Interrupt(void) interrupt 1
  67. {  
  68.         unsigned char i;
  69.     TH0=0xff;//定时0.1ms
  70.     TL0=0x9c;
  71.         a++;
  72.         num++;   
  73.         if(num==vaule)                //改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<100
  74.                 {
  75.                         TR0=0;
  76.                                                 num=0;
  77.                         pwmb=0;        //触发MOC3061导通,即触发可控硅导通
  78.                         for(i=0;i<5;i++);//延时2us
  79.                         pwmb=1;
  80.                                                 TH0=0xff;//定时0.1ms
  81.                                             TL0=0x9c;  
  82.                                 }        
  83. }
复制代码

8~PJSWFRMTE{)0B{LIG`M0B.jpg (26.04 KB, 下载次数: 70)

当触发脉冲相位超出过零区间时灯泡反而不亮!

当触发脉冲相位超出过零区间时灯泡反而不亮!

O%8TBA[_M_CD0NXO%K3HBLE.jpg (41.16 KB, 下载次数: 85)

当触发电平在过零区间时,灯泡就亮

当触发电平在过零区间时,灯泡就亮
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2018-1-29 19:04 | 只看该作者
有一种情况需要你注意一下:
如果U4耐压不够,就会自动触发(当电压达到击穿值时就导通,不受控)。所以请查一下U4的耐压是多少?
回复

使用道具 举报

板凳
ID:111634 发表于 2018-1-29 20:45 | 只看该作者
本帖最后由 zl2168 于 2018-1-29 20:49 编辑

MOC3061是自动过零触发,不需要过零脉冲。


回复

使用道具 举报

地板
ID:111634 发表于 2018-1-29 20:54 | 只看该作者
可控硅控制调光有二种方法:一是在半周期内调相触发,另一个是利用过零脉冲,调功触发。

回复

使用道具 举报

5#
ID:58628 发表于 2018-1-29 21:03 | 只看该作者
moc3061是过0触发的,移不了相,且触发电流好象要150MA
回复

使用道具 举报

6#
ID:156494 发表于 2018-1-29 21:17 | 只看该作者
yzwzfyz 发表于 2018-1-29 19:04
有一种情况需要你注意一下:
如果U4耐压不够,就会自动触发(当电压达到击穿值时就导通,不受控)。所以请 ...

我把接控制的线拔去后就不会亮了
回复

使用道具 举报

7#
ID:156494 发表于 2018-1-29 21:18 | 只看该作者
zl2168 发表于 2018-1-29 20:45
MOC3061是自动过零触发,不需要过零脉冲。

那要呢,会怎样?
回复

使用道具 举报

8#
ID:156494 发表于 2018-1-29 21:42 | 只看该作者
yzwzfyz 发表于 2018-1-29 19:04
有一种情况需要你注意一下:
如果U4耐压不够,就会自动触发(当电压达到击穿值时就导通,不受控)。所以请 ...

触发脉冲只在过零区间可以触发可控硅,过零区间之外就不得了C:\Users\Administrator\Desktop\stc12c5a60s2
回复

使用道具 举报

9#
ID:156494 发表于 2018-1-29 21:53 | 只看该作者
yzwzfyz 发表于 2018-1-29 19:04
有一种情况需要你注意一下:
如果U4耐压不够,就会自动触发(当电压达到击穿值时就导通,不受控)。所以请 ...

不是耐压问题,我要是拿去触发脉冲灯泡是不亮的
回复

使用道具 举报

10#
ID:156494 发表于 2018-1-29 21:55 | 只看该作者
只在过零时给触发脉冲才有可能点亮灯泡,其他区间触发却没有亮!
回复

使用道具 举报

11#
ID:111634 发表于 2018-1-30 16:23 | 只看该作者
15240718601 发表于 2018-1-29 21:18
那要呢,会怎样?

调功触发。例如,以100个过零脉冲(小周期10ms)为一个大周期,控制导通小周期的个数,即可控制LED亮度。
回复

使用道具 举报

12#
ID:111634 发表于 2018-1-30 16:26 | 只看该作者
仔细体会理解我上一句话,在此基础上编程,就能成功。祝你好运!
回复

使用道具 举报

13#
ID:156494 发表于 2018-1-30 22:01 | 只看该作者
abc123194 发表于 2018-1-29 21:03
moc3061是过0触发的,移不了相,且触发电流好象要150MA

确实是这样的,谢谢
回复

使用道具 举报

14#
ID:156494 发表于 2018-1-30 22:06 | 只看该作者
zl2168 发表于 2018-1-30 16:26
仔细体会理解我上一句话,在此基础上编程,就能成功。祝你好运!

恩恩谢谢,其实是我用错光耦了,带过零检测的光耦是不能任意截取触发的,只能实现半波功率的开启和关断
回复

使用道具 举报

15#
ID:156494 发表于 2018-1-30 22:14 | 只看该作者
zl2168 发表于 2018-1-30 16:23
调功触发。例如,以100个过零脉冲(小周期10ms)为一个大周期,控制导通小周期的个数,即可控制LED亮度。

嗯,经典,大师
回复

使用道具 举报

16#
ID:58628 发表于 2018-2-1 14:59 来自手机 | 只看该作者
abc123194 发表于 2018-1-29 21:03
moc3061是过0触发的,移不了相,且触发电流好象要150MA

更正,3061发光二极管电流为15ma
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表