|
原創開源
此電路和程序已經過實際測試,性能穩定,我用的是6A的制冷片,沒有啥問題哈,IRF530稍微有些暖而已。
電源:LM2596
CPU:STM8S103K3T6(內部16MHz RC)
測溫裝置:DS18B20
制冷片驅動電路:PC923+IRF530
編譯環境:IAR FOR STM8 V1.3
程序框架:500ms時間片
控制算法:PWM的增量式PID(參考論壇上的資料)
原理圖
145747blsbqqsszrk1nsml.jpg (57.29 KB, 下載次數: 260)
下載附件
2014-12-21 01:46 上傳
單片機源程序如下:
- #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)
2014-12-21 01:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|