分享一个温控程序
这几天写了个温控程序,调试效果还不错,大体思路是:主循环每隔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();
}
} {:smile:}谢谢分享 {:smile:}{:smile:} powermeter 发表于 2016-11-17 11:59
谢谢分享
客气哈,欢迎指正 qaya 发表于 2016-11-17 13:02
客气哈,欢迎指正
学习了,谢谢。 收藏一下
{:victory:} 不错正想搞个 焊台 空了看看 可以用表格不,这么多的条件判断看着好头晕 本帖最后由 qaya 于 2016-11-18 11:25 编辑
mcu5i51 发表于 2016-11-18 09:13
可以用表格不,这么多的条件判断看着好头晕
其实这些条件判断就是一句话:根据当前温度和目标温度的差值来设定不同的占空比,当前温度越接近目标温度的时候占空比就越小。达到目标温度后就用最小的占空比维持温度,超过目标温度一定程度就开风扇散热。
不用细看这些条件判断的,需根据具体的应用来调整这些判断的。 mark一下 不错,要好好学习下,以前曾想出这个办法,但没能用C写出来。 这仅仅是种想法,应该实际测试才能ok,相当于PID的P吧 qd118118 发表于 2016-11-18 15:07
这仅仅是种想法,应该实际测试才能ok,相当于PID的P吧
看帖不仔细 qaya 发表于 2016-11-18 15:40
看帖不仔细
不好意思,如现场环境温度气流等有变化,可能较难满足温控要求,一般用PID可靠些 qd118118 发表于 2016-11-18 21:24
不好意思,如现场环境温度气流等有变化,可能较难满足温控要求,一般用PID可靠些 ...
这个方法确实比PID简单,可以说是优点也可以说是缺点,看具体应用。 可以尝试用PID再写一次 谢谢分享 谢谢分享,学习。 if条件的语句过多,可以采用SWITCH语句,而且楼主的写代码风格要注意一下。 谢谢分享 谢谢分享{:lol:} 本帖最后由 qaya 于 2016-12-5 10:58 编辑
wxdn 发表于 2016-11-21 11:53
看来撸主是个新手,这么多的判断可以用switch语句的,搞这么多的if else,好累,还有就是,这种程序没有PID ...
确实用SWITCH语句会清晰很多,不过您说这个程序没有考虑过冲就不对了吧?随着接近目标温度,占空比不断减小,就是防止过冲啊 qaya 发表于 2016-12-5 10:57
确实用SWITCH语句会清晰很多,不过您说这个程序没有考虑过冲就不对了吧?随着接近目标温度,占空比不断减 ...
这个程序类似的5点控制法,或者9点控制法,西门子工业上的产品有使用。 我估计在一定范围内,那个风扇打开的机会都很少。。 河图洛书 发表于 2016-12-19 13:12
这个程序类似的5点控制法,或者9点控制法,西门子工业上的产品有使用。
没有了解过,请详细说说 minicatcatcn 发表于 2016-12-19 14:31
我估计在一定范围内,那个风扇打开的机会都很少。。
可以说基本上没有启动过,风扇是防止温度万一过冲而设置的,实际测试发现没有过冲的情况出现 qaya 发表于 2016-12-20 09:41
可以说基本上没有启动过,风扇是防止温度万一过冲而设置的,实际测试发现没有过冲的情况出现 ...
五点控制,分为正大、正中、死区、负中、负大在每个状态采用不同的脉宽或电流来控制,就达到了快速稳定的控制,9点和这个类似,只是增加了几个点,更加精细。 有谁能分享一个PID的控温程序吗? 河图洛书 发表于 2016-12-20 10:03
五点控制,分为正大、正中、死区、负中、负大在每个状态采用不同的脉宽或电流来控制,就达到了快速稳定 ...
明白了,差不多的道理了 谢谢楼主分享
页:
[1]