飞思卡尔智能车——舵机及PID控制

2023-05-16

本篇博客已迁移至:飞思卡尔智能车——舵机及PID控制

请帮个忙,去新地址访问:)。


舵机:小车转向的控制机构。也就是控制小车的转向。它的特点是结构紧凑、易安装调试、控制简单、大扭力、成本较低等。舵机的主要性能取决于最大力矩和工作速度(一般是以秒/60°为单位)。它是一种位置伺服的驱动器,适用于那些需要角度不断变化并能够保持的控制系统。在机器人的控制系统中,舵机控制效果是性能的重要影响因素。舵机能够在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出值得单片机系统很容易与之接口。

-->组成:舵盘、减速齿轮组、位置反馈电位计、直流电机、控制电路等

-->工作原理:控制信号→控制电路板→电机转动→齿轮组减速→舵盘转动→位置反馈电位计→控制电路板反馈。

-->输入线:中间红色——电源线Vcc;黑色——地线GND;白色/橘黄色——控制信号线

-->信号:pwm信号,其中脉冲宽度从0.5-2.5ms(周期为20ms),相对应的舵盘位置为0-180度,呈线性变化。

pwm波脉冲宽度与舵机转角角度的关系:

也就是不同脉冲宽度的pwm波,舵机将输出不同的轴转角。所以要控制小车的转角,我们就要控制输出不同脉冲宽度的pwm波。

什么是PWM波

PWM:脉冲宽度调制

-->原理:对电路元件的通断进行控制,使输出端得到一系列幅值相等的脉冲。猪八戒的耙子就可以看似脉冲宽度相等的pwm波形。那不相等的呢,可以 把一排身高相等但胖瘦不同的人排排站看做脉冲宽度不相等的pwm波形。

比如这里有一个简单的电路:

我们以5s为一个周期,在每一个5s内,前3s开关打开,后2s开关闭合,则ab端电压将会这样变化:

(对电路元件的通断进行控制,使输出端得到一系列幅值相等的脉冲。)

(在这个例子中,输入信号脉冲宽度为3s,周期为5s。)

重复一下:所以要控制小车的转角,我们就要控制输出不同脉冲宽度的pwm波。

 

还有一个新的概念——占空比

占空比:在周期型的现象中,某种现象发生后持续的时间与总时间的比

-->例如,在成语中有句话:「三天打渔,两天晒网」,如果以三天为一个周期,“打渔”的占空比则为三分之一。(这一行和上一行摘自百度百科,版权归百度百科。)

因为感觉这个成语说得很对,就拿来它做例子,根据这个成语,大家也应该懂占空比的意思了(所以上图简单的电路,它的占空比应该是3/5)。
 

--------------------------------------------------------

PID控制:一种调节器控制规律为 比例、积分、微分的控制。其中:P:比例(proportion)、I:积分(integral)、D:导数(derivative)

式子中Kp为比例系数,Ti为积分时间参数,Td为微分时间常数。
各个参数的意义作用:

Kp:比例系数。一般增大比例系数,将加快系统的响应。

Ti:积分时间常数。一般地,积分控制通常与比例控制或比例微分控制联合使用,构成 PI或 PID控制.增大积分时间常数  (积分变弱)有利于小超调,减小振荡,使系统更稳定,但同时要延长系统消除静差的时间.积分时间常数太小会降低系统的稳定性,增大系统的振荡次数.

Td:微分时间常数。一般微分控制和比例控制和比例积分控制联合使用,组成PD或PID控制,微分控制可改善系统的动态特性。

PID的控制方法常用的有两种:

1.增量式PID

所谓的增量,就是本次控制量和上次控制量的差值。增量式PID是一种对控制量的增量进行PID控制的一种控制算法。

公式:


(说明:Kp->P,Ki->I,Kd->D,e数组->error数组,
e[n]->本次差值,e[n-1]->上次差值,e[n-2]->上上次差值)

举个例子,增量式PID可以应用在电机上
假设当前电机PID的pwm值为5000(精度为10000,即此时的占空比为50%)。对应的速度为100r/s。
程序发出一个命令,要求pwm输出为0,即要求停车。(可能有人有疑问为什么不直接程序给pwm为0,这也是一种方法,可是由于惯性的存在,小车会在一段时间后才停下。)
这时,我们可以采用PID控制的方法来实现。
我们在程序中定义几个变量:


int speed_now=100;     //此刻的速度
int speed_want=0;      //期望输出的速度
int pwm_duty=0;        //本次pwm输出值
float P=100,I=20,D=2;  //P I D 数值
float error_pre_pre=0;  //上上次差值
float error_pre=0.0;    //上次差值
float error=0.0;         //本次差值


根据公式,我们编写程序:
void PID()
{
    /*
      增量式PID
      P=Kp*(error-error_pre);
      D=Kd*(error-2*error_pre+error_pre_pre);
      I=Ki*error;
      Pwm+=P+I+D;
  */
   error=speed_want-speed_now; //speed_now可以通过编码器采值等等方式得到
   pwm_duty+=(int)(P*(error-error_pre)+I*error+D*(error-2*error_pre+error_pre_pre));
   //注意上面的加号加号是增量式PID的体现。我们对增量(即右边的式子)进行PID控制。
   error_pre_pre=error_pre;
   error_pre=error;
}


当函数运行第一次的时候,输出的pwm为:

电机给了一个反转的力,小车前进受到了阻力,于是可以很快的停下来了。

增量式PID的优缺点:
优:
①算式中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关,容易通过加权处理获得比较好的控制效果;
②计算机每次只输出控制增量,即对应执行机构位置的变化量,故机器发生故障时影响范围小、不会严重影响生产过程;
③手动—自动切换时冲击小。当控制从手动向自动切换时,可以作到无扰动切换。
缺:需要对控制量进行记忆。

2.位置式PID
与增量式不同,位置式PID不需要对控制量进行记忆,直接对偏差值进行计算得出期望的pwm。
公式:

(说明:Kp->P,Ki->I,Kd->D,ek->本次误差、ek-1->上次误差)

举个例子,位置式PID可以应用在舵机上。因为舵机本次的pwm输出值与上次pwm输出值关系不太,舵机需要的是快速转到某个角度。
假设舵机pwm输出1000时舵盘转轴为90°,pwm输出0时舵盘转轴为0°,pwm输出2000时舵盘转轴为180°。
现在舵机pwm输出为1500,我们要让舵盘转到最中间。
在这里我们采用PD控制,即I值为0(I值为偏差的积分,即对偏差求和。我们当时试验小车的舵机控制时发现I值可以省略,PD控制足矣。当然,具体需不需要I项要在实际中进行分析验证)。
代码:
pwm_duty=(int)(P*error+D*(error-error_pre);   //红色部分表示这是位置式PID控制
-----------------------------------------------------------------------------------------------------------------

其他:

反馈系统:
 
(图片摘自百度图片,链接地址: 点击打开链接)
 
 
*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥

广告时间:

本宝宝开通了一个公众号,记录日常的深度学习和强化学习笔记。希望大家可以共同进步,嘻嘻嘻!求关注,爱你呦!

KeepYourAims
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

飞思卡尔智能车——舵机及PID控制 的相关文章

随机推荐

  • Linux获取进程列表

    实现思路是 xff1a 遍历 proc目录下的所有进程描述文件夹 xff0c 从而获取进程列表 代码如下 xff1a include lt stdio h gt include lt dirent h gt include lt unist
  • ubuntu18.04 下firefox 不能 播放视频,因为默认未安装FLASH插件。(当然只是原因之一)

    ubuntu18 04 下firefox 不能 播放视频 xff0c 默认未安装FLASH插件 终端输入 xff1a sudo apt get install flashplugin nonfree
  • Ubuntu上可使用的15个桌面环境

    Ubuntu上可使用的15个桌面环境 发布者 红黑魂 来自 Ubuntu之家 摘要 Linux下桌面环境很多 xff0c Ubuntu之家给大家总结了比较常用的15个桌面环境 xff0c 并附上Ubuntu 12 10 xff08 Linu
  • C语言数据类型

    数据类型在数据结构中的定义是一个值的集合以及定义在这个值集上的一组操作 数据类型包括原始类型 多元组 记录单元 代数数据类型 抽象数据类型 参考类型以及函数类型 本文主要以51单片机中的数据类型为中心而展开的话题 在keil C51或者ia
  • 《Cortex-M0权威指南》之Cortex-M0技术综述

    Cortex M0权威指南 之Cortex M0技术综述 转载请注明来源 xff1a cuixiaolei的技术博客 Cortex M0 处理器简介 1 Cortex M0 处理器基于冯诺依曼架构 xff08 单总线接口 xff09 xff
  • xos详解5:PendSV_Handler

    PendSV Handler PendSV Handler LDR R2 61 OSTcbCurr 不必关中断 嵌套中断发生时会自动保存 R0 R3 到 MSP 并恢复 LDR R0 R2 如果发生咬尾的多个 PendSV xff0c 上半
  • M0最高优先级的中断设计

    1 Reset 3 Highest Reset 绝大部分处理器设计时 xff0c 将复位中断放在最高优先级 一般来说这样设计是合理的 xff0c 个人认为在某些应用场景这样处理仍有局限性 2 NMI 2 Nonmaskable interr
  • 如何从零开始写一个操作系统?

    首页发现等你来答 登录加入知乎 如何从零开始写一个简单的操作系统 xff1f 关注问题 写回答 操作系统 编程学习 如何从零开始写一个简单的操作系统 xff1f 看了这个 xff1a 从零开始写一个简单的操作系统 求指教 关注者 4 787
  • 每次听到同事跳槽后的薪资,我就像打了鸡血一样

    本文总结了现阶段 34 大龄程序员 34 的职业生存状况 xff0c 内容包含职位需求量 xff0c 议价能力如何以及如何度过传说中的 34 中年危机 34 等等 xff0c 供大家参考 xff01 值此金 三 银四跳槽季 的开端 xff0
  • Lua性能优化—Lua内存优化

    原文链接https blog uwa4d com archives usparkle luaperformance html 这是侑虎科技第236篇原创文章 xff0c 感谢作者舒航供稿 xff0c 欢迎转发分享 xff0c 未经作者授权请
  • Jetson Xavier NX(emmc)烧录系统时可能遇到的问题(避坑)

    目录 Ununtu18虚拟机无法联网 当NX接上电源后 xff0c 指示灯没有亮 xff08 不工作 xff09 在登陆SDK时 xff0c 可能会出现卡在初始界面的情况 在烧录镜像时 xff0c 可能会卡在该处没有变化 Ununtu18虚
  • 互斥量、条件变量与pthread_cond_wait()函数的使用,详解(一)

    1 首先pthread cond wait 的定义是这样的 The pthread cond wait and pthread cond timedwait functions are used to block on a conditio
  • STAR法则写简历

    STAR 法则是在面试 xff0c 求职 xff0c 写简历时候的常用利器 虽然常用 xff0c 但是我想知道的人一定很少很少 xff0c 不然为什么那么多人面试的时候犯那么低级的错误呢 xff1f STAR法则无法帮你提高你的实力 xff
  • 论文发表为什么不可以一稿多投呢

    论文发表为什么不可以一稿多投呢 很多作者在担心投一家杂志会被拒稿 xff0c 就会选择一篇稿件投多家期刊的方法 xff0c 大家应该或多或少都听过不能一稿多投 xff0c 但具体原因是什么大家知道吗 一稿多投会有什么后果 一稿多投是自稿件发
  • ROS下视频消息发布与订阅

    https download csdn net download v7xyy 10869743 下下来后 1 发布视频消息 rosrun video transport tutorial video publisher xff08 节点 c
  • ros中标志位设计(4)

    由于需要涉及控制权的交接事件 xff0c 需要通过标志位的方式进行设计 首先需要自定一个标志位的信息在ros中用于标志位信息的发布 下面是用于标志位的头文件Flag h Generated by gencpp from file xx ms
  • 全球最贵域名Sex.com将再度出售

    金融时报消息称 xff0c Sex com域名曾位居全球最贵域名前例 xff0c 四年前 xff0c 它以1400万美元成交 xff0c 不过 xff0c 买下此域名的公司面临破产 xff0c 因此Sex com将再度拿来出售 Sex co
  • 微信消息推送消息加解密(golang)

    本篇介绍如何使用golang对微信消息推送进行加解密 xff0c 后续会补充 xff0c 目前先写个原理 xff0c 大概自己看一下 xff0c 其他的自己应该也能写 老套路 xff0c 分为三步 xff0c 为啥写 xff0c 教程 xf
  • C++数据可视化MathGL使用简示

    C 43 43 数据可视化 MathGL 使用指南 效果演示 搭建环境与依赖项 Windows10 64位 VS2017 Zlib1 2 11 xff08 已编译好的可用版本已集成在我后面的项目链接里 xff09 libpng1 6 37
  • 飞思卡尔智能车——舵机及PID控制

    本篇博客已迁移至 xff1a 飞思卡尔智能车 舵机及PID控制 请帮个忙 xff0c 去新地址访问 xff1a xff09 舵机 xff1a 小车转向的控制 机构 也就是控制小车的转向 它的特点是结构紧凑 易安装调试 控制简单 大扭力 成本