PID算法-温度控制
- MAO2021年5月29日 14:21 点击:1157
以下代码基于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******************************/
版权声明:本文为CSDN博主「neven_li」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/li13158/article/details/79697505
(本文来源:互联网)
如有侵权请联系删除
联系邮箱:kefu@labbase.net
版权与免责声明
- 凡本网注明“来源:来宝网”的所有作品,版权均属于来宝网,转载请必须注明来宝网, //www.next-search.com,违反者本网将追究相关法律责任。
- 本网转载并注明自其它来源的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品来源,并自负版权等法律责任。
- 如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。