|
本帖最后由 wasdpkj 于 2012-11-5 13:38 编辑
(很多朋友问这个电路有啥用,可以通过arduino稳定的、线性的控制电器市电电压,你说有什么用呢?)
本着共享的精神,还是发上来吧!让需要的人少走弯路
中间经历了挺多麻烦的,
先是两个PC817光耦烧掉了
再是买错了光耦(买成过零导通的MOC3041了,结果阴差阳错的实现了不用额外过零检测的功率调节)
最终,抽空买了MOC3021,终于搞定了电路
由于我是控制电灯,属于感性负载,所以在可控硅两级加了个RC稳定电路
过零检测部分,直接接应该也可以 ,但总觉得不太安全 ,我用了个220~18v的变压器
LED代表负载
原理图如下(最后的C1可根据电路稳定性调整或去掉)
先写了个测试程序,注释的很明白,自己定义两个按键就行了(我目前c语言很烂,如果哪位知道如何完美的把中断添加到主程序中,不被程序的延迟影响,请写出来分享吧!)
(现在程序延时到有的时候,灯还是会闪动,谁能帮忙看看是哪里的问题?)
- int zdpin=0; //中断0,对应引脚UNO的D2
- volatile int zt=LOW;
- int m=3000; //设置延时初始值,单位微秒
- int mx=5200; //设置延时最大值,单位微秒
- int mi=900; //设置延时最小值,单位微秒
- int x=0; //按键
- int y=0; //按键
-
- void setup ()
- {
- pinMode(11,OUTPUT); //光耦控制端
- pinMode(5,INPUT); //按键
- pinMode(6,INPUT); //按键
- attachInterrupt(zdpin,light,RISING); //过零检测的中断
- Serial.begin(9600);
- }
-
- void loop()
- {
- x=digitalRead(5); //读取按键状态,D6
- delayMicroseconds(100); //防抖
- y=digitalRead(6); //读取按键状态,D5
- delayMicroseconds(100); //防抖
-
- if (x==1) //最大延时累加,以及封顶
- {
- m=m+20;
- if (m>=mx)
- {
- m=mx;
- }
- }
- if (y==1)
- {
- m=m-20; //最小延时累减,以及封底
- if (m<=mi)
- {
- m=mi;
- }
- }
- digitalWrite(11,0); //默认低电位
-
- Serial.println(m);
- }
- void light()
- {
- delayMicroseconds(m); //过零检测延时
- digitalWrite(11,1); //控制光耦导通
- }
复制代码
关于过零检测和延时:市电是50hz的,半个周期也就是10ms,考虑到误差,本程序的延时大概控制在1~6ms之间
一旦检测到过零信号,就在设置的延时时间后,通过光耦发出一个触发电平,使得可控硅导通(导通到下个零点),因此实现了调压。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|