在单片机实际控制中,有时候需要调节灯光亮度、PID调节,有时候需要控制220V交流电,使用相对较高电压,在工作时电流相对较小。
根据P=UI可得
I=P/U
例如,在我之前需要做一个恒温箱,结果买了一个12V加热器,200w,电流I = 200/12 = 16.67A这么大的电流,对电源、电线都是一个不小的挑战。
由
Q = I^2 * R * T
可知,发热量是电流的指数关系,减少电流就可以减少发热量
采用220V控制就可以很大的减小电流,I = P/U = 200/220 = 0.91 A升高电压就可以将电流降到原来的18倍 。那么就有了新的问题,这么解决PID控制方案呢?
对于3.3v单片机来说,220v就是一个高电压,一不小心就可能损坏单片机,应该采用光电隔离来保护单片机。
对于交流电的特性,应该采用双向光电耦合开关,我采用的是MOC3081,先看一下芯片推荐的电路原理图
3、5脚悬空,1、2脚为控制端,4、6脚为到通端
控制接线图如下
Rin选用330的限流电阻,在刚开始测试的时候,将1、2脚直接通5v电,直接将MOC损坏,建议在使用不熟悉的芯片时,注意阅读芯片手册。
由于要测试实际的控制能力,在五金商店购买灯泡一个,用于测试
在测试时发现,在单片机输出一个方波信号,灯泡的亮度忽明忽暗,但是可以初步看出灯泡是受控制的。
控制效果不是很理想,为了验证控制的波形,用脉冲发生器模拟220v波形
测得实际输出波形如下
由于在灯泡控制中,频率过高,导致波形凌乱,出现灯光不稳定闪烁。测试代码如下
#include <reg52.h> //11.0592 sbit led=P1^0; //定义一个引脚 sbit s1 = P3^0; sbit s4 = P3^3; bit jia,jian; unsigned int count,count1; //按键调节占空比 void key() { if(s1==0) { delay(10); if(s1==0) { count1+=5; } while(!s1); } if(s4==0) { delay(10); if(s4==0) { count1-=5; } while(!s4); } } //主函数 void main() { unsigned int flag; count=1130; count1=556; flag = count; while(1) { key(); for(flag=count;flag>0;flag--) { if(flag>=count1) { led=0; } else { led=1; } } } }
编者能力有限,出现错误的地方烦请批评指正。