欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STC12C5A60S2單片機PID溫度調節程序
[打印本頁]
作者:
qqyy123232
時間:
2018-12-6 19:27
標題:
STC12C5A60S2單片機PID溫度調節程序
采用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 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
devcang
時間:
2018-12-31 21:58
不錯,不過少了lcd.c文件
作者:
jifengjianwu
時間:
2019-1-25 14:27
這個真挺好,先研究下。謝謝樓主
作者:
還有誰?
時間:
2019-2-10 16:54
devcang 發表于 2018-12-31 21:58
不錯,不過少了lcd.c文件
LCD就用不到吧,畢竟是很基礎的東西
作者:
xshzwx
時間:
2019-4-25 11:09
學習一下!
作者:
sungreatfriend
時間:
2019-4-29 15:11
不錯!比較簡單,好理解!
作者:
賈長安
時間:
2019-11-4 20:01
你真是個好家伙,謝謝分享!
作者:
賈長安
時間:
2019-11-4 20:02
感謝分享!
作者:
jovew
時間:
2019-12-4 20:43
初學者,最好還是文件完整,學習起來比較方便。希望補充完整
作者:
了好久那本書
時間:
2020-2-20 20:27
為什么if(pw<pid.out)就加熱,不然就停止加熱,這里不懂
作者:
zhangweiyu
時間:
2020-3-11 01:03
真不錯,謝謝了!
作者:
zhangweiyu
時間:
2020-3-13 22:41
不錯,好好學習一下
作者:
qwthh
時間:
2020-3-19 21:10
只有程序沒有電路圖嗎請問
作者:
c20160526
時間:
2020-3-20 07:07
學習了,51黑的資源有點少,希望大家多參與
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1