STM32平衡车PID的疑问

为什么平衡车串级pid的速度环输出要作为直立环角度输入?如果不用串级,直接直立环和速度环相加有什么区别?

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:STM32单片机PID闭环精确控制直流电机位置(角度)
  • 除此之外, 这篇博客: 【嵌入式设计】【炒鸡详细】STM32单片机控制机器人程序设计框架解读(不定时更新)中的 3.3 使用PID算法对车轮进行速度调节(一般采用的方法,但会抖动) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

     

        很多工程控制都会用到PID,PID的思路很简单,假设我们开车,想把车维持在60km/s的速度上,那么车速如果只有十几而且不加速,那么了我们就要往死里踩油门,当车子嗖一下子窜出去了,我们就得松油门;如果车速是58,59的样子,那么我们就轻轻,或者几乎不踩油门。如果速度是65,那么我们就松开油门,如果速度是120,那么我们就得猛踩刹车。

        这就是PID算法中的P因子。我们控制车速,参考的就是当前的速度和目标速度,如果这两个速度差的很大,那么我们就多给点儿油速度小,我们就少给点儿油。我们踩油门的程度就大致符合:

        油门=(目标车速-当前车速)X一个固定的力道(Propotion

        这就是PID控制中的P(Percentage)。使用这种方式控制轮子的方式可以称作P算法,现在我们把它实现一下:

        

        在这个程序里,与P值的代码就三句(红框),第一句:计算当前速度与目标速度的差值;第二句:差值乘上一个比例因子;第三句,返回这个结果。这个程序有三个输入,分别为当前速度,目标速度以及最大油门。返回值就是基于当前速度和目标速度计算出的油门数值。

        但是在生活中我遇到过这样一个问题:我有一辆小摩托,在我启动小摩托后,为了达到我想要的速度,我肯定是给足了油门,但是此时我的小摩托嗖一下就窜出去了(有一个很大的加速度),骑鬼火的社会人比较喜欢这种加速感,但生活不是鬼火,毕竟车头一翘阎王爷笑。当我发现我的小鬼火要翘头,我得赶快把油门松开。

        此时我速度还没达到目标速度,油门还得捏着(P比例因子告诉我要捏住油门),但是因为我不能加速太快了,所以我还得松点儿油门。此时在P因子外,又有一种因子影响了油门,它就是:

         微分比例因子(Derivative)

        P因子和D因子在一起就构成了PD算法:

        油门=P*(目标速度-当前速度)+D*(当前速度-上一时刻的速度)

        参考了D值,刚刚的算法我们可以改为:

        

        PID算法中,我们已经掌握了P因子和D因子,当然,这这样可能会导致另一个问题:我上一秒的速度是0,因为加速太快导致第二秒的速度一下子升高到了59km/h,按照常理,按照P因子作用,我此时应该不踩油门了(因为目标速度-当前速度≈0),但是由于D因子的存在(D因子发现我加速太快了),我会猛踩刹车。最后结果就是我速度到59了,踩刹车,速度下降,加速,又踩刹车;这样也会达到目标速度,但是这种加速是非常不稳定的。

        所以,我们综合了微分,积分与比例因子,构建了完整的PID函数:

        E=P(v_tar-v0)+D*(\frac{dV}{dt})+I(2v0-\frac{dV}{dt}*\delta t))

  • 以下回答来自chatgpt:

    问题背景:

    本题所描述的是关于STM32平衡车控制的问题。STM32平衡车是一种结合了机械工程与电子技术的产物,通过对平衡车的角度、速度等参数进行测量与控制,使车辆具有类似人类平衡的能力,能够在平衡状态下运动。其中使用到的技术术语有:PID控制器、直立环、速度环、串级PID等。

    PID控制器是一种用于控制系统的基本控制器,其在工业自动化以及机器人控制等领域得到广泛应用。PID控制器包含P项、I项、D项三个参数,通过对系统的反馈信号进行处理得到控制量并且调整输出信号。

    直立环是一种控制算法,其目的是使小车始终保持平衡状态。直立环通过控制电机转速来达到角度始终在机械中值位置。

    速度环是一种用于控制电机转速的控制器,其目的是让电机转速趋近于0。

    串级PID是一种控制系统,其将PID控制器按照层级进行连接,以实现更为精准的控制效果。

    关于STM32平衡车的控制,需要测量车体的倾角并进行负反馈控制。控制流程中包含了角度计算、滤波器选择、PID计算等步骤。其中,角度计算通过对车体高度、质量、加速度等因素的计算得到倾角;滤波器选择用于减小噪声干扰,提高系统稳定性;PID计算通过控制电机转速来达到平衡控制的目的。

    解决方案:

    根据问题的背景和参考资料,提出以下解决方案:

    1.角度计算

    对于角度计算,需要通过车体高度、质量、加速度等因素的计算得到倾角。具体步骤如下:

    a.测量车体高度L和质量m

    b.测量当前车辆的加速度A_Z和零点偏差AZ_ZERO,然后进行处理得到车辆的加速度angle_Accel

    c.根据加速度angle_Accel求出倾斜角度angle_Accel

    d.通过陀螺仪测量出当前的角速度Gyro_Now

    e.最后,将angle_Accel和Gyro_Now代入滤波器进行处理,得到最终的倾角值angle_now

    2.直立环PID参数整定

    直立环PID参数整定包括了Kp、Kd的调节及确定。具体步骤如下:

    a.预设一个Kp值,并且与满占空比对应的ARR值进行比较,选择合适的Kp值;

    b.观察小车的车轮转向,若和倾斜方向相同说明极性相同否则极性不同;

    c.逐步增大Kp,在满足小车不出现低频振荡的前提下,调节Kp的大小,最终确定Kp的值;

    d.通过调节Kd的值来消除振荡,同时保持Kd的极性与Kp相同;

    e.最后根据工程经验,将Kp、Ki都乘以0.6进行调整。

    3.滤波器选择

    滤波器选择的目的在于减小噪声干扰,提高系统稳定性。常用的滤波器有清华角度计算滤波器、一阶滤波器、二阶滤波器和卡尔曼滤波器等。具体步骤如下:

    a.根据实际的情况选择需要的滤波器;

    b.使用所选定的滤波器对角度计算的结果进行处理。

    4.PID控制计算

    PID控制计算是整个平衡车控制系统的核心部分。具体步骤如下:

    a.根据预设的目标和实际测量到的倾角计算出误差量error;

    b.根据P项和D项,通过控制电机转速来达到角度始终在机械中值位置的目的;

    c.进行微分项的限幅,保证系统稳定性;

    d.将P项和D项的结果加和得到最终的控制量AngleControlOut。

    总之,完整的STM32平衡车控制流程包括了角度计算、滤波器选择、PID计算等多个步骤。在设计的过程中需要考虑到各个步骤之间的协调性,使整个系统达到稳定可靠的效果。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^