pid控制

#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_err
0.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_err
0.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值