|
原创开源
此电路和程序已经过实际测试,性能稳定,我用的是6A的制冷片,没有啥问题哈,IRF530稍微有些暖而已。
电源:LM2596
CPU:STM8S103K3T6(内部16MHz RC)
测温装置:DS18B20
制冷片驱动电路:PC923+IRF530
编译环境:IAR FOR STM8 V1.3
程序框架:500ms时间片
控制算法:PWM的增量式PID(参考论坛上的资料)
原理图
单片机源程序如下:
- #include "PID.h"
- int tempset,tempnow,tempctrl; //温度设置,现在温度,温度控制量
- int PID_Init(void)
- {
- int DisTemp;
- DisTemp = EEPROM_Read(0);
- if(DisTemp >= 127) DisTemp = -1 - (0xFF - DisTemp);
- if(DisTemp < -20)DisTemp = -20;
- else if(DisTemp > 40)DisTemp = 40;
- tempset = DisTemp*10; //将温度值转换为PID值;
- return DisTemp;
- }
- unsigned int DOPID(void)
- {
- static int err = 0,err1 = 0,err2 = 0; //本次、上次、上上次误差
- signed int add; //增量
- tempnow = ReadTemperature(); //获取温度值
- err = tempset*10 - tempnow; // 比设定值高出0.5℃
- if(err >= 100)
- {
- tempctrl = 5400; //全速升温
- }
- else if(err <= -100)
- {
- tempctrl = 100; //全速降温
- }
- else
- {
- add = KP*(err - err1) + KI*err + KD*(err - 2*err1 + err2); //计算增量
- tempctrl = tempctrl + add;
- }
- if(tempctrl > 5400) // 0x1D45 / 2= 3746
- {
- tempctrl = 5400; //限幅
- }
- if(tempctrl < 100)
- {
- tempctrl = 100;
- }
- err2 = err1; //保存误差
- err1 = err;
- return tempctrl;
- }
- void CtrlTemp(void)
- {
- static unsigned int PWM_Value = 0;
- PWM_Value = DOPID();
- //PWM_Timet1(5400);
- PWM_Timet1(PWM_Value);
- }
复制代码
本人初学,仅供参考,如有错误,请大家回帖多多指教,代码工程下载:
程序 原理图.zip
(712.49 KB, 下载次数: 460)
|
评分
-
查看全部评分
|