第十八届智能车之PID算法以及上位机调节

这篇具有很好参考价值的文章主要介绍了第十八届智能车之PID算法以及上位机调节。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当前正在备战第十八届智能车,记录一下学习和实践的过程,这一篇主要是讲pid算法以及调试。

PID即:Proportional(比例)、Integral(积分)、Differential(微分)的缩写。

PID是经典的闭环控制算法,具有原理简单,易于实现,适用面广,控制参数相互独立,参数的选定比较简单等优点。

在智能车闭环中,pid算法起到了关键作用,他可以保证车辆行驶的速度按照你所设定的目标速度执行,提高了车辆行驶的稳定性。

接下来是代码部分

首先在main函数中对pid进行初始化。

 PID_init(&Motor_pid_r);
 PID_init(&Motor_pid_l);

 PID_Set(&Motor_pid_r,10,10,4);
 PID_Set(&Motor_pid_l,10,10,4);

这是所调用的pid函数。

//初始化PID
void PID_init(PID_TypDef* sptr)
{
    sptr->Kp = 0.0;             // 比例常数 Proportional Const
    sptr->Ki = 0.0;             // 积分常数 Integral Const
    sptr->Kd = 0.0;             // 微分常数 Derivative Const
    sptr->Bias      = 0.0;
    sptr->Integral  = 0.0;
    sptr->Last_Bias = 0.0;
    sptr->Pre_Bias  = 0.0;

}

//PID设置
void PID_Set(PID_TypDef *PID,float Kp,float Ki,float Kd)
{
    PID->Kp = Kp;
    PID->Ki = Ki;
    PID->Kd = Kd;
}

这是在中断中调用来计算pwm的函数

pwm_r += IncPID(r_speed,target_speed_r,&Motor_pid_r);
pwm_l += IncPID(l_speed,target_speed_l,&Motor_pid_l);

这是增量式PID和位置式PID,具体用那一个要看实际应用情况

typedef struct
{
         float  Kp;                  // 比例常数 Proportional Const
         float  Ki;                  // 积分常数 Integral Const
         float  Kd;                  // 微分常数 Derivative Const
         float  Integral;
         float  Bias;
         float  Last_Bias;
         float  Pre_Bias;
}PID_TypDef;

PID_TypDef Motor_pid_r;   //右电机PID
PID_TypDef Motor_pid_l;   //左电机PID

//PID设置
void PID_Set(PID_TypDef *PID,float Kp,float Ki,float Kd)
{
    PID->Kp = Kp;
    PID->Ki = Ki;
    PID->Kd = Kd;
}

//增量式PID
float IncPID(int Encoder,int Target,PID_TypDef* sptr)
{
  float Pwm;
  sptr->Bias = Target - Encoder;                                     // 计算当前误差
  Pwm = sptr->Kp * (sptr->Bias-sptr->Last_Bias)                  // P
         +sptr->Ki * sptr->Bias                                   // I
         +sptr->Kd * (sptr->Bias-2*sptr->Last_Bias+sptr->Pre_Bias);  // D

  sptr->Pre_Bias=sptr->Last_Bias;                          // 存储误差,用于下次计算
  sptr->Last_Bias=sptr->Bias;

  return(Pwm);                                    // 返回增量值

}


//位置式PID
float PstPID(float Angle, float Target,PID_TypDef* sptr)
{
    float Pwm;
//  if(around==2)
//  {
        sptr->Bias = 30 ;
//  }else
//  {
    sptr->Bias = Target -Angle ;
//  }
    sptr->Integral += sptr->Bias;

    Pwm = sptr->Kp   * sptr->Bias                   // P
         +sptr->Ki * sptr->Integral                 // I
         +sptr->Kd * (sptr->Bias-sptr->Last_Bias);  // D

    sptr->Last_Bias=sptr->Bias;

    return(Pwm);

}

增量式PID

第十八届智能车之PID算法以及上位机调节

比例P :    e(k)-e(k-1)   当前误差 - 上次误差

积分I :   e(i)     当前误差   

微分D :  e(k) - 2e(k-1)+e(k-2)   当前误差 - 2*上次误差 + 上上次误差

增量式PID中不需要累加,控制增量Δu(k)的确定仅与最近3次的采样值有关,容易通过加权处理获得比较好的控制效果,并且在系统发生问题时,不会出现突变的情况,增量式不会严重影响系统的工作。

位置式 PID 

第十八届智能车之PID算法以及上位机调节

e(k): 用户设定的值(目标值) -  控制对象的当前的状态值 

比例P :    e(k)

积分I :   ∑e(i)     误差的累加(包括e(k))

微分D :  e(k) - e(k-1)  这次误差-上次误差

因为有误差积分一直累加,也就是当前的输出u(k)与过去的所有状态都有关系,用到了误差的累加值;(误差e会有误差累加),输出的u(k)对应的是执行机构的实际位置,,一旦控制输出出错(控制对象的当前的状态值出现问题 ),u(k)的大幅变化会引起系统的大幅变化

并且位置式PID在积分项达到饱和时,误差仍然会在积分作用下继续累积,一旦误差开始反向变化,系统需要一定时间从饱和区退出,所以在u(k)达到最大和最小时,要停止积分作用,并且要有积分限幅和输出限幅

所以在使用位置式PID时,一般我们直接使用PD控制

而位置式 PID 适用于执行机构不带积分部件的对象,如舵机和平衡小车的直立和温控系统的控制

(详细的位置式pid与增量式pid可以看原文链接https://blog.csdn.net/u014453443/article/details/100573722)

写下来是用上位机调PID

这是我使用的上位机软件

第十八届智能车之PID算法以及上位机调节

这是上位机软件所看到的双电机上电后粗调的效果

 第十八届智能车之PID算法以及上位机调节

 基本上实现了pid闭环控制,用手施加外部持续稳定的阻力,电机依旧可以保证稳定的转速,效果比较理想。

         我最近发了一篇文章里面包含了常用的功能函数以及常用的模块底层驱动函数封装库,大家感兴趣的可以收藏一下,需要的时候就不用到处找代码,一篇就够用,我会持续更新。

        常用模块函数封装库(持续更新中。。。。。。)-CSDN博客 文章来源地址https://www.toymoban.com/news/detail-461766.html

到了这里,关于第十八届智能车之PID算法以及上位机调节的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法第十八天-实现Trie(前缀树)

    本文是前缀入门教程 从二叉树说起 前缀树,也是一种树。为了理解前缀树,我们先从二叉树说起。常见的二叉树结构是下面这样子的: 可以看到一个树的节点包含了三个元素:该节点本身的值,左子树的指针,右子树的指针。二叉树可视化是下面这样子的: 二叉树的每个节

    2024年01月18日
    浏览(33)
  • 算法第十八天-打家劫舍Ⅱ

    [打家劫舍Ⅱ]是说两个相邻的房间不能同时偷,并且首尾两个房间是相邻的(不能同时偷首尾房间) 明显是基于[打家劫舍Ⅰ]做的升级。[打家劫舍Ⅰ]也是说两个相邻的房间不能同时偷,但是首尾房间不是相邻的(可以同时偷首尾房间) 所以,我们先从[打家劫舍Ⅰ]开始说起。

    2024年01月17日
    浏览(42)
  • 智能算法实现PID智能车控制系统

    PID控制是自动控制领域中产生最早,应用最广的一种控制方法。本文以论述PID参数先进整定方法开始,介绍了近几年得到的最新研究成果。接下来,从PID控制的结构形式实际控制工程需求和实现条件分析了PD控制的独特优点和理论依据。在众多的PID调整方法中,本文选择了内

    2024年02月08日
    浏览(43)
  • [调参神器]使用VOFA+上位机进行PID调参(附下位机代码)

    ​ 简单地来说,VOFA+是一个超级串口助手,除了可以实现一般串口助手的串口数据收发,它还可以实现数据绘图(包括直方图、FFT图),控件编辑,图像显示等功能。使用VOFA+,可以给我们平常的PID调参等调试带来方便,还可以自己制作符合自己要求的上位机,为嵌入式开发

    2023年04月09日
    浏览(42)
  • QT上位机控制stm32,并利用PID控制编码电机旋转

    QT上位机控制stm32,并利用PID控制编码电机旋转             由于最近在学习电机控制算法之类的东西,看到论文大多使用PID、或以PID衍生的ADRC作为电机的主流控制,于是自己也写了一个stm32控制L298N以驱动直流电机的程序,并用QT做了一个上位机实现了用软件改变PID的参数

    2023年04月09日
    浏览(39)
  • 第十八节——插槽

    在Vue中,插槽(Slots)是一种用于组件模板中的特殊语法,用于实现组件的内容分发和复用。插槽允许父组件在子组件的模板中插入任意的内容,从而实现更灵活的组件组合和定制 默认插槽是最常用的插槽类型。在子组件的模板中,使用slot/slot标签定义默认插槽的位置。父组

    2024年02月05日
    浏览(49)
  • 第十八章 Unity 协程

    我们知道脚本都是继承自MonoBehaviour类,而其中的Update方法里面放置了大部分的游戏逻辑处理代码。Update方法是游戏循环的每一帧都去执行,这就要求我们的代码“无时无刻”不在处理所有的可能发生的情况,并做出相应的处理。如果我们想要完成“一段时间”的逻辑代码,例

    2024年02月05日
    浏览(39)
  • 每日三问-前端(第十八期)

    先来回顾一下上期的问题及答案: 2023年6月7日 1. 组件间通信是指在 Vue.js 中,不同组件之间进行数据或事件的传递和交互的过程。常用的组件通信方式包括: 父子组件通信:通过 props 属性将数据从父组件传递给子组件,子组件通过监听 props 的变化来获取父组件传递的数据。

    2024年02月08日
    浏览(39)
  • 第十八章 ObjectScript - 使用例程

    可以将例程视为 ObjectScript 程序。例程可以从头开始编写,也可以在编译类时自动生成。 在 ObjectScript 例程中,标签定义以下代码单元之一的起点: Procedures 过程(可选地返回一个值)。过程中定义的变量是该过程私有的,这意味着它们不可用于其他代码。对于函数和子例程

    2024年02月10日
    浏览(45)
  • 第十八课、Qt 下载、安装与配置

    功能描述:介绍了 Qt 的下载、安装和配置的全部过程,并对关键页面选项进行了详细说明 Qt 官方下载地址:https://www.qt.io/zh-cn/download https://download.qt.io/ https://download.qt.io/ https://www.qt.io/zh-cn/download进入下载地址后的页面如下图所示:  对目录结构的说明 snapshots         预览

    2024年02月09日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包