如何使你的直流电机闭环?(PID讲解)

这篇具有很好参考价值的文章主要介绍了如何使你的直流电机闭环?(PID讲解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:看了看很多大佬写的PID讲解很全面也很复杂,实在是不适合很多萌新入坑,所以想按自己的理解写一篇通俗易懂的PID算法讲解

一:PID的基本定义


PID,就是“比例(proportional)、积分(integral)、微分(derivative)”,是一种很 常见的控制算法。常见的PID算法,位置式PID,增量式PID,串级PID等。

二:我们为什么要使用这个算法?


 以电机转速为例子来解释,很多人应该都有这个疑惑,我控制转速,直接给电机输出一个PWM不就行了吗,假设我设置定时器的arr(自动重装载值)=1000-1,想让电机转慢一点,设置输出比较的PWM为200。我想让电机转的快一些,就给PWM输出1000,让电机全速旋转不就可以了吗?不停的进行测试,然后用编码器读取到电机当前的转速,记录下来,我就知道了电机的一个速度对应一个固定的PWM的值。大家有没有想过一个问题,电机随着使用时间的增加,电机的性能其实会发生变化,输出相同的PWM值,速度会和最开始测得的值是不一样的。我们有一辆小车(电机控制小车的速度),如果我改变小车的负重,根据生活中的常识,相同的输出电压下,负载越重,小车的速度越慢的,那么前面记录的数据都不成立了。所以说仅仅输出一个PWM值,是不能精确控制电机转动的速度保持在相同的值。这个时候PID的算法就会体现出重要的作用。现在,我用一个编码器来读取电机速度(编码器可以精确读取电机的转动速度),编码器的作用就是把电机转动的速度(模拟量)转化为一个数字量,传入到我们的微处理器。我们使用PID算法本质上是为了让编码器的值(即速度)稳定在一个值。 PID调参变成了如何让编码器的值(速度)保持在一个固定值。

三:P,I,D参数如何控制闭环?


我们的PID处理的函数,使用的C语言,函数中有两个入口参数,一个是编码器测量到当前的速度值(程序中使用position代替),另一个就是我们想达到的速度值(程序中使用target代替)。

1.P值的作用


如果当前的速度值和目标的速度值相差很大,我们就想增大电机的PWM输出,让电机快速达到目标值,PID中的P就扮演着重要的作用,这里的P我使用Position_KP代替,可以联想到PWM=Position_KP*(target-position),当前的速度值和目标的速度值相差越大,输出的PWM值就会越大,可以快速达到目标速度值。

下面的图显示的就是P值较大时的情况:

如何使你的直流电机闭环?(PID讲解)

如何使你的直流电机闭环?(PID讲解)

 

 

这个是P值较小的情况,P值较小的情况下,可以发现响应速度变慢了,P值较大的情况下,虽然响应速度比较快,但是振荡很严重。

2.D值的作用


出现振荡的时候我们就想去抑制振荡,如何抑制振荡呢?PID中的D的作用就体现出来了。当比较接近目标时,P的控制作用就比较小了。越接近目标,P的作用越温柔。有很多内在的或者外部的因素,使控制量发生小范围的摆动。D的作用就是让物理量的速度趋于0,只要什么时候,这个量具有了速度,D就向相反的方向用力,尽力抑制住振荡的变化。在自动控制原理这门学科中会提到专业的名词。现在我们引入偏差值的概念,令Bias=taget-position,令上一次求得的偏差值为Last_Bias。D项的计算公式为Position_KD*(Bias-Last_Bias)

   我用带入值的方法来解释D的作用:现在让当前的速度值为90,目标值为100,Bias=10。现在是为了接近目标值,所以D项的结果是增加PWM。现在增加后的速度变成了105,Bias=-5,Last_Bias=10,Bias-Last_Bias=-15,如果增加后的速度为110,Bias=-10,Last_Bias=10,Bias-Last_Bias=-20,D项的计算结果是为了减小PWM,快速抑制住PWM的过量增加,超过目标值越多,那么抑制能力越厉害。

 3.I值的作用

PID中的I的作用是为了消除静差,静差就是指,稳定状态下当前值和目标值的差为了让大家更清楚理解I的概念,之前看到一个很有趣的例子,这里借鉴一下:

假如有个人把我们的加热装置带到了非常冷的地方,开始烧水了。需要烧到50℃。

在P的作用下,水温慢慢升高。直到升高到45℃时,他发现了一个不好的事情:天气太冷,水散热的速度,和P控制的加热的速度相等了。这可怎么办?

P兄这样想:我和目标已经很近了,只需要轻轻加热就可以了。
D兄这样想:加热和散热相等,温度没有波动,我好像不用调整什么。
于是,水温永远地停留在45℃,永远到不了50℃。

作为一个人,根据常识,我们知道,应该进一步增加加热的功率。可是增加多少该如何计算呢?

设置一个积分量。只要偏差存在,就不断地对偏差进行积分(累加),并反应在调节力度上。

这样一来,即使45℃和50℃相差不太大,但是随着时间的推移,只要没达到目标温度,这个积分量就不断增加。系统就会慢慢意识到:还没有到达目标温度,该增加功率啦!

到了目标温度后,假设温度没有波动,积分值就不会再变动。这时,加热功率仍然等于散热功率。但是,温度是稳稳的50℃。

kI的值越大,积分时乘的系数就越大,积分效果越明显。

四:程序

/**************************************************************************
函数功能:位置式PID控制器
入口参数:编码器测量位置信息,目标位置
返回  值:电机PWM
根据位置式离散PID公式 
pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
e(k)代表本次偏差 
e(k-1)代表上一次的偏差  
∑e(k)代表e(k)以及之前的偏差的累积和;其中k为1,2,,k;
pwm代表输出
**************************************************************************/
int Position_PID (int position,int target)
{     
     static float Bias,Pwm,Integral_bias,Last_Bias;
     Bias=target-position;                                  //计算偏差
     Integral_bias+=Bias;                                     //求出偏差的积分
     Pwm=Position_KP*Bias+Position_KI*Integral_bias+Position_KD*(Bias-Last_Bias);       //位置式PID控制器
     Last_Bias=Bias;                                       //保存上一次偏差 
     return Pwm;                                           //增量输出
}

下面是增量式PID的具体执行程序:

/**************************************************************************
函数功能:增量PI控制器
入口参数:编码器测量值,目标速度
返回  值:电机PWM
根据增量式离散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)代表上一次的偏差  以此类推 
pwm代表增量输出
在我们的速度控制闭环系统里面,只使用PI控制
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)
**************************************************************************/
int Incremental_PI (int Encoder,int Target)
{     
     static float Bias,Pwm,Last_bias;
     Bias=Target-Encoder;                                  //计算偏差
     Pwm+=Velocity_KP*(Bias-Last_bias)+Velocity_KI*Bias;   //增量式PI控制器
     Last_bias=Bias;                                       //保存上一次偏差 
     return Pwm;                                           //增量输出
}


以上就是让小车速度保持目标值的算法分析,通过调整参数就可以达到电机闭环的效果了。

PID参数的调整方法,后续会更新!

五:总结

P的作用:快速达到目标值

I的作用:消除静差

D的作用:抑制振荡

码字不易,转载请注明出处,有不足的地方欢迎大家留言!!!文章来源地址https://www.toymoban.com/news/detail-408243.html

到了这里,关于如何使你的直流电机闭环?(PID讲解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32增量式pid直流电机调速(内附源码)

    STM32增量式pid直流电机调速(内附源码)

            目录 一. 1.硬件组成 2.模块分析         1.TB6612电机驱动模块         2.直流减速电机         3.电源稳压模块 二.接线 三.代码思路讲解(详见源码) 四.STM32cubmx配置 1.系统基础配置:(重要) 2.电机旋转方向引脚配置 3.TIM1每10ms触发一次的定时器中断 4.TI

    2024年02月16日
    浏览(12)
  • PID模块化__以stm32直流电机速度为例

    PID模块化__以stm32直流电机速度为例

    本篇使用到的基于这个STM32CubeMX 直流电机PID速度控制、HAL库、cubemx、PID、速度控制、增量式 由于上次使用的pid没有模块化,当多出使用pid的时候就会很麻烦 所以这次使用的模块化的 在main.c或者其他位置创建pid的变量 注意一定要在pid计算之前初始化 all_moto_pid_init ,不然会导

    2024年02月14日
    浏览(13)
  • STM32F103C8T6实现CAN通讯与直流编码电机转速闭环控制

    STM32F103C8T6实现CAN通讯与直流编码电机转速闭环控制

    本次实验目的是通过CAN发送目标转速与转向信息,接收方在接到CAN数据流后开始对直流编码电机进行转速闭环控制。我会尽量说清每个函数,注释每一句代码,希望能对大家有所帮助。 CAN通讯基于STM32自带CAN通讯模块,配合库函数使用十分方便。关于CAN通讯可以参考站内大佬

    2023年04月08日
    浏览(13)
  • [proteus]STM32F103单片机直流电机PID算法PWM波电机调速正反转Proteus仿真

    1、实现功能: (1)、基于STM32F103单片机PID算法PWM控制直流电机正反转调速,LCD1602显示转速等。可通过“加速”、“减速”按键修改“目标转速”并实时测量“实际转速”送到LCD1602上显示。 (2)、“启动”按键控制电机启动,默认启动电机是正转(示波器上的黄色PWM波)。 (3)、“

    2024年02月06日
    浏览(10)
  • 直流有刷电机位置环控制与位置速度双环控制(位置式PID)流程解析

    今天看野火的直流有刷电机pid控制的教程视频,整个代码实现过程看了好几遍后还是感觉云里雾里,尤其是速度环、位置环、位置速度双环这样看下来,虽然老师视频里该说的都说了,自己也能明确感受到位置环与位置速度双环是有区别的,但不好好捋一下还真没一下领略到

    2023年04月12日
    浏览(13)
  • STM32CubeMX 直流电机串级PID位置速度控制、HAL库、cubemx、PID、串级PID、位置控制、速度控制、双环控制

    STM32CubeMX 直流电机串级PID位置速度控制、HAL库、cubemx、PID、串级PID、位置控制、速度控制、双环控制

    提示:本文章的串级PID位置速度控制,是在前两篇文章速度控制,位置控制的基础上实现的,这一章节中不需要额外的cubemx的配置,只需要写简单的代码即可,复杂的地方在于串级pid的调试过程。 pid是我们在学习单片机中首先要学会的控制算法,而串级pid又是在单pid的基础上

    2024年02月14日
    浏览(16)
  • STM32单片机直流电机PID速度控制正反转控制(霍尔磁铁测速)LCD1602
  • 基于STM32F103C8T6使用Arduino IDE编程闭环控制4个带编码器的有刷直流电机

    基于STM32F103C8T6使用Arduino IDE编程闭环控制4个带编码器的有刷直流电机

    题记:标题有点长了,纯粹为了方便被检索到~~~本贴主要用于支持南方科技大学SDIM学院工业设计专业大三综合项目移动底盘学习,也是我自己按照费曼学习方法的一次尝试,用从底层搭建一个机器人底盘来复习自动控制原理。         由于工业设计专业没有开设嵌入式课程

    2024年02月05日
    浏览(14)
  • 大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制

    大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制

    官网:RoboMaster 机甲大师赛 芯片型号STM32F427IIH6   1)新建new project,选择开发板A型的芯片 2)打开外部高速时钟 这是我的时钟树配置 3)我选择用can总线指令控制,所以根据开发版A型原理图打开相应的接口 其中can1为电调专用接口,can2为DJI OnboardSDK和Robomaster UWB定位系统用  我

    2023年04月09日
    浏览(14)
  • 基于51单片机的PWM控制直流电机设计( proteus仿真+程序+报告+讲解视频)

    基于51单片机的PWM控制直流电机设计( proteus仿真+程序+报告+讲解视频)

    仿真图proteus 7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0031 基于51单片机的PWM控制直流电机设计 1.设计要求 采用51单片机作为核心控制器,控制直流电机的正转,反转,制动,停止。 2.功能要求 1)数码管显示当前转动方向和当前的PWM占空比0~100%。 2)电机

    2023年04月25日
    浏览(19)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包