PID.h文件:
/*************************************************************************
作者:
文件包含:# include "PID.h"
文件名称:PID.h
程序功能:变比例系数PID算法;
编写时间:
修改时间:
测试单片机型号:msp430f149
说明:使用此算法前需先将控制系数0、1、2离线算好;
注意:此文件中所有涉及的常量均为放大100倍后的数字量(除已标记的常量);
*************************************************************************/
# ifndef _PID_H_
# define _PID_H_
/*************************************************************************
软件定义
*************************************************************************/
# define uchar unsigned char
# define uint unsigned int
/*************************************************************************
常量定义
*************************************************************************/
# define KP 1 //比例增益;
# define KI 1 //积分系数;
# define KD 0 //微分系数;
# define MAX_ERROR 1000 //设定PID控制的最大误差量;
# define DEAD_AREA 0 //死区(最小误差量);
# define TARGET_MIN 1 //最小目标值;
# define TARGET_MAX 200 //最大目标值;
# define EXPORT_MAX 100 //输出最大值;(未放大100倍)
# define EXPORT_MIN 0
/*************************************************************************
结构体定义
*************************************************************************/
typedef struct
{
int Target_value; //目标值;
int Last_target_value; //上次目标值;
int K_proportion; //比例增益;
int K_integration; //积分系数;
int K_differential; //微分系数;
int E_K0; //本次误差项;
int E_K1; //上次误差项;
int E_Dif; //本次误差项和上次误差项之差;
int E_Sum; //误差项和;
}PID_Local;
/*************************************************************************
外部函数声明
*************************************************************************/
//函数功能:参数初始化;
//入口参数:pid--PID_LOCAL结构体指针;
//出口参数:无;
//函数说明:无;
void PID_Parament_init(PID_Local *pid);
//函数功能:计算当前输出量;
//入口参数:pid--PID_LOCAL结构体指针;
// sample_value--采样值;
//出口参数:当前输出值;
//函数说明:无;
unsigned int PID_Count_cur_value(PID_Local *pid, float sample_value);
//函数功能:设定目标值;
//入口参数:pid--PID_LOCAL结构体指针;
// set_value--应设置的目标值;
//出口参数:无;
//函数说明:无;
void PID_Target_set(PID_Local *pid, int set_value);
# endif
PID.c文件:
/*************************************************************************
作者:
文件名称:PID.c
程序功能:变比例系数PID算法;
编写时间:
修改时间:
测试单片机型号:msp430f149
说明:使用此算法前需先将控制系数0、1、2离线算好;
*************************************************************************/
/*************************************************************************
头文件
*************************************************************************/
# include "PID.h"
/*************************************************************************
函数名称:void PID_Parament_init(PID_Local *pid)
函数功能:计算当前输出量;
入口参数:pid--PID_LOCAL结构体指针;
出口参数:当前输出值;
函数说明:无;
*************************************************************************/
void PID_Parament_init(PID_Local *pid)
{
pid->K_proportion = KP; //比例增益;
pid->K_integration = KI; //积分系数;
pid->K_differential = KD; //微分系数;
pid->Target_value = 0; //PID参数初始化;
pid->E_K0 = 0;
pid->E_K1 = 0;
pid->E_Dif = 0;
pid->E_Sum = 0;
}
/*************************************************************************
函数名称:void PID_Target_set(PID_Local *pid, float set_value)
函数功能:设定目标值;
入口参数:pid--PID_LOCAL结构体指针;
set_value--应设置的目标值;
出口参数:无;
函数说明:无;
*************************************************************************/
void PID_Target_set(PID_Local *pid, int set_value)
{
if(set_value < TARGET_MIN) //设置最小目标值;
{
set_value = TARGET_MIN;
}
else if(set_value > TARGET_MAX) //设置最大目标值;
{
set_value = TARGET_MAX;
}
pid->Target_value = set_value; //设置目标值;
}
/*************************************************************************
函数名称:uchar PID_Count_cur_value(PID_Local *pid, float sample_value)
函数功能:计算当前输出量;
入口参数:pid--PID_LOCAL结构体指针;
sample_value--采样值;
出口参数:当前输出值;
函数说明:无;
*************************************************************************/
unsigned int PID_Count_cur_value(PID_Local *pid, float sample_value)
{
int cur_export_value = 0; //当前输出温度;
int tmp_target_value = 0; //临时目标值;(处理浮点数)
int tmp_sample_value = 0; //临时采样值;(处理浮点数)
tmp_target_value = (int)(pid->Target_value * 100); //将处理的浮点型数字量放大100倍,化为
//整形变量来运算,减少运算量;
tmp_sample_value = (int)(sample_value * 100);
pid->E_K0 = tmp_target_value - tmp_sample_value;//当前误差项;(比例项系数)
/* if(pid->E_K0 > MAX_ERROR) //当本次误差项大于最大设定误差时以最大输出量输出;
{
return EXPORT_MAX;
} //适用变化速度较慢的
if(pid->E_K0 <= DEAD_AREA) //当本次误差项小于最小设定误差时以最小输出量输出;(死区控制)
{
return EXPORT_MIN;
}
*/
pid->E_Sum += pid->E_K0; //计算积分项;
pid->E_Dif = pid->E_K0 - pid->E_K1; //误差项差;(本次误差项和上次误差项之差)
pid->E_K1 = pid->E_K0; //保存本次误差项,作为下次误差参考量;
cur_export_value = pid->K_proportion * pid->E_K0 //计算输出量;
+ pid->K_integration * pid->E_Sum
+ pid->K_differential * pid->E_Dif;
/* if(cur_export_value > 50000)
{
cur_export_value = 20000;
}
else if(cur_export_value < 0)
{
cur_export_value = 0;
}*/
return cur_export_value / 100;
}