这几天写了个温控程序,调试效果还不错,大体思路是:主循环每隔1秒钟探测一下温度并根据温度调整加热占空比,然后定时器中断里根据占空比来控制加热丝的开关。欢迎指正。
具体程序如下:
中断函数中根据占空比开关加热丝和风扇:
void ISR_T1(void)interrupt 3
{
//定时器重载,每50ms一次定时器中断
TH1=T1THint;
TL1=T1TLint;
if(Counter_50ms==20){
Counter_50ms=0;
else {
Counter_50ms++;
}
if(HeatPeriod>=20) //占空比周期1秒
{
HeatPeriod=0;
}
else
{
HeatPeriod++;
if(HeatPeriod<HeatDutyRatio)
{
发热=开启;
散热风扇=关闭;
}
else
{
发热=关闭;
if(NeedTurnOnFan==1) 散热风扇=开启;
else 散热风扇=关闭;
}
}
}
占空比调整函数,把当前温度和目标温度的差值分几个档,每个档不同的空比,如有需要,还可以添加根据温升速度来微调每个档的占空比,目前效果不错,就没搞
void HeatDutyRatioSet(void)
{
PresentTemperatureValue=DS18B20();
if(TargetTemperatureValue>PresentTemperatureValue)
{
NeedTurnOnFan=0;
if((TargetTemperatureValue-PresentTemperatureValue)>10)
{
HeatDutyRatio=20;
}
else
if((TargetTemperatureValue-PresentTemperatureValue)>8)
{
HeatDutyRatio=18;
}
else
if((TargetTemperatureValue-PresentTemperatureValue)>5)
{
HeatDutyRatio=16;
}
else
if((TargetTemperatureValue-PresentTemperatureValue)>2)
{
HeatDutyRatio=15;
}
else
if((TargetTemperatureValue-PresentTemperatureValue)>1)
{
HeatDutyRatio=13;
}
else
if((TargetTemperatureValue-PresentTemperatureValue)==1)
{
HeatDutyRatio=10;
}
}
else if(TargetTemperatureValue==PresentTemperatureValue)
{
HeatDutyRatio=6;
}
else
{
HeatDutyRatio=0;
if((PresentTemperatureValue-TargetTemperatureValue)>16)//超温1度开始开启散热风扇
{ NeedTurnOnFan=1;}
else NeedTurnOnFan=0;
}
}
主函数每隔一秒调用占空比函数
void main(void)
{
...
...
if(HeatPeriod==0)//每隔1秒调整占空比
{
HeatPeriod++;
HeatDutyRatioSet();
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
五点控制,分为正大、正中、死区、负中、负大 在每个状态采用不同的脉宽或电流来控制,就达到了快速稳定的控制,9点和这个类似,只是增加了几个点,更加精细。
一周热门 更多>