极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 73649|回复: 32

花了点时间,把Arduino通过可控硅控制220V市电电压搞定了,含过零检测

[复制链接]
发表于 2012-11-4 16:50:51 | 显示全部楼层 |阅读模式
本帖最后由 wasdpkj 于 2012-11-5 13:38 编辑

(很多朋友问这个电路有啥用,可以通过arduino稳定的、线性的控制电器市电电压,你说有什么用呢?)

本着共享的精神,还是发上来吧!让需要的人少走弯路
中间经历了挺多麻烦的,

先是两个PC817光耦烧掉了
再是买错了光耦(买成过零导通的MOC3041了,结果阴差阳错的实现了不用额外过零检测的功率调节)
最终,抽空买了MOC3021,终于搞定了电路

由于我是控制电灯,属于感性负载,所以在可控硅两级加了个RC稳定电路
过零检测部分,直接接应该也可以 ,但总觉得不太安全 ,我用了个220~18v的变压器
LED代表负载
原理图如下(最后的C1可根据电路稳定性调整或去掉)



先写了个测试程序,注释的很明白,自己定义两个按键就行了(我目前c语言很烂,如果哪位知道如何完美的把中断添加到主程序中,不被程序的延迟影响,请写出来分享吧!)
(现在程序延时到有的时候,灯还是会闪动,谁能帮忙看看是哪里的问题?)

  1. int zdpin=0;                //中断0,对应引脚UNO的D2
  2. volatile int zt=LOW;

  3. int m=3000;                        //设置延时初始值,单位微秒
  4. int mx=5200;                //设置延时最大值,单位微秒
  5. int mi=900;                        //设置延时最小值,单位微秒

  6. int x=0;                        //按键
  7. int y=0;                        //按键

  8. void setup ()
  9. {
  10.   pinMode(11,OUTPUT);                //光耦控制端
  11.   pinMode(5,INPUT);                        //按键
  12.   pinMode(6,INPUT);                        //按键
  13.   attachInterrupt(zdpin,light,RISING);                //过零检测的中断
  14.   Serial.begin(9600);
  15. }

  16. void loop()
  17. {
  18.   x=digitalRead(5);                //读取按键状态,D6
  19.   delayMicroseconds(100);                        //防抖
  20.   y=digitalRead(6);                //读取按键状态,D5
  21.   delayMicroseconds(100);                        //防抖
  22.   
  23.   if (x==1)                //最大延时累加,以及封顶
  24.   {
  25.    m=m+20;
  26.    if (m>=mx)
  27.    {
  28.    m=mx;
  29.    }
  30.   }

  31.   if (y==1)
  32.   {
  33.    m=m-20;                //最小延时累减,以及封底
  34.    if (m<=mi)
  35.    {
  36.    m=mi;
  37.    }
  38.   }

  39.   digitalWrite(11,0);                //默认低电位
  40.   
  41.   Serial.println(m);
  42. }

  43. void light()
  44. {
  45.   delayMicroseconds(m);                        //过零检测延时
  46.   digitalWrite(11,1);                        //控制光耦导通
  47. }
复制代码


关于过零检测和延时:市电是50hz的,半个周期也就是10ms,考虑到误差,本程序的延时大概控制在1~6ms之间

一旦检测到过零信号,就在设置的延时时间后,通过光耦发出一个触发电平,使得可控硅导通(导通到下个零点),因此实现了调压。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2012-11-4 17:04:50 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2012-11-4 17:15:59 | 显示全部楼层
从小被电多了,现在看见强电都有点怵。回到正题,arduino的中断都有相应的库函数,你可以找找,很简单的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-4 17:20:21 | 显示全部楼层
micro_听海 发表于 2012-11-4 17:15
从小被电多了,现在看见强电都有点怵。回到正题,arduino的中断都有相应的库函数,你可以找找,很简单的

后面的话不是太理解,中断有相应的库函数?我原来有个程序,整个loop下来要几十毫秒,这个可控硅的程序直接加进去肯定控制不了50hz的交流电,所以我在想解决方法
回复 支持 反对

使用道具 举报

发表于 2012-11-4 18:24:16 | 显示全部楼层
搞不明白,楼主,这个东西是实现什么功能的??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-4 18:29:08 | 显示全部楼层
tom 发表于 2012-11-4 18:24
搞不明白,楼主,这个东西是实现什么功能的??

控制电器电压
回复 支持 反对

使用道具 举报

发表于 2012-11-4 19:26:46 | 显示全部楼层
过零检测。好东西啊
回复 支持 反对

使用道具 举报

发表于 2012-11-4 19:37:20 | 显示全部楼层
用继电器不行吗?
回复 支持 反对

使用道具 举报

发表于 2012-11-4 20:06:34 | 显示全部楼层
楼主是要实现什么功能呢? 可否讲一下? 调光吗?
回复 支持 反对

使用道具 举报

发表于 2012-11-4 20:55:35 | 显示全部楼层
youzitang 发表于 2012-11-4 19:37
用继电器不行吗?

继电器一样可以,但是这个电路也不错!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-4 22:03:24 | 显示全部楼层
youzitang 发表于 2012-11-4 19:37
用继电器不行吗?

继电器只是开断,这个可以实现线性电压变化哦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-4 22:03:47 | 显示全部楼层
本帖最后由 wasdpkj 于 2012-11-4 22:08 编辑
┏ωǒ┛菰独 发表于 2012-11-4 20:06
楼主是要实现什么功能呢? 可否讲一下? 调光吗?


对,调光,或者调整风扇转速,热得快功率都可以!
回复 支持 反对

使用道具 举报

发表于 2012-11-4 22:53:59 | 显示全部楼层
学习了  

话说兄弟你的mega16A搞定了吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-5 06:56:17 | 显示全部楼层
xigou 发表于 2012-11-4 22:53
学习了  

话说兄弟你的mega16A搞定了吗?

惭愧,仍在那还没动呢。
回复 支持 反对

使用道具 举报

发表于 2012-11-5 08:03:35 | 显示全部楼层
这个我想到一个用途,就是实现一个简易版本的“低温慢煮”烹饪加热器,最好和温度传感器结合,如果连上yeelink,可以做远程遥控的低温慢煮器了,上班时候把东西都准备好,回家前遥控开关,然后回家就能开吃了,节省很多时间
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 16:17 , Processed in 0.045636 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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