slamugv使用说明--6.电机pid调试下

  1. 关键代码详解
/*************************************/
// 定义PID相关宏
// 这三个参数设定对电机运行影响非常大
// PID参数跟采样时间息息相关
/*************************************/
#define  SPD_P_DATA      5.5f        // P参数
#define  SPD_I_DATA      1.56f       // I参数
#define  SPD_D_DATA      0.0f        // D参数
#define  TARGET_SPEED    100.0f      // 目标速度    15r/m
   
    typedef struct
{
  __IO int32_t  SetPoint;    //设定目标 Desired Value
	
  __IO float    SumError;    //误差累计
  __IO float    Proportion;  //比例常数 Proportional Const
  __IO float    Integral;    //积分常数 Integral Const
  __IO float    Derivative;  //微分常数 Derivative Const
	
	
  __IO int      LastError;   //Error[-1]
  __IO int      PrevError;   //Error[-2]
}PID_TypeDef;
 
 /* PID结构体 */
PID_TypeDef  sPID;               // PID参数结构体
PID_TypeDef  *ptr =  &sPID;

/**
  * 函数功能: PID参数初始化
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */
void PID_ParamInit(void)
{
	   sPID.SumError  = 0;
    sPID.LastError = 0;               // Error[-1]
    sPID.PrevError = 0;               // Error[-2]
	
    sPID.Proportion = SPD_P_DATA; // 比例常数 Proportional Const
    sPID.Integral 	= SPD_I_DATA;   // 积分常数  Integral Const
    sPID.Derivative = SPD_D_DATA; // 微分常数 Derivative Const
	
    sPID.SetPoint = TARGET_SPEED;     // 设定目标Desired Value
}
/**
  * 函数名称:速度闭环PID控制设计
  * 输入参数:当前控制量
  * 返 回 值:目标控制量
  * 说    明:根据增量式离散PID公式 
	pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
e(k)代表本次偏差 
e(k-1)代表上一次的偏差
  */
int32_t SpdPIDCalc_A(float NextPoint)
{
  float iError,iIncpid;
  iError = (float)sPID.SetPoint - NextPoint; //偏差

  /* 给恒定的占空比的时候,0.5r/m 的跳动范围是正常的 */
  if((iError<0.5f )&& (iError>-0.5f))
    iError = 0.0f;

  iIncpid=(sPID.Proportion * iError)                //E[k]项
              -(sPID.Integral * sPID.LastError)     //E[k-1]项
              +(sPID.Derivative * sPID.PrevError);  //E[k-2]项

  sPID.PrevError = sPID.LastError;                  //存储误差,用于下次计算
  sPID.LastError = iError;
  return(iIncpid);                  //返回增量值

}

/**
  * 函数名称:位置闭环PID控制设计
  * 输入参数:当前控制量
  * 返 回 值:目标控制量
  * 说    明:无
  */
int32_t LocPIDCalc_A(int32_t NextPoint)
{
  int32_t iError,iIncpid;
  iError = sPID.SetPoint - NextPoint; //偏差

  iIncpid=(int32_t)( (sPID.Proportion * (float)iError)          //E[k]项
                  - (sPID.Integral * (float)sPID.LastError)     //E[k-1]项
                  + (sPID.Derivative * (float)sPID.PrevError) );//E[k-2]项

  sPID.PrevError = sPIDLastError;   //存储误差,用于下次计算
  sPID.LastError = iError;
  return(iIncpid);                   //返回增量值
}

然后把这个值放在pwm调控 MotorPwm(int a, int iIncpid) ;(电机号,pid反馈值)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值