PID算法讲解+PID电机闭环控制介绍

1.PID简介

PID是控制领域相当经典且重要的控制算法。

PID就是“比例(proportional)、积分(integral)、微分(derivative)”,是一种很常见的控制算法。它应用的范围相当之广。小到我们玩的无人机,平衡车,大到工业领域的温度、液位、流量控制,都出现了PID的身影。

f20f229bf16f40e6aae0b936b33eba9c.jpeg
PID控制框图

8a667fede5704f119c72c2b6ab736535.png
数学模型

1.1个人对PID的理解

个人理解的PID就是一个“跟随”算法。

让被控对象,比如温度,水位,速度,高度,压力等到达我们期望的值,并且保持住。

PID在实际使用中更像一个数学的二元函数,你只要输入你想要的值,当前值,在调节好参数的情况下,无需关心内部过程,直接使用PID算出的结果值送入到执行机构即可。

PID有3个值,设定值(期望值,给定值),实际值(测量值),输出值(结果值)。

这是不是很像我们数学中经常使用的函数,y=f(x,y),输入期望值,当前值,得到结果。

1.2 PID变形以及参考代码

PID存在非常多的变形,最基本的PID变形是增量式PID和位置式PID。还有其他的变形,如去掉PID某一部分的PD算法,PI算法,再有更高端一些的抗饱和PID,微分先行PID,自适应PID,还有模糊PID。这些PID算法万变不离其宗,只要掌握了基本PID使用规律,用什么样的PID都是一样的。

位置式和增量式PID略有区别,主要区别如下:

位置式PID控制器的输出是一个绝对值,即控制器对系统的控制作用量的绝对大小。它根据比例项、积分项和微分项直接计算出最终的输出值。

而增量式PID控制器的输出是一个增量值,即控制器对系统的控制作用量的变化量。它根据比例增量、积分增量和微分增量来计算最终的输出增量,然后将该增量值与前一时刻的输出值相加得到当前的输出值。

位置式PID的c语言参考代码如下:

// PID控制器结构体  
typedef struct 
{  
    float Kp;       // 比例系数  
    float Ki;       // 积分系数  
    float Kd;       // 微分系数  
    float setpoint; // 设定值  
    float integral; // 积分项  
    float prev_error; // 上一次误差  
} PID_Controller;  

// PID控制器初始化函数  
void PID_Init(PID_Controller *pid, float Kp, float Ki, float Kd, float setpoint) 
{  
    pid->Kp = Kp;  
    pid->Ki = Ki;  
    pid->Kd = Kd;  
    pid->setpoint = setpoint;  
    pid->integral = 0.0f;  
    pid->prev_error = 0.0f;  
}  

// PID控制器计算函数  
float PID_Compute(PID_Controller *pid, float measured_value) 
{  
    float error = pid->setpoint - measured_value; // 计算误差  
    pid->integral += error; // 更新积分项  
    float derivative = error - pid->prev_error; // 计算微分项  
    pid->prev_error = error; // 更新上一次误差  
    float output = pid->Kp * error + 
                   pid->Ki * pid->integral +
                   pid->Kd * derivative; // 计算PID输出  
    return output;  
}  

增量式PID的c语言参考代码如下:

// 增量式PID控制器结构体  

typedef struct
 {  
    float Kp;       // 比例系数  
    float Ki;       // 积分系数  
    float Kd;       // 微分系数  
    float prev_error; // 上一次误差  
    float prev_prev_error; // 上上一次误差  
} IncrementalPID_Controller;  

// 增量式PID控制器初始化函数  
void IncrementalPID_Init(IncrementalPID_Controller *pid, float Kp, float Ki, float Kd) {  
    pid->Kp = Kp;  
    pid->Ki = Ki;  
    pid->Kd = Kd;  
    pid->prev_error = 0.0f;  
    pid->prev_prev_error = 0.0f;  
}  

// 增量式PID控制器计算函数  
float IncrementalPID_Compute(IncrementalPID_Controller *pid, float setpoint, float measured_value) 
{  
    float error = setpoint - measured_value; // 计算当前误差  
    float delta_error = error - pid->prev_error; // 计算误差变化量  
    float increment= pid->Kp * (error - pid->prev_error) +   
                      pid->Ki *  error +   
                      pid->Kd * (delta_error - pid->prev_prev_error); // 计算增量  

/*//也有资料的说增量式pid应该是这样的(微分项不同),我没有研究太深,这里贴出来,仅供参考
    float increment= pid->Kp *(pid.error-pid.error_next)+
                     pid->Ki *pid.error+
                     pid->Kd *(pid.error-2*pid.error_next+pid.error_last);  
*/
    return increment; // 返回增量值  
} 

2.PID+编码器电机闭环控制介绍

做智能车的同学电机闭环控制直接采用增量式PI算法,方向控制直接采取位置式PD即可。这是无数前辈车友总结出的结果。

2.1编码器使用简介

编码器有很多种,有角速度编码器,正交编码器,方向编码器,绝对值编码器等。

智能车用的比较多的是正交,方向,绝对值这三种编码器,他们都属于脉冲编码器。

正交和方向编码器输出结果有方向,车轮正转输出正数,车轮反转输出负数。绝对值编码器不分正反转,只有正处输出。

脉冲编编码器根据输出范围分为1024线,512线,256线编码器等。他们的含义是编码器轴每转一圈,输出脉冲个数,我们配置单片机读取脉冲个数就可以。

以1024线编码器为例。当我间隔10毫秒读出编码器数值为100时,说明编码器在0.01秒钟,轴转动了100/1024≈0.1圈。

注意,是编码器轴转动了这么多圈,车轮转动还要考虑齿轮之间的齿轮比。

27f22c7dd4084cd99463af98ab209ebf.jpeg
智能车中使用编码器通过齿轮啮合获取车轮转速

2.2转速获取

智能车里面通过编码器获得车轮转速,具体原理如下。

首先,我们知道

eq?v%3D%5Cfrac%7Bdx%7D%7Bdt%7D

其中dx是我们在dt时间内运动的距离此处暂且理解为我们读取到的编码器的值(此处不再区分物理中的位移与路程,速度与速率)。其中dt越大,v就是平均速度,dt越小,v就趋近顺时速度。

我们将编码器放在单片机定时器中断中读取,比如我们每间隔10毫秒去读取一次编码器的值,读完了将它清空,那么我们就得到了在每10毫秒中编码器的旋转圈数。

(读取完要将寄存器清空,因为寄存器的值是累加的)

得到编码器旋转的圈数,再根据齿轮比算出轮胎转动圈数,再测量轮胎半径,理论上可以得到非常准确的车轮转速,但一般我们不这么做

因为没有意义,理论上经过上述处理换算的转速是有单位的,但是我们做智能车控制非常多的控制量都是模糊量,他根本没有单位,比如摄像头误差,比如电磁差比和误差。

我们常规处理直接在定时器中读取编码器值就好,不必做特殊处理。

因为当你的dt固定了,也就是你定时器中断的时间固定了,你的速度:

eq?v%3Dkdx

k是个比例系数。1/dt是定时器时间的倒数,b是齿轮比,以及车轮半径相关的系数,都是固定值,其中:

eq?k%3D%5Cfrac%7B1%7D%7Bdt%7D*b

也就是说你又是测编码器之间的齿轮比,又是测车轮的半径,求得的速度也不过是在编码器反馈的数据前乘上一个固定系数而已。完全没有什么实际意义。何况车轮还有可能打滑,磨损造成测量不准。

大家如果想知道车速,直接用尺子测赛道长度,然后用手机掐秒表算一下平均速度即可。

车子弯道肯定要减速,直道加速,所以也无法用部分路程速度计算,大家常说的三米车就是平均速度,所以直接秒表尺子即可。

2.3电机闭环控制

上面我们知道了如何获取电机转速,下面我们讲一讲如何控制电机转速。

042641c5f4db4170a41ab1dc5534833f.png
智能车电机

上面这张图是智能车最常用的电机。

他有两个接头,用来驱动电机。显然在电机两端施加电压越大,电机转速越快。

那么很简单,我只需要控制电机两端电压就可以控制电机转速。

比如相同的电机,我施加3V电压,他的转速肯定不如6v的电压转速快。

至于如何测量他的转速,我们使用上文提到的编码器外接齿轮啮合住电机输出端即可。

按照道理在一定区间内,电压与转速应该是呈现线性关系,实际情况有可能因为电机转动中发热,老化,电机磁铁退磁,齿轮啮合过紧等原因会有偏差。但是我给的电压越高,他转的越快,这一点是肯定没有问题的。

ef3a886b93444a06aaf752aa8d086b77.png
380电机参数图

该电机推荐电压7.2V,空载电流约630mA。(其实你电压给大一点也可以,只是电机更容易烧)

单片机所使用的电源一般都是3.3V或5V,驱动电流更是毫安级别,不可能驱动这个大家伙。

2.3.1 电机驱动

想要驱动电机,起码需要一个比较高的电压。

这里就想到了我们车上有一块电池,用来给所有外设供电。

这样就有了7.4v的电压,把电机线接上电池,电机可以转,电池电压降低,电机转速变慢。

但是显然这样不符合我们的控制需求,不能自由控制电机转速。

这时候我们就需要一个电机驱动。

47f6f8e7082e4b89b6f2cd188146ab27.png
一款电机驱动

上面的电机驱动有四组对外接口。

一个输入电源,用来连接电池,两个输出接口,用来连接电机(一辆C车有两个电机),还有一组排针接口,作为输入控制信号。

通过输入信号,控制输出给电机的输出电压,这就是驱动。

用3.3v的电压,控制7.4v(此处电压取决于电池电压)的电机。

2.3.2 PWM

对于一个电机来说,驱动信号是两路信号。这两路信号可以控制电机的转速和方向。

根据驱动器芯片的不同这两路信号略微有点区别。

8bca83a56f07428bb99a1c0ec3ca6478.png
电机的两种驱动方式

无论是哪一种控制信号,想要控制速度,都需要控制PWM占空比。

这里简单介绍一下PWM,等后续有空再出一篇文章专门讲一讲PWM。

PWM(Pulse width modulation)也叫脉宽调制,可以用示波器测一下,他的样子就是一连串的矩形波。

他有两个参数,一个是频率,一个是占空比。

大家看驱动参数那张图可以在下面看到小字,不同型号的电机他的工作频率不一样,这个是电机的固有特性,大家按照要求设置即可。

我们主要看看占空比。

前面我们说,我们通过PWM可以控制电机转速。我们又知道,电机的电压变化会导致电机转速变化。我们能否得到结论,PWM就是控制的电机两端电压来控制的转速呢?

答案是可以的。

占空比是指在一个周期内,高电平(或低电平)所占的时间长度,他的范围是0%-100%

413987fd2ef04da49eff7c7eeada1685.jpeg
PWM等效电压示意图

上图中,纵坐标是电压,横坐标其实是时间。

第一行,高电平时间占周期的50%,那么他等效电压就是5V*50%=2.5V

等效2.5V的电压施加到电机上。

第二行同理,75%的占空比,那么5V*75%=3.75V,3.75V的电压将被施加到电击上。

第三行同理,20%的占空比,那么5V*20%=1V,1V的电压将被施加到电击上。

我们将纵坐标换成我们的电池电压,我们改变占空比就可以产生7.4v*x%就的电压,可以控制电机转速。

所谓驱动,就是使用3.3V的PWM波,让输出端输出频率,占空比相同的以电池电压为单位的PWM波。

2.3.3 开环

开环控制一般来说就是没有反馈的控制。

现在我们已经可以通过调整PWM占空比(或脉宽)控制车轮转速。在直道处,占空比给高一点,弯道处占空比给小一点,这样就实现了转速控制。

但是这样有个问题,车子是有惯性的。电机的加速减速也是需要时间反应的,很有可能在直道想要提速,加大了占空比,结果车子加速不及时,已经到了弯道速度才加起来。又到了弯道,需要减速,然后一个减速不及时冲了出去。

开环控制是属于能用,但不好用的情况。

主要是因为惯性的存在,导致加速不及时,减速刹不住。

2.3.3 闭环

好了,我们讲了这么久,终于到了PID+PWM闭环控制车轮转速。

开环更多的是定性控制,闭环可以做到定量控制转速。

还记得我们上面讲过的测速吗,如果是开环控制的话你可以看到在占空比不变的情况下速度值其实是很不稳定的。而且根据电池的电量不同,相同的占空比得到的转速也不同。在开环状态下其实测转速意义不大,毕竟你只能看,也不能用。

所谓闭环,就是反馈控制。每算出一次占空比输出后,测一下转速。查看当前转速和我期望转速差距大不大,如果当前转速还是与我期望转速差距过大,那么我就增大占空比输出,如果过小,我可以减小占空比,甚至可以让电机反转,给车子一个反向的力,让他迅速刹车。

那么我的期望值就是我期望车轮转速,无论是空载还是负载,都可以保证速度的稳定。

这个输出占空比的计算,是由PID完成。

使用时,输入两个参数,当前转速,期望转速,输出一个参数,占空比。

随后在电机驱动函数中,将刚算出的占空比应用到电机中去,就可以做到对于转速的准确控制。

(更加方便的是,我甚至不需要知道每次的占空比是多少,就像我们在开车的时候,我想保持60km/h的车速,我不用关心我油门需要踩下几厘米,也无需关心我车子载了几个人,需要调整我的油门深度,我只要关心我当前速度到没到60,没到我就踩油门,到了我就踩刹车,差的多我就踩深一点,超速我就刹车猜猛一点。如此操作,若干次后,我就可以保持车速在任意我想要的区间,pid就是这个原理,当然需要找到合适的pid参数才可以实现。)

注意这两者的控制频率关系,我个人习惯是电机转速读取频率要大于等于控制频率。当转速读取的频率过低,反馈的意义就不大了。

最后补充一下,PID的占空比输出和电机转速频率的关系。

比如我10毫秒读取一次电机转速,PID20毫秒控制一次占空比,和我20毫秒读取一次电机转读,PID20毫秒控制一次占空比。

这两者肯定会有很大的不同,哪怕是客观上一样的转速,10毫秒读取一次编码器,和20毫秒读取一次编码器读取到的编码器的值理论上是有两倍的差距的。

那么我们如何来克服这些差距的影响?

答案是调参。

电机控制一般采用增量式PI,那么就需要调整P和I系数,来消除读取频率,电机种类这些差距,做到编码器数值与占空比相对应。

至于调参,那就是一门玄学.

2.3.4 电机控制中PWM与PID的联系

首先对于电机而言,在接好驱动的情况下,给出两路控制信号,电机即可根据控制信号的设置进行转动,这个控制信号就是PWM,不用PID完全可以。

但想要更好的控制转速,更精确的控制转速,我们需要经常改变控制信号,比如某时,信号让电机速度变快,某时让他变慢,某时保持不变,这些都需要改变控制信号,而对于电机来说,控制信号就控制PWM脉宽,或者说PWM占空比(这里只要改变转速的话,改变PWM脉宽就够了,如果改变方向的话需要考虑驱动方式,上文有提到,这里不再重复)。

而PID就是去计算PWM脉宽是多少的一个算法。

所以答案出来了,PWM与PID的联系是PID计算出的结果是一个占空比,PWM将使用这个占空比改变脉宽,从而控制电机转速。

2.3.5 调参

一般来说,P代表比例,他决定反应速度,I代表积分,是对误差的累计,代表稳定后的波动范围,D代表微分,代表对误差变化的趋势,可以理解为预判。

当然,一切都要看实际情况而定。

具体参数也没什么范围而言,控制周期5毫秒和10毫秒,他的参数也不见得是两倍关系。

我的车参数在30左右,我队友的车子参数在几万,所以不同平台,不同周期,不同设备之间参数并不通用。

我在一些视频评论区中看到,有些人说pid可以通过数学建模,然后计算传递函数,从而计算出理论最优值。

但是根据我的与一些智能车强校,国一车手,甚至是我上班公司的985硕士工程师,十年工作经验老工程师,甚至是教我自控原理课的老师交流。实际使用的时候,没有人会去建模,大家都是凭着感觉在调参,而且PID参数没有最优,只要调到合适就好。

3.其他领域的PID控制

类似的,如果我想要控制某个水缸的水温,那我需要读取当前的水温,设置我期望的温度,输出量可以是加热棒的功率。

比如焊接电路板的烙铁就是这个原理,在到达设定值附近,会有一颗加热灯在一闪一闪,就是在间歇性加热,保证烙铁头温度在设定的范围附近。

比如液位控制,那就读取当前水位,设置期望水位,输出量就可以是阀门的开度(视阀门类型而定)。

其他领域基本都是同理,由于我也没有调过,就不多说了。

4.写给初学者的话

每次我在这种教学性文章后面,总有人说可否提供工程代码作参考。

我想说的是,写代码思想重要性远远大于代码。代码只是一种表达形式,即使我提供给你我的工程代码,即使控制芯片一样,但凡我换个引脚你就无法使用代码。所以说有什么意义呢?同样的算法,可以有无数种代码表达。

学习更重要的是思想,而不是外在。

希望能够帮助到一些人。

本人菜鸡一只,各位大佬发现问题欢迎留言指出。

PID电机控制目录 第1 章 数字PID 控制 1.1 PID 控制原理 1.2 连续系统的模拟PID 仿真 1.3 数字PID 控制 1.3.1 位置式PID 控制算法 1.3.2 连续系统的数字PID 控制仿真 1.3.3 离散系统的数字PID 控制仿真 1.3.4 增量式PID 控制算法及仿真 1.3.5 积分分离PID 控制算法及仿真 1.3.6 抗积分饱和PID 控制算法及仿真 1.3.7 梯形积分PID 控制算法 1.3.8 变速积分PID 算法及仿真 1.3.9 带滤波器的PID 控制仿真 1.3.10 不完全微分PID 控制算法及仿真 1.3.11 微分先行PID 控制算法及仿真 1.3.12 带死区的PID 控制算法及仿真 1.3.13 基于前馈补偿的PID 控制算法及仿真 1.3.14 步进式PID 控制算法及仿真 第2 章 常用的PID 控制系统 2.1 单回路PID 控制系统 2.2 串级PID 控制 2.2.1 串级PID 控制原理 2.2.2 仿真程序及分析 2.3 纯滞后系统的大林控制算法 2.3.1 大林控制算法原理 2.3.2 仿真程序及分析 2.4 纯滞后系统的Smith 控制算法 2.4.1 连续Smith 预估控制 2.4.2 仿真程序及分析 2.4.3 数字Smith 预估控制 2.4.4 仿真程序及分析 第3 章 专家PID 控制和模糊PID 控制 3.1 专家PID 控制 3.1.1 专家PID 控制原理 3.1.2 仿真程序及分析 3.2 模糊自适应整定PID 控制 3.2.1 模糊自适应整定PID 控制原理 3.2.2 仿真程序及分析 3.3 模糊免疫PID 控制算法 3.3.1 模糊免疫PID 控制算法原理 3.3.2 仿真程序及分析 第4 章 神经PID 控制 4.1 基于单神经元网络的PID 智能控制 4.1.1 几种典型的学习规则 4.1.2 单神经元自适应PID 控制 4.1.3 改进的单神经元自适应PID 控制 4.1.4 仿真程序及分析 4.1.5 基于二次型性能指标学习算法的单神经元自适应PID 控制 4.1.6 仿真程序及分析 4.2 基于BP 神经网络整定的PID 控制 4.2.1 基于BP 神经网络的PID 整定原理 4.2.2 仿真程序及分析 4.3 基于RBF 神经网络整定的PID 控制 4.3.1 RBF 神经网络模型 4.3.2 RBF 网络PID 整定原理 4.3.3 仿真程序及分析 4.4 基于RBF 神经网络辨识的单神经元PID 模型参考自适应控制 4.4.1 神经网络模型参考自适应控制原理 4.4.2 仿真程序及分析 4.5 基于CMAC(神经网络)与PID 的并行控制 4.5.1 CMAC 概述 4.5.2 CMAC 与PID 复合控制算法 4.5.3 仿真程序及分析 4.6 CMAC 与PID 并行控制的Simulink 仿真 4.6.1 Simulink 仿真方法 4.6.2 仿真程序及分析 第5 章 基于遗传算法整定的PID 控制 5.1 遗传算法的基本原理 5.2 遗传算法的优化设计 5.2.1 遗传算法的构成要素 5.2.2 遗传算法的应用步骤 5.3 遗传算法求函数极大值 5.3.1 遗传算法求函数极大值实例 5.3.2 仿真程序 5.4 基于遗传算法PID 整定 5.4.1 基于遗传算法PID 整定原理 5.4.2 基于实数编码遗传算法PID 整定 5.4.3 仿真程序 5.4.4 基于二进制编码遗传算法PID 整定 5.4.5 仿真程序 5.5 基于遗传算法摩擦模型参数辨识的PID 控制 5.5.1 仿真实例 5.5.2 仿真程序 第6 章 先进PID 多变量解耦控制 6.1 PID 多变量解耦控制 6.1.1 PID 解耦控制原理 6.1.2 仿真程序及分析 6.2 单神经元PID 解耦控制 6.2.1 单神经元PID 解耦控制原理 6.2.2 仿真程序及分析 6.3 基于DRNN 神经网络整定的PID 解耦控制 6.3.1 基于DRNN 神经网络参数自学习PID 解耦控制原理 6.3.2 DRNN 神经网络的Jacobian 信息辨识 6.3.3 仿真程序及分析 第7 章 几种先进PID 控制方法 7.1 基于干扰观测器的PID 控制 7.1.1 干扰观测器设计原理 7.1.2 连续系统的控制仿真 7.1.3 离散系统的控制仿真 7.2 非线性系统的PID 鲁棒控制 7.2.1 基于NCD 优化的非线性优化PID 控制 7.2.2 基于NCD 与优化函数结合的非线性优化PID 控制 7.3 一类非线性PID 控制器设计 7.3.1 非线性控制器设计原理 7.3.2 仿真程序及分析 7.4 基于重复控制补偿的高精度PID 控制 7.4.1 重复控制原理 7.4.2 基于重复控制补偿的PID 控制 7.4.3 仿真程序及分析 7.5 基于零相差前馈补偿的PID 控制 7.5.1 零相差控制原理 7.5.2 基于零相差前馈补偿的PID 控制 7.5.3 仿真程序及分析 7.6 基于卡尔曼滤波器的PID 控制 7.6.1 卡尔曼滤波器原理 7.6.2 仿真程序及分析 7.6.3 基于卡尔曼滤波器的PID 控制 7.6.4 仿真程序及分析 7.7 单级倒立摆的PID 控制 7.7.1 单级倒立摆建模 7.7.2 单级倒立摆控制 7.7.3 仿真程序及分析 7.8 吊车-双摆系统的控制 7.8.1 吊车-双摆系统的建模 7.8.2 吊车-双摆系统的仿真 第8 章 灰色PID 控制 8.1 灰色控制原理 8.1.1 生成数列 8.1.2 GM 灰色模型 8.2 灰色PID 控制 8.2.1 灰色PID 控制的理论基础 8.2.2 连续系统灰色PID 控制 8.2.3 仿真程序及分析 8.2.4 离散系统灰色PID 控制 8.2.5 仿真程序及分析 8.3 灰色PID 的位置跟踪 8.3.1 连续系统灰色PID 位置跟踪 8.3.2 仿真程序及分析 8.3.3 离散系统灰色PID 位置跟踪 8.3.4 仿真程序及分析 第9 章 伺服系统PID 控制 9.1 伺服系统低速摩擦条件下PID 控制 9.1.1 Stribeck 摩擦模型描述 9.1.2 一个典型伺服系统描述 9.1.3 仿真程序及分析 9.2 伺服系统三环的PID 控制 9.2.1 伺服系统三环的PID 控制原理 9.2.2 仿真程序及分析 9.3 二质量伺服系统的PID 控制 9.3.1 二质量伺服系统的PID 控制原理 9.3.2 仿真程序及分析 第10 章 PID 实时控制的C++语言设计及应用 10.1 M 语言的C++转化 10.2 基于C++的三轴飞行模拟转台伺服系统PID 实时控制 10.2.1 控制系统构成 10.2.2 系统各部分功能的软件设计 10.2.3 仿真程序及分析 参考文献
### 如何优化PID控制算法中的角速度闭环参数 在调整PID控制器中关于角速度的闭环参数时,可以采用基于误差反馈的方法动态调整比例(P)、积分(I)和微分(D)系数。具体方法是在基础PID控制算法之上引入自适应机制,依据角速度误差大小实时调节这些参数[^1]。 对于PID参数的确立,可以通过构建并求解一个优化问题来实现。此过程涉及设定目标函数以及约束条件,使得最终选定的一组P、I、D值能够最小化系统响应与预期行为之间的差异[^2]。 当应用于关节角度闭环控制系统时,自适应PID库能自动处理PID参数的调整工作,确保即使面对系统的变动也能维持良好的性能表现。输入信号代表当前测量到的角度位置,而设定点(setpoint)则表示希望达到的目标角度;经过自适应PID运算后得出的输出(output),会被用来指导无刷直流(BLDC)电机的动作[^3]。 为了使PID控制器更好地服务于电机的速度调控,在实际应用过程中往往还需要考虑将PID计算所得的结果转换成适合PWM调制的比例因子——即占空比(duty cycle)。这样做的目的是让PWM模块可以根据不同的需求灵活地改变施加给电机电压的有效时间宽度,进而精准掌控其运转速率[^4]。 ```python def pid_controller(error, last_error, integral, Kp, Ki, Kd): # 更新累积误差 integral += error # 计算本次迭代应产生的变化量 derivative = error - last_error # 输出作为PWM占空比使用的控制指令 output = (Kp * error) + (Ki * integral) + (Kd * derivative) return output, error # 返回新旧两次误差以便下次循环使用 ```
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值