采用DS18B20采集溫度,電熱絲加熱。或者是專用模塊。
單片機源程序如下:
- #include "pid.h"
- PID pid; //存放PID算法所需要的數據
- void PID_Calc() //pid計算
- {
- float DelEk;
- float ti,ki;
- float td;
- float kd;
- float out;
- if(pid.C1ms<(pid.T/10)) //計算周期未到
- {
- return ;
- }
-
- pid.Ek=pid.Sv-pid.Pv; //得到當前的偏差值
- pid.Pout=pid.Kp*pid.Ek; //比例輸出
-
- pid.SEk+=pid.Ek; //歷史偏差總和
-
- DelEk=pid.Ek-pid.Ek_1; //最近兩次偏差之差
-
- ti=pid.T/pid.Ti;
- ki=ti*pid.Kp;
-
- pid.Iout=ki*pid.SEk;//*pid.Kp; //積分輸出
- td=pid.Td/pid.T;
- kd=pid.Kp*td;
-
- pid.Dout=kd*DelEk; //微分輸出
-
- out= pid.Pout+ pid.Iout+ pid.Dout;
-
- //////////////////////////////////////////////////////////
-
- if(out>pid.pwmcycle)
- {
- pid.OUT=pid.pwmcycle;
- }
- else if(out<0)
- {
- pid.OUT=pid.OUT0;
- }
- else
- {
- pid.OUT=out;
- }
- pid.Ek_1=pid.Ek; //更新偏差
-
- pid.C1ms=0;
- }
- /*====================================
- 初始化 PID 函數
- =================================*/
- void PID_Init()
- {
- pid.Sv=40;//用戶設定溫度
- pid.Kp=30;
- pid.T=1000;//PID計算周期
- pid.Ti=500000;//積分時間
- pid.Td=1000;//微分時間
- pid.pwmcycle=200;//pwm周期1000
- pid.OUT0=10;
- }
復制代碼
主程序:
- #include "DS18B20.h"
- #include "pid.h"
- #include "LCD.H"
- sbit pwmout=P1^5; //PWM輸出口,此口可任意設定
- sbit wela=P2^7;
- sbit dula=P2^6;
- uchar count; //占空比最小單位,也是以后的計數值
- void PID_out() //輸出PID運算結果到負載---每1ms被調用1次
- {
- static u16 pw;
- pw++;
- if(pw>=pid.pwmcycle) //
- {
- pw=0;
- }
- //0 ~ pid.pwmcycle-1
-
- if(pw<pid.OUT)
- {
- pwmout=0;//加熱
- }
- else
- {
- pwmout=1;//停止加熱
- }
-
- }
- void init()
- {
- TMOD=0x11;
- TH1=(65536-9174)/256; //65526/256 這兩句記錄1個脈沖,即10毫秒產生一個中斷
- TL1=(65536-9174)%256; //65526%256
- TH0=(65536-9174)/256; //65526/256 這兩句記錄500個脈沖,即10m秒產生一個中斷
- TL0=(65536-9174)%256; //65526%256
- EA=1; //開總中斷
- ET0=1; //開定時器0中斷
- ET1=1; //開定時器1中斷
- pwmout=0; //先置輸出口為低電平
- TR0=1; //以上設置完畢后,最后開啟定時器0
- TR1=1; //以上設置完畢后,最后開啟定時器1
- }
- void tim0() interrupt 1 //定時器0中斷函數
- {
- TH0=(65536-9174)/256;
- TL0=(65536-9174)%256;
- pid.C1ms++;
- PID_Calc();
-
- }
- /**/
- void tim1() interrupt 3 //定時器0中斷函數
- {
- TH1=(65536-9174)/256;
- TL1=(65536-9174)%256;
- PID_out();
- }
- void main()
- {
- uint i;
- uchar datas1[]={0,0,0};
- wela=0;
- dula=0;
- delay(2);
- lcd_init();
- PID_Init();
- init();
- /* ds_init( );//初始化DS18B20
- write_byte(0xcc);//發送跳躍ROM指令
- write_byte(0x4e);//寫暫存器指令
- write_byte(0x7f);
- write_byte(0xf7);
- write_byte(0x1f);//配置工作在9位模式下
- ds_init();//初始化DS18B20
- write_byte(0xcc);//發送跳躍ROM指令
- write_byte(0x48); */
- while(1)
- {
- datas1[2]=(int)pid.OUT%1000/100;
- datas1[3]=(int)pid.OUT%100/10;
- datas1[4]=(int)pid.OUT%10;
- lcd_pos(2,0);
- for(i=2;i<5;i++)
- write_dat(0x30+datas1[i]);
- if(pid.C1ms>(pid.T/11))
- {
- Display_temp();
- }
- }
- }
復制代碼
所有資料51hei提供下載:
PID溫度控制.zip
(50.08 KB, 下載次數: 335)
2018-12-6 19:26 上傳
點擊文件名下載附件
|