PID算法-温度控制
生活随笔
收集整理的這篇文章主要介紹了
PID算法-温度控制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以下代碼基于STM32
PID溫度算法_PWM控制
?/**? ******************************************************************************
? ******************************************************************************
? */?
#include "bsp_lm35d.h"
extern __IO uint16_t ADC_ConvertedValue;
PID_Float mPIDstruct;
/*
?* 函數名:TempratureCtrl_GPIO_Config
?* 描述 ?:配置溫度控制用到的I/O口
?* 輸入 ?:無
?* 輸出 ?:無
?*/
void TempratureCtrl_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(TEMPCTRL_CLK,ENABLE);
/* DS18B20 GPIO config */
/* Configure DS18B20 Dout (PA.0) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = TEMPCTRL_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(TEMPCTRL_PORT, &GPIO_InitStructure);
//設置初始狀態拉高
GPIO_SetBits(TEMPCTRL_PORT, TEMPCTRL_PIN);
}
/*
?* 溫度范圍0-100℃,電壓每提高10mV溫度升高1攝氏度
?*?
?* 溫度 = ADC_ConvertedValue/4096*3.3v/(10/1000)v*1 = ADC_ConvertedValue * 0.08056640625
?*/
float LM35D_Get_Temp(void)
{
return (ADC_ConvertedValue * 0.08056640625);
}
/********************************************************************?
函 數 名:void Init_PID_uint(PID_uint *p)
功 ? ?能:初始化PID參數
說 ? ?明:調用本函數之前,應該先對Kp,Ti,Td做設置 ? ? ? ?,簡化了公式 ?
入口參數:PID單元的參數結構體 地址
返 回 值:無
***********************************************************************/
void Init_PID_uint(PID_Float *p)
{
? ? ? ? p->k1=(p->Kp)+(p->Kp)*1024.0/(p->Ti)+(p->Kp)*(p->Td)/1024.0;
? ? ? ? p->k2=(p->Kp)+2*(p->Kp)*(p->Td)/1024.0;
? ? ? ? p->k3=(p->Kp)*(p->Td)/1024.0;
}
/********************************************************************?
函 數 名:void reset_Uk(PID_Uint *p)
功 ? ?能:初始化U_kk,ekk,ekkk
說 ? ?明:在初始化時調用,改變PID參數時有可能需要調用 ? ? ?
入口參數:PID單元的參數結構體 地址
返 回 值:無
***********************************************************************/
void reset_Uk(PID_Float *p)
{
? ? ? ? p->U_kk=0;
? ? ? ? p->ekk=0;
? ? ? ? p->ekkk=0;
}
/********************************************************************?
函 數 名:void SetPIDProperty(float ur,float kp,float ti,float td,float un,PID_Float *p)
功 ? ?能:初始化U_kk,ekk,ekkk
說 ? ?明:在初始化時調用,改變PID參數時有可能需要調用
入口參數:PID單元的參數結構體 地址
返 回 值:無
***********************************************************************/
void SetPIDProperty(float ur,float kp,float ti,float td,float un)
{
mPIDstruct.Ur = ur;//限幅輸出值
mPIDstruct.Kp = kp;//比例,從小往大調
mPIDstruct.Ti = ti;//積分,從大往小調
mPIDstruct.Td = td;//微分
mPIDstruct.Un = un;//不靈敏區?
reset_Uk(&mPIDstruct);
Init_PID_uint(&mPIDstruct);
}
/********************************************************************?
函 數 名:int PID_commen(int set,int jiance,PID_Uint *p)
功 ? ?能:通用PID函數
說 ? ?明:求任意單個PID的控制量
入口參數:期望值,實測值,PID單元結構體
返 回 值:PID控制量
***********************************************************************/
float PID_common(float set,float jiance)
{
float ek,U_k=0;
ek = set - jiance;
if((ek>(mPIDstruct.Un))||(ek<-(mPIDstruct.Un))) ? ? ? ? ? ? ? ?//積分不靈敏區
U_k=(mPIDstruct.U_kk)+(mPIDstruct.k1)*ek-(mPIDstruct.k2)*(mPIDstruct.ekk)+(mPIDstruct.k3)*(mPIDstruct.ekkk);
if(U_k>(mPIDstruct.Ur)) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//限制最大輸出量,
U_k=mPIDstruct.Ur;
if(U_k<-(mPIDstruct.Ur))
U_k=-(mPIDstruct.Ur); ??
mPIDstruct.U_kk=U_k;
#ifdef __DEBUG_XB__
printf("mPIDstruct.U_kk = %f\r\n",mPIDstruct.U_kk);
#endif
mPIDstruct.ekkk=mPIDstruct.ekk;
mPIDstruct.ekk=ek;
? ? ?
return U_k/1024.0;?
}
void TempratureCtrl_Init(void)
{
if(savedata.TempraSet < 20.0 || savedata.TempraSet > 50.0) savedata.TempraSet = 37.5;
SetPIDProperty(10000.0,0.5,0.15,5.15,0.2); //配置溫度控制PID算法參數
}
/********************************************************************?
函 數 名:float TempFilter(float prev,float current)
功 ? ?能:簡單的濾波
說 ? ?明:
入口參數:prev 上一次的濾波結果 current 當前檢測值
返 回 值:通過濾波后的值
***********************************************************************/
float TempFilter(float prev,float current)
{
return (current - 0.2*(current - prev));
}
/*************************************END OF FILE******************************/
總結
以上是生活随笔為你收集整理的PID算法-温度控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CC2541对AT24CXX系列存储器的
- 下一篇: MFRC522开发笔记