❶ 積分分離pid演算法與pid增量演算法有什麼不同
這個設置的時候要看具體環境,就像我們暖通里的PID控制就是根據經驗來,然後慢慢調,基本上一種系統的PID參數都差不多
❷ pid控制演算法的DSP程序設計與實現
typedef struct PID {
int SetPoint; // 設定目標 Desired value
int Proportion; // 比例常數 Proportional Const
int Integral; // 積分常數 Integral Const
int Derivative; // 微分常數 Derivative Const
unsigned int LastError; // Error[-1]
unsigned int PrevError; // Error[-2]
unsigned int SumError; // Sums of Errors
// double Lastout; //上次輸出
unsigned int E1; // e1>e2
unsigned int E2; //
int Pmax;//上限
int Pmin;//下限
} PID;
/*====================================================================================================
PID計算部分,遇限消弱積分PID防飽和,積分分離演算法實現
=====================================================================================================*/
int PIDCalc( PID *pp, unsigned int NextPoint )
{
int dError,
Error;
Error = pp->SetPoint - NextPoint; //偏差
if (Error<=-pp->E1) return (pp->Pmin); //飽和
else if (Error>=pp->E1)
return (pp->Pmax);
else
{
dError = pp->LastError - pp->PrevError; // 當前微分
pp->PrevError = pp->LastError;
pp->LastError = Error;
if (Error>=pp->E2||Error<=-pp->E2) //分離
return (pp->Proportion * Error // 比例項
+ pp->Derivative * dError );//PD,考慮限幅
else //位置式
{
pp->SumError += Error; // 積分
return (pp->Proportion * Error // 比例項
+ pp->Integral * pp->SumError // 積分項
+ pp->Derivative * dError // 微分項 //PID
);
}
}
}
❸ 如何用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
轉自他人程序。
❹ 積分分離PID演算法如何實現為什麼要引入積分分離PID演算法與常規PID演算法對比
摘要 我們已經講述了PID控制引入積分主要是為了消除靜差,提高控制精度。但在過程的啟動、結束或大幅度增減設定值時,短時間內系統輸出有很大偏差,會造成PID運算的積分累積,引起超調或者振盪。為了解決這一干擾,人們引入了積分分離的思想。其思路是偏差值較大時,取消積分作用,以免於超調量增大;而偏差值較小時,引入積分作用,以便消除靜差,提高控制精度。
❺ 遺傳演算法怎麼與pid控制器進行結合
pid控制有3個參數,不同的參數值對應不同的控制效果,所以這三個參數是輸入量。但是對於目標函數來說就比較復雜了,可以是系統響應,系統增益等,根據不同情況選用。
❻ 求解:PID經驗值 與Kp,Ki(Ki=Kp*T/Ti),Kd(Kd=Kp*Td/T)的關系
PID演算法是一種具有預見性的控制演算法,其核心思想是:
PID演算法不但考慮控制對象的當前狀態值(現在狀態),而且還考慮控制對象過去一段時間的狀態值(歷史狀態)和最近一段時間的狀態值變化(預期),由這3方面共同決定當前的輸出控制信號;
PID控制演算法的運算結果是一個數,利用這個數來控制被控對象在多種工作狀態(比如加熱器的多種功率,閥門的多種開度等)工作,一般輸出形式為PWM,基本上滿足了按需輸出控制信號,根據情況隨時改變輸出的目的。
(6)ds理論與pid演算法結合擴展閱讀:
PID也屬於電工電子類技術術語。PID是各進程的代號,每個進程有唯一的PID編號。它是進程運行時系統分配的,並不代表專門的進程。在運行時PID是不會改變標識符的,但是進程終止後PID標識符就會被系統回收,就可能會被繼
只要運行一程序,系統會自動分配一個標識。
是暫時唯一:進程中止後,這個號碼就會被回收,並可能被分配給另一個新進程。
只要沒有成功運行其他程序,這個PID會繼續分配給當前要運行的程序。
如果成功運行一個程序,然後再運行別的程序時,系統會自動分配另一個PID。
❼ PID演算法的介紹
在過程式控制制中,按偏差的比例(P)、積分(I)和微分(D)進行控制的PID控制器(亦稱PID調節器)是應用最為廣泛的一種自動控制器。它具有原理簡單,易於實現,適用面廣,控制參數相互獨立,參數的選定比較簡單等優點;而且在理論上可以證明,對於過程式控制制的典型對象──「一階滯後+純滯後」與「二階滯後+純滯後」的控制對象,PID控制器是一種最優控制。PID調節規律是連續系統動態品質校正的一種有效方法,它的參數整定方式簡便,結構改變靈活(PI、PD、…)。
❽ 怎樣才能將pid調節的理論知識應用到實際中變成編程語言
PID調節運行是指,閉環控制系統的控制器以PID演算法作為核心演算法進行調節運行。 PID演算法是非常常用的演算法,通過對誤差信號進行比例、積分、微分運算,得出控制器的輸出。 這種調節方式以其結構簡單、穩定性好、工作可靠、調整方便而成為工業控制的
❾ PID演算法中,積分時間、微分的時間和積分時間常數、微分時間常數之間是什麼關系
沒有關系。積分和微分里的t是真實的時刻。而時間常數只是待定系數,沒有具體的物理含義,之所以也是時間只是用來使得PID三項量綱相同,以便相加。
❿ PID控制演算法的含義是什麼數字PID演算法和連續PID演算法的區別是什麼(工業控制,製冷系統,計算機技術)
PID 是閉環控制系統的比例-積分-微分控制演算法。
PID 控制器根據設定值(給定)與被控對象的實際值(反饋)的差值,按照 PID 演算法
計算出控制器的輸出量,控制執行機構去影響被控對象的變化。
PID 控制是負反饋閉環控制,能夠抑制系統閉環內的各種因素所引起的擾動,使反饋
跟隨給定變化。
根據具體項目的控制要求,在實際應用中有可能用到其中的一部分,比如常用的是 PI
(比例-積分)控制,這時沒有微分控制部分。