pid算法的C实现

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;                            
}

你可能感兴趣的:(pid算法的C实现)