#include “pid.h”
#include “led.h”
#include “timer.h”
#include “usart.h”
extern float pwmval;
extern char CNT_buf[60];
extern char PWM_buf[60];
PID pid;
/**************************************************************************
函数功能:PID参数初始化
**************************************************************************/
void PID_init(void)
{
pid.fin_pwm=900;
// pid.SetSpeed;
pid.encoderSpeed=0.0;
pid.err=0.0;
pid.err_1=0.0;
pid.err_sum=0.0;
pid.T = 0.1;
// pid.Td = 0; // 1;
// pid.Ti = 0; //200;
pid.Kp = 0.3;
pid.Ki = 0.155; //pid.Kp*(pid.T/pid.Ti);
pid.Kd = 0.01; // pid.Kp*(pid.Td/pid.T);
}
/**************************************************************************
函数功能:限制PWM赋值
入口参数:无
返回 值:无
**************************************************************************/
void Xianfu_Pwm()
{
float umax=990; //===PWM满幅是1000 限制在990
if(pwmval<500) pwmval=500;
if(pwmval>umax) pwmval=umax;
}
/**************************************************************************
函数功能:增量PID控制器
入口参数:编码器测量值,目标速度
返回 值:电机PWM
根据增量式离散PID公式
pid_err+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
e(k)代表本次偏差
e(k-1)代表上一次的偏差 以此类推
pwm代表增量输出
**************************************************************************/
float PID_realize(float speed)
{
//pid.fin_pwm=900;
pid.SetSpeed=speed;
pid.err=pid.SetSpeed-pid.encoderSpeed;
//pid.err=pid.SetSpeed-pid.encoderSpeed;
pid.pid_err=pid.Kppid.err-pid.Kipid.err_sum-pid.Kd*(pid.err-pid.err_1);
//pid.pid_err=pid.Kp*(pid.err-pid.err_1)+pid.Kipid.err+pid.Kd(pid.err-2pid.err_1+pid.err_2);
pid.fin_pwm=pid.fin_pwm-pid.pid_err;
pid.err_sum+=pid.err;
//pid.fin_pwm=pid.pwm_sum_err0.3906f;
pid.err_1=pid.err;
//pid.err_1=pid.err;
return pid.fin_pwm;
}
//float PID_realize(float speed)
//{
// pid.fin_pwm=900;
// pid.SetSpeed=speed;
// pid.err=pid.SetSpeed-pid.encoderSpeed;
// //pid.err=pid.SetSpeed-pid.encoderSpeed;
// pid.pid_err=pid.Kppid.err-pid.Kipid.err_1;
// //pid.pid_err=pid.Kp*(pid.err-pid.err_1)+pid.Kipid.err+pid.Kd(pid.err-2pid.err_1+pid.err_2);
// pid.fin_pwm=pid.fin_pwm-pid.pid_err;
// pid.err_1+=pid.err;
// //pid.fin_pwm=pid.pwm_sum_err0.3906f;
// pid.err_2=pid.err_1;
// //pid.err_1=pid.err;
// return pid.fin_pwm;
//}
#ifndef _PID_H
#define _PID_H
#include “sys.h”
typedef struct _pid {
float SetSpeed; //设定值
float encoderSpeed; //实际值
float err; //目前偏差值
float err_sum; //定义偏差值和
float err_1; //定义上一个偏差值
float T ; //采样周期
float Ti; //积分时间常数
float Td; //微分时间常数
float Kp,Ki,Kd; //定义比例、积分、微分系
float umax;//
// float pwm_sum_err; //定义增量和
float pid_err; //一次PID过后
double fin_pwm; //转换为最终占空比
}PID;
float PID_realize(float speed);
void PID_init(void);
void Xianfu_Pwm(void);
#endif