Ⅰ 如何用PID演算法編程,使單片機通過控制繼電器來實現恆溫功能。
/***********************************************************************
PID溫度控製程序
程序說明:
系統上電後顯示 「--溫度」
表示需要先設定溫度才開始進行溫度檢測
溫度設定完畢後程序才開始進行PID溫控
***********************************************************************/
#include <reg52.h>
#include <absacc.h>
#include"DS18B20.H"
#include"PID.H"
#define uchar unsigned char
#define uint unsigned int
unsigned char code tab[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF
}
;
/*個位0~9的數碼管段碼*/
unsigned char code sao[]=
{
0x7f,0xbf,0xdf,0xef
}
;
//掃描碼
uchar set=30,keyflag=1 ; //set初始化為30° keyflag為進入溫度設定的標志位
//4個按鍵使用說明
sbit key_out=P1^0 ; //用於溫度設定後的退出
sbit key_up=P1^1 ; //設定溫度加
sbit key_down=P1^2 ; //設定溫度減
sbit key_in=P1^3 ; //在程序的運行中如需要重新設定溫度 按下此鍵才能進入設置模式並且此時是停在溫度控制的,按下key_out鍵後才表示設定完畢
void Show_key();
/***********************************************************/
void delays(unsigned char k)
{
unsigned char i,j ;
for(i=0;i<k;i++)
for(j=0;j<50;j++);
}
/*********************************************************
//數碼管顯示函數
P0口 作為數據口
P2口的低四位作為掃描口
變數 x表示掃描
d表示是否要加小數點 為1是 為0不加
y表示傳遞的數值
*********************************************************/
LCD_disp_char(uchar x,bit d,uchar y)
{
P2=0XFF ;
P0=0xFF ;
if(d==0)
P0=tab[y];
else
P0=tab[y]&0x7f ; //與上0x7f表示是否要加小數點
P2=sao[x]; //打開掃描端號
}
/*********************************************************
按鍵掃描
*********************************************************/
void keyscan(void)
{
if(key_in==0) //按鍵進入函數
{
delays(10); //延時消抖 (以下同)
if(key_in==0)
{
while(key_in==0)
{
Show_key(); //如果一直按著鍵不放 就一直顯示在當前狀態 (以下同)
}
keyflag=1 ; //按鍵標志位
}
}
/***********************/
if(key_out==0) //按鍵退出
{
delays(10);
if(key_out==0)
{
while(key_out==0)
{
Show_key();
}
keyflag=0 ;
set_temper=set ;
}
}
/*************************/
if(key_up==0) //設定溫度的加
{
delays(10);
if(key_up==0)
{
while(key_up==0)
{
Show_key();
}
if(keyflag==1)
{
set++;
if(set>90) //如果大於90°就不在加
set=90 ;
}
}
}
/*************************/
if(key_down==0) //溫度設定的減
{
delays(10);
if(key_down==0)
{
while(key_down==0)
{
Show_key();
}
if(keyflag==1)
{
set--;
if(set<30) //溫度減到30°時不在往下減
set=30 ;
}
}
}
}
/*********************************************************************
按鍵按下時的顯示函數
***********************************************************************/
void Show_key()
{
output=1 ;
LCD_disp_char(3,0,10); //顯示 -
delays(3);
LCD_disp_char(2,0,10); //顯示- (表示溫度設定 )
delays(3);
LCD_disp_char(1,0,set/10); //顯示溫度十位
delays(3);
LCD_disp_char(0,0,set%10); //顯示溫度個位
delays(3);
}
/*****************************************************************/
void main()
{
unsigned int tmp ;//聲明溫度中間變數
unsigned char counter=0 ;
PIDBEGIN(); //PID參數的初始化
output=1 ; //關閉繼電器輸出
while(1)
{
keyscan();
if(keyflag)
{
Show_key(); //顯示溫度設定
}
else
{
if(counter--==0)
{
tmp=ReadTemperature();//每隔一段時間讀取溫度值
counter=20 ;
}
LCD_disp_char(3,0,tmp/1000); //顯示溫度十位
delays(3);
LCD_disp_char(2,1,tmp/100%10); //顯示溫度個位
//顯示小數點
delays(3);
LCD_disp_char(1,0,tmp/10%10); //顯示溫度小數後一位
delays(3);
LCD_disp_char(0,0,tmp%10);//顯示溫度小數後二位
delays(3);
P2=0XFF ;
P0=0xff ;
compare_temper(); //比較溫度
}
}
}
/**********************************************************************************************************************************************/
//PID演算法溫控C語言2008-08-17 18:58
#ifndef _PID_H__
#define _PID_H__
#include<intrins.h>
#include<math.h>
#include<string.h>
struct PID
{
unsigned int SetPoint ;
// 設定目標 Desired Value
unsigned int Proportion ;
// 比例常數 Proportional Const
unsigned int Integral ;
// 積分常數 Integral Const
unsigned int Derivative ;
// 微分常數 Derivative Const
unsigned int LastError ;
// Error[-1]
unsigned int PrevError ;
// Error[-2]
unsigned int SumError ;
// Sums of Errors
}
;
struct PID spid ;
// PID Control Structure
unsigned int rout ;
// PID Response (Output)
unsigned int rin ;
// PID Feedback (Input)
sbit output=P1^4;
unsigned char high_time,low_time,count=0 ;
//占空比調節參數
unsigned char set_temper ;
void PIDInit(struct PID*pp)
{
memset(pp,0,sizeof(struct PID)); //PID參數初始化全部設置為0
}
unsigned int PIDCalc(struct PID*pp,unsigned int NextPoint)
{
unsigned int dError,Error ;
Error=pp->SetPoint-NextPoint ;
// 偏差
pp->SumError+=Error ;
// 積分
dError=pp->LastError-pp->PrevError ;
// 當前微分
pp->PrevError=pp->LastError ;
pp->LastError=Error ;
//比例
//積分項
return(pp->Proportion*Error+pp->Integral*pp->SumError+pp->Derivative*dError);
// 微分項
}
/***********************************************************
溫度比較處理子程序
***********************************************************/
void compare_temper()
{
unsigned char i ;
//EA=0;
if(set_temper>temper)
{
if(set_temper-temper>1)
{
high_time=100 ; //大於1°不進行PID運算
low_time=0 ;
}
else
{ //在1°范圍內進行PID運算
for(i=0;i<10;i++)
{
//get_temper();
rin=s;
// Read Input
rout=PIDCalc(&spid,rin); //執行PID運算
// Perform PID Interation
}
if(high_time<=100) //限制最大值
high_time=(unsigned char)(rout/800);
else
high_time=100;
low_time=(100-high_time);
}
}
/****************************************/
else if(set_temper<=temper) //當實際溫度大於設置溫度時
{
if(temper-set_temper>0)//如果實際溫度大於設定溫度
{
high_time=0 ;
low_time=100 ;
}
else
{
for(i=0;i<10;i++)
{
//get_temper();
rin=s ;
// Read Input
rout=PIDCalc(&spid,rin);
// Perform PID Interation
}
if(high_time<100) //此變數是無符號字元型
high_time=(unsigned char)(rout/10000);
else
high_time=0 ;//限制不輸出負值
low_time=(100-high_time);
//EA=1;
}
}
}
/*****************************************************
T0中斷服務子程序,用於控制電平的翻轉 ,40us*100=4ms周期
******************************************************/
void serve_T0()interrupt 1 using 1
{
if(++count<=(high_time))
output=0 ;
else if(count<=100)
{
output=1 ;
}
else
count=0 ;
TH0=0x2f ;
TL0=0xe0 ;
}
void PIDBEGIN()
{
TMOD=0x01 ;
TH0=0x2f ;
TL0=0x40 ;
EA=1 ;
ET0=1 ;
TR0=1 ;
high_time=50 ;
low_time=50 ;
PIDInit(&spid);
// Initialize Structure
spid.Proportion=10 ;
// Set PID Coefficients
spid.Integral=8 ;
spid.Derivative=6 ;
spid.SetPoint=100 ;
// Set PID Setpoint
}
#endif
轉自他人程序。
Ⅱ 基於單片機的恆溫控制系統
我剛幫別人做了一個,是按這個要求做的,你可以提出任意修改要求。
程序是匯編的,已經調試通過。
ProteUS模擬文件下載地址:
推薦:70電加熱PRE.rar( http://ishare.iask.sina.com.cn/f/7033603.html )
; 設計基於單片計算機的溫度控制器。用於控制電加熱爐的溫度。具體要求如下:
; 1. 溫度連續可調,范圍為30℃~150℃
; 2. 超調量σ%≤20%
; 3. 溫度誤差≤±0.5℃
; 4. 人-機對話方便
; 5. 控制演算法採用PID或改進的PID或其他演算法.
; (我用的是AT89C52的單片機:
; A.電加熱爐經由溫度感測器測量後,
; 通過V/F變換器的模數轉換,
; 將電壓或電流量轉換為數字信號進入單片機內,
; 然後通過移位寄存器和解碼器的信息轉換,
; 通過顯示驅動器來進行LED數碼管的溫度顯示;
; B.單片機也通過雙向可控硅來控制爐內的溫度;
; C.用戶通過按鍵來設置溫度上限、下限值)
Ⅲ 怎樣用PID演算法對恆溫箱的溫度進行控制,求相關的51單片機匯編程序
本設計要求:本溫度控制系統為以單片機為核心,實現了對溫度實時監測和控制,實現了控制的智能化。設計恆溫箱溫度控制系統,配有溫度感測器,採用DS18B20數字溫度感測器,無需數模擬∕數字轉換,可直接與單片機進行數字傳輸,採用了PID控制技術,可以使溫度保持在要求的一個恆定范圍內,配有鍵盤,用於輸入設定溫度;配有數碼管LED用來顯示溫度。
技術參數和設計任務:
1、利用單片機AT89C2051實現對溫度的控制,實現保持恆溫箱在最高溫度為110℃。
2、可預置恆溫箱溫度,烘乾過程恆溫控制,溫度控制誤差小於±2℃。
3、預置時顯示設定溫度,恆溫時顯示實時溫度,採用PID控制演算法顯示精確到0.1℃。
4、溫度超出預置溫度±5℃時發出聲音報警。
5、對升、降溫過程沒有線性要求。
6、溫度檢測部分採用DS18B20數字溫度感測器,無需數模擬∕數字轉換,可直接與單片機進行數字傳輸
7、人機對話部分由鍵盤、顯示和報警三部分組成,實現對溫度的顯示、報警。
需要的話聯系用戶名扣扣
Ⅳ 利用單片機製作一個可調節的恆溫裝置,有人能給一些思路嗎
一個溫度感測器,一套驅動電路,一套加熱裝置(如電阻絲)。
溫度感測器一般輸出的是電壓信號,接入單片機的AD管腳。
驅動電路驅動加熱裝置,一般接上單片機的PWM輸出管腳。
單片機採到溫度感測器的信號,將其轉化為具體的溫度值,然後依據溫度值可以採用PID來調節PWM波來驅動加熱器。
Ⅳ 基於單片機恆溫箱控制系統
只有圖,沒有程序。從圖來看,埠配置不好,單一功能要充分利用埠,原則上P0口作為段嗎,這里,如果作為位碼的話可以節省一級驅動,應為P0口的驅動能力較強,極力推鑒1051-4051(埠驅動20mA),降低硬體成本,減少軟體編程量。這里有一個模擬器帶的溫度顯示程序。你參考一下,如果加上控制,在程序合適位置加入判斷語句如if(****,P1.x=?),再配置一個輸出埠,就行了。程序如下,附模擬圖。
#include<reg52.h>
#include<intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitDATA=P1^0;//DS18B20接入口
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
char,shi,ge;//定義變數
/*延時子函數*/
voiddelay(uintnum)
{
while(num--);
}
/*************DS18b20溫度感測器函數*********************/
voidInit_DS18B20(void) //感測器初始化
{
ucharx=0;
DATA=1; //DQ復位
delay(10); //稍做延時
DATA=0; //單片機將DQ拉低
delay(80); //精確延時大於480us//450
DATA=1; //拉高匯流排
delay(20);
x=DATA; //稍做延時後如果x=0則初始化成功x=1則初始化失敗
delay(30);
}
//讀一個位元組
ReadOneChar(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DATA=0;//給脈沖信號
dat>>=1;
DATA=1;//給脈沖信號
if(DATA)
dat|=0x80;
delay(8);
}
return(dat);
}
//寫一個位元組
voidWriteOneChar(unsignedchardat)
{
uchari=0;
for(i=8;i>0;i--)
{
DATA=0;
DATA=dat&0x01;
delay(10);
DATA=1;
dat>>=1;
}
delay(8);
}
//讀取溫度
intReadTemperature(void)
{
uchara=0;
ucharb=0;
intt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳過讀序號列號的操作
WriteOneChar(0x44);//啟動溫度轉換
Init_DS18B20();
WriteOneChar(0xCC);//跳過讀序號列號的操作
WriteOneChar(0xBE);//讀取溫度寄存器等(共可讀9個寄存器)前兩個就是溫度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
t=b;
t<<=8;
t=t|a; //得到溫度值的各個位的值
t=t*0.0625; //得到實際的溫度值
return(t);
}
/*顯示子函數*/
voiddisplay(int,intshi,intge)
{
P0=0xff; //對數碼管清零,防止串擾
P2=0xfb;
P0=table[]; //顯示百位
delay(50); //一小段延時動態顯示
P0=0xff; //對數碼管清零,防止串擾
P2=0xf7;
P0=table[shi]; //顯示十位
delay(50);
P0=0xff;
P2=0xef;
P0=table[ge]&0x7f; //顯示個位
delay(100);
P0=0xff;
P2=0xdf;
P0=table[0]; //顯示小數位,這里沒有處理小數位,默認的為0
delay(50);
}
voidmain()
{
inttemp;
while(1)
{
temp=ReadTemperature(); //讀溫度
=temp/100; //獲取百位
shi=temp%100/10; //獲取十位
ge=temp%10; //獲取個位
display(,shi,ge); //顯示函數
}
}
Ⅵ 基於單片機的熱水器溫度控制系統
東華理工大學畢業設計(論文)
基於單片機的熱水器溫度控制
摘 要
溫度是日常生活中不可缺少的物理量,溫度在各個領域都有積極的意義。很多行業中以及日常生活中都有大量的用電加熱設備,如用於加熱處理的加熱熱水器,用於洗浴的電熱水器及各種不同用途的溫度箱等,採用單片機對它們進行控制具有控制方便、簡單、靈活性大等特點,而且還可以大幅提高被控系統的性能,從而能被大大提高產品的質量。因此,智能化溫度控制技術正被廣泛地應用。
本溫度設計採用現在流行的AT89C51單片機為控制器,用PID控制方法,再配以其他電路對熱水器的水溫進行控制。
關鍵詞:89C51; PID; 溫度控制
I
1/41頁
東華理工大學畢業設計(論文)
ABSTRACT
Temperature is essential physical in daily life ,and in various fields has positive implications.A lot of businesses and daily lives have a lot of electric heating equipment.Such as electric water heater for bathing and variety of different uses of the temperature boxes. MCU to control them with easy to control,simple,flexibility and other characteristics,also can significantly improve the performance of the controlled system,which can be greatly improved proct quality. Therefore,intelligent temperature control technology is being widely used.
The temperature control design uses the now popular AT89C51 MCU controller,with PID control method, which together with