在单片机实际控制中,有时候需要调节灯光亮度、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;
}
}
}
}编者能力有限,出现错误的地方烦请批评指正。
我要赚赏金
