stm32直流电机控制—PID算法篇

2023-05-16

stm32直流电机控制—PID算法篇

  • 一、常用的控制算法
    • 1.控制系统的基本结构:
    • 2.常用控制算法:位式控制
      • ①二位式控制算法
      • ②.具有回差的二位式控制算法
      • ③三位式控制算法
      • ④小结
  • 二、PID控制算法
    • 1.PID控制算法的基本思想
    • 2.PID算法分析
    • 3.PID算法数学模型
    • 4.小结
  • 三、STM32代码控制说明
    • 1.硬件电路搭建
    • 2.软件实现

一、常用的控制算法

1.控制系统的基本结构:


控制系统的基本结构如图:
在这里插入图片描述

控制目的:
控制的根本目的就是要使控制对象当前的状态值与用户的设定值相同(最大限度的接近)。

基本思想:
用户设定值SV与被控制对象当前的值PV两者同时送入由特定硬件电路模型或特定的软件算法组成的控制算法逻辑中,利用不同的控制算法对SV和PV进行分析、判断、处理,从而产生当前应该输出的控制信号OUT,控制信号经过执行机构施加到控制对象上,从而产生预期的控制效果。


2.常用控制算法:位式控制

①二位式控制算法

二位式控制算法具体控制逻辑如图所示:

在这里插入图片描述
特点:
a. 二位式控制算法输出的控制量只有高低2种状态。

b. 执行机构使控制对象要不全额工作,要不就停止工作。当PV低于SV时全额工作,PV大于或等于SV时就彻底停止工作。如果控制对象是一个1000W的加热器,温度不到时就1000W全功率运行,温度达到时就停止工作。

c. 由于环境因素或控制系统传输延时或者控制对象本身的惯性等因素,控制效果往往是PV在SV的上下有一个较大的波动。

d. 在PV接近SV的临界点时,控制输出信号OUT往往在H和L之间频繁转换,导致执行部件的触点频繁开关动作,易产生干扰及缩短执行部件的寿命。


②.具有回差的二位式控制算法

具有回差的二位式控制算法具体控制逻辑如图所示:
在这里插入图片描述
特点:
a. 取SV的正负10%左右作为回差调节上下限,高于上限才开始输出L,低于下限才开始输出H;

b.避免了一般二位式控制算法在临界点时执行部件频繁动作。

c.因为控制对象只有全额运行或不运行两种状态,仍然存在一般二位式控制算法的缺点:PV总是在SV附近波动。


③三位式控制算法

三位式控制算法具体控制逻辑如图所示:
在这里插入图片描述
特点:

a.在二位式控制的基础上对控制对象的功率分成0功率(停止工作)、半功率、全功率三种情况(即三位)。

b.当前值低于设定值一定比例(一般10%)时OUT1和OUT2同时起控制作用,控制对象全功率运行;

c.当前值在设定值的正负10%范围时,OUT1单独作用,工作于半功率状态;

d.当前值达到或超过设定值时OUT1和OUT2都停止输出,控制对象停止工作。

e.相对一般二位式控制算法,三位式算法对控制对象的当前状态值做了简单的分析,并根据不同的当前状态值输出不同的控制信号。能够较好的对输出产生控制效果。


④小结

位式控制的主要特征:
a.控制算法只关注控制当前的状态值(PV)与设定值之间的差值—二者当前有差值就输出控制信号,二者当前无差值就不输出控制信号。

b…位式控制算法的输出信号状态单一,只输出了高低两种状态,这两种状态对应着控制对象的工作与不工作----如果是温度控制系统,就是加热器加热与不加热。

c.由于控制系统自身的延时或者控制对象自身的惯性,位式控制算法只能使控制对象当前的状态值在设定值附件波动,不能很好的跟踪在设定值的附近甚至相等。


二、PID控制算法

1.PID控制算法的基本思想

PID控制控制算法具体控制逻辑如图所示:
在这里插入图片描述
PID算法是一种具有预见性的控制算法,其核心思想是:

①. PID算法不但考虑控制对象的当前状态值(现在状态),而且还考虑控制对象过去一段时间的状态值(历史状态)和最近一段时间的状态值变化(预期),由这3方面共同决定当前的输出控制信号;

②.PID控制算法的运算结果是一个数,利用这个数来控制被控对象在多种工作状态(比如加热器的多种功率,阀门的多种开度等)工作,一般输出形式为PWM,基本上满足了按需输出控制信号,根据情况随时改变输出的目的。


2.PID算法分析

设某控制系统:用户设定值为SV(也就是希望通过PID控制算法使被控制对象的状态值保持在SV的附件)。

①从系统投入运行开始,控制算法每隔一段时间对被控制对象的状态值进行采样。由此,可得到开机以来由各个采样时间点被控制对象的状态值所形成的数据序列:
X1,X2, X3, X4, … Xk-2,Xk-1,Xk
说明:
X1:开机以来的第一次采样值
Xk: 目前的采样值(最近一次的采样值)
2>从这个采样值序列中提取出三方面信息:
①当前采样值Xk与用户设定值SV之间的差值:Ek
Ek =Sv-Xk

分析Ek:
Ek>0:说明当前状态值未达标
Ek=0:说明当前控制状态值正好满足要求
Ek<0:说明当前状态值已经超标

结论:Ek反应了控制对象当前值与设定值的偏差程度,可以根据Ek的大小对输出信号OUT进行调整:偏差程度大OUT增大,偏差程度小OUT减小。即输出信号的强弱与当前偏差程度的大小成比例,所以根据Ek的大小来给出控制信号OUT的当前值的算法称为比例控制(Proportion)。用数学模型可以表示为:

POUT=(Kp*Ek)+Out0

Kp:一般称之为比例系数,可以理解为硬件上的放大器(或衰减器),适当选取Kp将当前误差值Ek

按一定的增益放大或缩小,以提高控制算法的相应速度。
Out0:是一个常数,目的是为了当Ek为0时,确保输出信号不为0,以不至于在当前值与设定值相等时控制器输出信号OUT为0,系统处于无控制信号的失控状态。
②将投入运行以来的各个采样值都与设定值相减,可得到开机以来每个采样时刻的偏差序列数据:
E1,E2,E3 …Ek-2,Ek-1,Ek

说明:
E1:开机的第一个采样点与设定值的偏差
E1=SV-X1;
E2=SV-X2;

EK-2=SV-XK-2;
EK-1=SV-XK-1;
Ek: 当前的采样值与设定值的偏差
EK=SV-XK
分析开机以来的误差序列:
每个偏差值可能有:>0,<0,=0这三种可能的值,因为从开机到现在,控制算法不断输出控制信号对被控对象进行控制,导致了过去这段时间有时候超标(Ex<0),有些时候未达标(Ex>0),有时候正好满足要求(Ex=0);如果将这些偏差值进行累加求代数和得到Sk,即:
Sk=E1+E2+E3+…+Ek-2+Ek-1+Ek
分析Sk:
Sk>0:过去大多数时候未达标
Sk=0:过去控制效果较理想
Sk<0:过去大多数时候已经超标

结论:1.通过对Sk的分析,可以对控制算法过去的控制效果进行综合评估。体现了控制算法按照原来的方式输出的控制信号导致了现在的控制结果,所以应该利用这个值来对当前要输出的控制信号OUT进行修正,以确保控制对象会在将来的一小段时间尽快达到用户设定的值。
2.Sk实际上是过去每个时间点的误差相加,与数学上的定积分运算类似,因此根据Sk对输出信号进行调节的算法称积分(integral)算法。所以积分控制的数学模型为:
IOUT=(kp* ((1/Ti)Exdt))+Out0

Kp是一常数,其目的类似硬件上的放大器,用于将Sk放大或衰减;
Out0是一常数,为了在历史积分偏差值为0时确保系统有一个输出值,避免失控;
Ti 是积分时间常数,取值越大会导致输出量OUT会越小,可理解为历史上已经很久的误差值都影响了当前的输出信号。取值越小,输出OUT会越强烈,可理解为积分只考虑了最近一段时间的误差。
实际中,如果系统已经运行“很长”一段时间了,那些早期采样的偏差值可以忽略他们对当前控制的影响,所以应该根据情况选择合理的Ti值方能得到良好的控制效果。
③最近两次的偏差之差 Dk

Dk=Ek-Ek-1

说明:
Ek:当前的偏差
Ek-1: 基于当前的前一个采样时刻的偏差值(即上一次的偏差值);
分析Dk:

Dk>0:说明从上一采样时刻到当前误差有增大趋势
Dk=0:说明从上一采样时刻到当前误差平稳
Dk<0:说明从上一采样时刻到当前误差有减小趋势
在这里插入图片描述

结论:
1. Dk能够说明从上次采样到当前采样的这段时间被控制对象的状态变化趋势,这种变化的趋势很可能会在一定程度上延续到下一个采样时间点,所以可以根据这个变化趋势(Dk的值)对输出信号OUT进行调整,达到提前控制的目的。
2. Dk形如数学上的微分运算,反应了控制对象在一段时间内的变化趋势及变化量,所以利用Dk对控制器输出信号进行调节的算法称为微分(differential)算法。可以用数学模型表达为:
DOUT=Kp*(Td(de/dt))+Out0
Kp:为一常数,可理解为硬件上的放大器或衰减器,用于对输出信号OUT的增益进行调整;
Out0:为一常数,为了在Dk为0时确保OUT都有一个稳定的控制值,避免失控。
Td:叫微分时间常数,(犹如硬件上电感器的自感系数)Td越大导致OUT增大,对输出信号产生强烈的影响。

3>PID算法的形成
1.比例、积分、微分三种算法的优缺点分析:

POUT=(KpEk)+ Out0 --比例算法
IOUT=kp
( (1/Ti) Exdt)+Out0 --积分算法
DOUT=Kp*(Td(de/dt))+Out0 --微分算法

比例算法: 只考虑控制对象当前误差,当前有误差才输出控制信号,当前没有误差就不输出控制信号,也就是说只要偏差已经产生了比例算法才采取措施进行调整,所以单独的比例算法不可能将控制对象的状态值控制在设定值上,始终在设定值上下波动;但是比例控制反应灵敏,有误差马上就反应到输出。
积分算法:考虑了被控制对象的历史误差情况,过去的误差状况参与了当前的输出控制,但是在系统还没有达到目标期间,往往会因为这些历史的误差对当前的控制产生了干扰(即拖后腿),使用不当反而搅乱当前的输出。但是在系统进入稳定状态后,特别是当前值与设定值没有偏差时,积分算法可以根据过去的偏差值输出一个相对稳定的控制信号,以防止产生偏离目标,起到打预防针的效果。
微分算法:单纯的考虑了近期的变化率,当系统的偏差趋近于某一个固定值时(变化率为0),微分算法不输出信号对其偏差进行调整,所以微分算法不能单独使用,它只关心偏差的变化速度,不考虑是否有偏差(偏差变化率为0时偏差不一定是0).但是微分算法能获得控制对象近期的变化趋势,它可以协助输出信号尽早的抑制控制对象的变化。可以理解为将要有剧烈变化时就大幅度调整输出信号进行抑制,避免了控制对象的大幅度变化。
以上三种算法综合起来产生一个当前的控制量对控制对象进行控制,它们的优缺点互补,即形成经典的PID算法。


3.PID算法数学模型

OUT=POUT+IOUT+DOUT

即:
OUT=((KpEk)+ Out0)+(kp ( (1/Ti) Exdt)+Out0)+ (Kp*(Td(de/dt))+Out0)

整理该式子得到:将各项的Out0归并为OUT0。

OUT=kp(Ek+((1/Ti)Exdt))+(Td(de/dt)))+OUT0
3.PID算法在单片机中的应用
1)PID算法在单片机中应用时,对积分和微分项可以作近似变换:
对于积分项可改写成:
n
I =1/Ti∑EkT
k=0
即用过去一段时间的采样点的偏差值的代数和的代替积分。
T是采样周期,也叫控制周期,每隔T时间段进行一次PID计算。
对于微分项可改写成:
D=TD
((Ek-Ek-1)/T)
Ek:本次偏差,Ek-1上次的偏差值
2)位置式PID算法数学模型
由此可得到单片机中PID算法的表达式:
OUT=kp(Ek+((1/Ti)Exdt))+(Td(de/dt)))+OUT0
=>
OUT=
n
Kp(En+(1/Ti∑EkT)+(TD((Ek-Ek-1)/T)))+out0
k=0

进一步展开得:

n
OUT=(KpEk) + (Kp(T/Ti)∑Ek) +(Kp*(TD/T)(EK-Ek-1)) +OUT0
k=0

令 Ki= Kp*(T/Ti);
KD=(Kp*(TD/T)
故:
n
OUT=(Kp*Ek) + (Ki∑Ek) +(KD(EK-Ek-1)) +OUT0
k=0

程序设计时利用C语言或汇编语言可以方便实现这个计算公式。OUT即为本次运算的结果,利用OUT可以去驱动执行机构输出对应的控制信号,例如温度控制就可以控制PWM的宽度,电磁阀就可以改变电磁线圈电流以改变阀门开度,或者是可控硅的导通角度等;
这种PID算法计算出的结果(OUT值)表示当前控制器应该输出的控制量,所以称为位置式(直接输出了执行机构应该达到的状态值)。

3)增量式PID算法
位置式PID算法计算量较大,比较消耗处理器的资源。在有些控制系统中,执行机构本身没有记忆功能,比如MOS管是否导通完全取决于控制极电压,可控硅是否导通取决于触发信号,继电器是否接通取决于线圈电流等,只要控制信号丢失,执行机构就停止,在这些应用中应该采用位置式PID。
也有一些执行机构本身具有记忆功能,比如步进电机,即使控制信号丢失,由于其自身的机械结构会保持在原来的位置等,在这些控制系统中,PID算法没有必要输出本次应该到达的真实位置,只需要说明应该在上次的基础上对输出信号做多大的修正(可正可负)即可,这就是增量式PID算法。
增量式PID计算出的是应该在当前控制信号上的调整值,如果计算出为正,则增强输出信号;如果计算出为负则减弱输出信号。
增量式PID算法数学模型:
如果用OUTK-1表示上次的输出控制信号值,那么当前的输出值应该为OUTk,这两者之间的关系为:

OUTK=OUTk-1+ △OUT
△OUT即为应该输出的增量值;
上式变形得:
△OUT= OUTK- OUTk-1
本次的位置式算法输出:
n
OUTk=(KpEk) + (Ki∑Ek) +(KD(EK-Ek-1)) +OUT0 --1式
k=0
上次的位置式算法输出:
n-1
OUTk-1=(Kp
Ek-1) +(Ki∑Ek) +(KD(EK-1-Ek-2)) +OUT0–2式
k=0
上述1式减2式即得到相邻两次的增量:
如前所述:
Ki= Kp*(T/Ti);
KD=(Kp*(TD/T)
△OUT= OUTK- OUTk-1=
kp(EK-EK-1)+((KpT)/Ti)Ek+(((KpTD)/T)*(Ek-2Ek-1+Ek-2))
EK:本次的偏差;
Ek-1:上次的偏差
Ek-2:上上次的偏差
Kp:算法增益调节
Ti :积分时间
TD: 微分时间常数
结论:
增量式PID的计算只需要最近3次的偏差(本次偏差,上次偏差,上上次偏差),不需要处理器存储大量的历史偏差值,计算量也相对较少,容易实现。

4)关于Ti和TD的理解:
在PID控制算法中,当前的输出信号由比例项,积分项,微分项共同作用形成,当比例项输出不为0时,如果积分项对运算输出的贡献作用与比例项对运算对输出的贡献一样时(即同为正或同为负时),积分项相当于重复了一次比例项产生作用的时间,这个
时间就可以理解为积分时间。
当比例项不为0时,如果微分项在一段时间里计算的结果与比例项对输出的贡献相同(即同为正或同为负)时,微分项相当于在一段时间里重复了比例项的作用,这段时间可理解为就是微分时间。
实际应用中应该合理选择Kp,Ti,Td以确保三者对输出的贡献平衡,从而使控制对象在设定值的附近。


4.小结

4PID是比例、积分、微分的简称,PID控制的难点不是编程,而是控制器的参数整定。参数整定的关键是正确地理解各参数的物理意义,PID控制的原理可以用人对炉温的手动控制来理解。阅读本文不需要高深的数学知识。
1.比例控制
有经验的操作人员手动控制电加热炉的炉温,可以获得非常好的控制品质,PID控制与人工控制的控制策略有很多相似的地方。
下面介绍操作人员怎样用比例控制的思想来手动控制电加热炉的炉温。假设用热电偶检测炉温,用数字仪表显示温度值。在控制过程中,操作人员用眼睛读取炉温,并与炉温给定值比较,得到温度的误差值。然后用手操作电位器,调节加热的电流,使炉温保持在给定值附近。
操作人员知道炉温稳定在给定值时电位器的大致位置(我们将它称为位置L),并根据当时的温度误差值调整控制加热电流的电位器的转角。炉温小于给定值时,误差为正,在位置L的基础上顺时针增大电位器的转角,以增大加热的电流。炉温大于给定值时,误差为负,在位置L的基础上反时针减小电位器的转角,并令转角与位置L的差值与误差成正比。上述控制策略就是比例控制,即PID控制器输出中的比例部分与误差成正比。
闭环中存在着各种各样的延迟作用。例如调节电位器转角后,到温度上升到新的转角对应的稳态值时有较大的时间延迟。由于延迟因素的存在,调节电位器转角后不能马上看到调节的效果,因此闭环控制系统调节困难的主要原因是系统中的延迟作用。
比例控制的比例系数如果太小,即调节后的电位器转角与位置L的差值太小,调节的力度不够,使系统输出量变化缓慢,调节所需的总时间过长。比例系数如果过大,即调节后电位器转角与位置L的差值过大,调节力度太强,将造成调节过头,甚至使温度忽高忽低,来回震荡。
增大比例系数使系统反应灵敏,调节速度加快,并且可以减小稳态误差。但是比例系数过大会使超调量增大,振荡次数增加,调节时间加长,动态性能变坏,比例系数太大甚至会使闭环系统不稳定。
单纯的比例控制很难保证调节得恰到好处,完全消除误差。
2.积分控制
PID控制器中的积分对应于图1中误差曲线 与坐标轴包围的面积(图中的灰色部分)。PID控制程序是周期性执行的,执行的周期称为采样周期。计算机的程序用图1中各矩形面积之和来近似精确的积分,图中的TS就是采样周期。
在这里插入图片描述

4图1 积分运算示意图
每次PID运算时,在原来的积分值的基础上,增加一个与当前的误差值ev(n)成正比的微小部分。误差为负值时,积分的增量为负。
手动调节温度时,积分控制相当于根据当时的误差值,周期性地微调电位器的角度,每次调节的角度增量值与当时的误差值成正比。温度低于设定值时误差为正,积分项增大,使加热电流逐渐增大,反之积分项减小。因此只要误差不为零,控制器的输出就会因为积分作用而不断变化。积分调节的“大方向”是正确的,积分项有减小误差的作用。一直要到系统处于稳定状态,这时误差恒为零,比例部分和微分部分均为零,积分部分才不再变化,并且刚好等于稳态时需要的控制器的输出值,对应于上述温度控制系统中电位器转角的位置L。因此积分部分的作用是消除稳态误差,提高控制精度,积分作用一般是必须的。
PID控制器输出中的积分部分与误差的积分成正比。因为积分时间TI在积分项的分母中,TI越小,积分项变化的速度越快,积分作用越强。
3.PI控制
控制器输出中的积分项与当前的误差值和过去历次误差值的累加值成正比,因此积分作用本身具有严重的滞后特性,对系统的稳定性不利。如果积分项的系数设置得不好,其负面作用很难通过积分作用本身迅速地修正。而比例项没有延迟,只要误差一出现,比例部分就会立即起作用。因此积分作用很少单独使用,它一般与比例和微分联合使用,组成PI或PID控制器。
PI和PID控制器既克服了单纯的比例调节有稳态误差的缺点,又避免了单纯的积分调节响应慢、动态性能不好的缺点,因此被广泛使用。
如果控制器有积分作用(例如采用PI或PID控制),积分能消除阶跃输入的稳态误差,这时可以将比例系数调得小一些。
如果积分作用太强(即积分时间太小),相当于每次微调电位器的角度值过大,其累积的作用会使系统输出的动态性能变差,超调量增大,甚至使系统不稳定。积分作用太弱(即积分时间太大),则消除稳态误差的速度太慢,积分时间的值应取得适中。
4.微分作用
误差的微分就是误差的变化速率,误差变化越快,其微分绝对值越大。误差增大时,其微分为正;误差减小时,其微分为负。控制器输出量的微分部分与误差的微分成正比,反映了被控量变化的趋势。
有经验的操作人员在温度上升过快,但是尚未达到设定值时,根据温度变化的趋势,预感到温度将会超过设定值,出现超调。于是调节电位器的转角,提前减小加热的电流。这相当于士兵射击远方的移动目标时,考虑到子弹运动的时间,需要一定的提前量一样。

在这里插入图片描述
4图2 阶跃响应曲线

图2中的c (∞)为被控量c (t)的稳态值或被控量的期望值,误差e(t) = c (∞) - c (t)。在图2中启动过程的上升阶段,当 时,被控量尚未超过其稳态值。但是因为误差e(t)不断减小,误差的微分和控制器输出的微分部分为负值,减小了控制器的输出量,相当于提前给出了制动作用,以阻碍被控量的上升,所以可以减少超调量。因此微分控制具有超前和预测的特性,在超调尚未出现之前,就能提前给出控制作用。
闭环控制系统的振荡甚至不稳定的根本原因在于有较大的滞后因素。因为微分项能预测误差变化的趋势,这种“超前”的作用可以抵消滞后因素的影响。适当的微分控制作用可以使超调量减小,增加系统的稳定性。
对于有较大的滞后特性的被控对象,如果PI控制的效果不理想,可以考虑增加微分控制,以改善系统在调节过程中的动态特性。如果将微分时间设置为0,微分部分将不起作用。
微分时间与微分作用的强弱成正比,微分时间越大,微分作用越强。如果微分时间太大,在误差快速变化时,响应曲线上可能会出现“毛刺”。
微分控制的缺点是对干扰噪声敏感,使系统抑制干扰的能力降低。为此可在微分部分增加惯性滤波环节。
5.采样周期
PID控制程序是周期性执行的,执行的周期称为采样周期。采样周期越小,采样值越能反映模拟量的变化情况。但是太小会增加CPU的运算工作量,相邻两次采样的差值几乎没有什么变化,将使PID控制器输出的微分部分接近为零,所以也不宜将采样周期取得过小。
应保证在被控量迅速变化时(例如启动过程中的上升阶段),能有足够多的采样点数,不致因为采样点数过少而丢失被采集的模拟量中的重要信息。
6.PID参数的调整方法
在整定PID控制器参数时,可以根据控制器的参数与系统动态性能和稳态性能之间的定性关系,用实验的方法来调节控制器的参数。有经验的调试人员一般可以较快地得到较为满意的调试结果。在调试中最重要的问题是在系统性能不能令人满意时,知道应该调节哪一个参数,该参数应该增大还是减小。
为了减少需要整定的参数,首先可以采用PI控制器。为了保证系统的安全,在调试开始时应设置比较保守的参数,例如比例系数不要太大,积分时间不要太小,以避免出现系统不稳定或超调量过大的异常情况。给出一个阶跃给定信号,根据被控量的输出波形可以获得系统性能的信息,例如超调量和调节时间。应根据PID参数与系统性能的关系,反复调节PID的参数。
如果阶跃响应的超调量太大,经过多次振荡才能稳定或者根本不稳定,应减小比例系数、增大积分时间。如果阶跃响应没有超调量,但是被控量上升过于缓慢,过渡过程时间太长,应按相反的方向调整参数。
如果消除误差的速度较慢,可以适当减小积分时间,增强积分作用。
反复调节比例系数和积分时间,如果超调量仍然较大,可以加入微分控制,微分时间从0逐渐增大,反复调节控制器的比例、积分和微分部分的参数。
总之,PID参数的调试是一个综合的、各参数互相影响的过程,实际调试过程中的多次尝试是非常重要的,也是必须的。

三、STM32代码控制说明

1.硬件电路搭建

本实验使用司南电气控制STM32单片机开发板 来实现使用PID算法对啊直流电机的速度控制。

实验材料:
①司南电气控制STM32单片机开发板
②带编码器的直流电机
③OLED显示屏

接线如图:
在这里插入图片描述

2.软件实现

PID算法,速度控制代码如下:

PID pid; //存放PID算法所需要的数据
void PID_Calc()  //pid计算
{
 u8 strr[2],str[2];  //检测脉冲变量
 float DelEk;
 float ti,ki;
//	float Iout;
//	float Pout;
//	float Dout;
	float td;
	float kd;
	float out;
	extern float pulse;  //检测脉冲变量
 if(pid.C200ms<(pid.T))  //计算时间未到,200ms
 {
    return ;
 }
 LED4=!LED4;
 
 //为什么是2.84?
 /*
 因为电机转一圈黄色线向单片机输出105.6个脉冲
    =>pulse/105.6 (200ms的圈数)
    =>(pulse/105.6)*5 (1s的圈数)
    =>(pulse/105.6)*5*60 (1min的圈数)
    => pulse*2.48        (1min的圈数)
 */
 pid.Pv = pulse * 2.84; //速度采样
 
 pid.Ek=pid.Sv-pid.Pv;   //得到当前的偏差值
 pid.Pout=pid.Kp*pid.Ek;      //比例输出
 
 pid.SEk+=pid.Ek;        //历史偏差总和
 
 DelEk=pid.Ek-pid.Ek_1;  //最近两次偏差之差
 
 ti=pid.T/pid.Ti;
 ki=ti*pid.Kp;
 
 pid.Iout=ki*pid.SEk*pid.Kp;  //积分输出

 td=pid.Td/pid.T;
 
 kd=pid.Kp*td;
 
 pid.Dout=kd*DelEk;    //微分输出
 
 out= pid.Pout+ pid.Iout+ pid.Dout;
 
 //
 
 if(out>pid.pwmcycle)
 {
  pid.OUT=pid.pwmcycle;
 }
 else if(out<0)
 {
  pid.OUT=pid.OUT0; 
 }
 else 
 {
  pid.OUT=out;
 }
 //pid.OUT+=; //本次的计算结果
 pid.Ek_1=pid.Ek;  //更新偏差
 
 TIM2->CCR1 = (u16)pid.OUT;TIM2->CCR4 = 0;  //PWM输出
 TIM2->CCR2 = 0;TIM2->CCR3 =(u16)pid.OUT;   //PWM输出
 
 sprintf(strr,"%0.1f\0",pid.OUT);           //打印PWM输出值
 OLED_ShowString(48,3,strr);                //打印PWM输出值
 sprintf(str,"%0.1f\0",pid.Pv);             //打印当前速度输出值
 OLED_ShowString(56,6,str);                 //打印当前速度输出值
 
 pid.C200ms = 0;
 pulse = 0;   //检测脉冲变量清零
}

具体源码工程压缩包可在本博客上传资料下载。或者下面QQ群下载,“星云视界”资料共享群:1077657643
“星云视界”资料共享群资料二维码如下:

请添加图片描述

非常感谢大家的观看,希望对大家有所帮助。小编常接外包设计定单哦!非常乐意为大家提供毕设技术指导以及产品设计等服务。

如需要可直接联系小编(添加请备注博客添加哈)

QQ : 3778615131

微信号 : a13428153731

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

stm32直流电机控制—PID算法篇 的相关文章

  • Spring Security Oauth2 扩展grant_type

    Spring Security Oauth2 自定义grant type的实现 在使用Jhipster 搭建微服务框架时 xff0c 使用了jhipster 提供的uaa做用户认证授权 xff0c Jhipster uaa 是基于sprin
  • 移动端产品比较分析:APP、小程序、H5

    原文 移动端产品比较分析 xff1a APP 小程序 H5 01 运行环境 xff08 1 xff09 APP xff1a Android 和 iOS 手机操作系统 xff08 2 xff09 小程序 xff1a 微信 APP 内 xff0
  • 产品工作基本流程

    我的博客即将同步至腾讯云 43 社区 xff0c 邀请大家一同入驻 xff1a https cloud tencent com developer support plan invite code 61 2p5qjwxvujms4 产品工作
  • ODBC(Open Database Connectivity,开放数据库互连)

    ODBC Open Database Connectivity 开放数据库互连 是微软公司开放服务结构 WOSA Windows Open Services Architecture 中有关数据库的一个组成部分 它建立了一组规范 并提供了一
  • 数据结构考研408复习必看

    原创不易 麻烦点个关注 点个赞 谢谢各位 数据结构要点 第一章 概 论 数据就是指能够被计算机识别 存储和加工处理的信息的载体 数据元素是数据的基本单位 可以由若干个数据项组成 数据项是具有独立含义的最小标识单位 数据结构的定义 逻辑结构
  • 思科网络工程师必学

    网络工程师学习笔记 第一章 计算机基础知识 一 硬件知识 1 计算机系统的组成包括硬件系统和软件系统 硬件系统分为三种典型结构 1 单总线结构 2 双总线结构 3 采用通道的大型系统结构 中央处理器 CPU 包含运算器和控制器 2 指令系统
  • 什么是数字技术?

    数字技术 xff08 Digital Technology xff09 xff0c 是一项与电子计算机相伴相生的科学技术 xff0c 它是指借助一定的设备将各种信息 xff0c 包括 xff1a 图 文 声 像等 xff0c 转化为电子计算
  • 启示录:新加坡纬壹科技城成功建设经验

    数字TOD xff1a 在各省市新一年的重点工作中 xff0c 产业园区都被放在非常显赫的位置加以强调 xff0c 有的被冠以 高质量发展主战场 的地位 xff0c 有的则异常鲜明地提出 园区兴则产业兴 xff0c 园区强则经济强 的口号
  • 区块链技术赋能数字经济建设

    区块链技术是一项利用密码学算法 以去中心化方式集体维护一个可靠分布式数据库的新兴技术 它具有分布式 不可篡改 可追溯等特征 xff0c 能够弥补传统信用体系不足 防止信息篡改和伪造 节省全社会信用成本 xff0c 对金融 电子商务 智慧医疗
  • 启示录:日本涉谷未来之光TOD成功建设经验

    启示录 xff1a 日本涉谷未来之光TOD成功建设经验 数字TOD 在城市土地供应日益紧张 城市人口膨胀 公共交通快速发展的今天 xff0c 涩谷之光以复合业态功能叠加和选择重点业态精心打造 xff0c 并最大限度对接公共交通资源的开发策略
  • 夜间经济:激发新⼀轮消费潜力升级的新引擎

    数字TOD 夜间经济是现代城市业态之一 xff0c 指从当日下午6点到次日早上6点所包含的经济文化活动 xff0c 其业态囊括晚间购物 餐饮 旅游 娱乐 学习 影视 休闲等 夜间经济是现代城市经济的重要组成部分 xff0c 是促消费 稳就业
  • os模块和序列化

    os模块 和操作系统交互的模块 import os os makedirs dir1 dir2 创建多个文件夹 os mkdir dir3 创建一个文件夹 os removedirs 39 dir3 dir4 删除多个空文件夹 os rmd
  • 启示录:日本东京都二子玉川站TOD成功建设经验

    数字TOD 在成都两会期间印发的 关于实施幸福美好生活十大工程的报告 指出 xff0c 实施幸福美好生活十大工程 xff0c 将以满足人民群众日益增长的美好生活需要为根本目的 xff0c 从市民和企业反映最强烈 最迫切的领域着手 特别提出
  • 启示录:TOD分类及用地功能结构组成

    数字TOD 彼得 卡尔索普在 The Next American Metropolis 一书中描述了两类TOD 一类是城市TOD xff08 Urban TODs xff09 xff0c 位于区域性的干道的轻轨 重轨或快速的公交汽车的站点
  • 启示录:了解TOD模式的正确打开方式(一)

    数字TOD 提起TOD xff0c 到目前很多人可能还很懵懂 科普TOD xff0c 是笔者不可推卸的责任 所以一起回忆下电影 lt 流浪地球 gt 电影魔性台词先上 xff1a 34 北京第三区交通委提醒您 xff1a 道路千万条 xff
  • 启示录:了解TOD模式的正确打开方式(二)

    数字TOD 在中国的城市化进程中 xff0c 城市病 也在加速蔓延 xff0c 交通问题的加重以及土地资源的日益紧缺 xff0c 让生活在其中的人们饱受困扰 xff0c 这同时也引发了人们对城市发展模式的反思 为了实现城市的可持续化发展 x
  • 问题解决方案1-------------catkin_make编译时候的各种问题汇总

    文件移植和编译出现的问题汇总 我真实服了 xff0c 我几乎每一步都能遇到问题 xff0c 这是我catkin make时候遇到的新问题 xff1a 百度总结了一下 xff0c 文末附上链接 xff1a 1 Could not find a
  • CoreDNS介绍与使用

    介绍 在Kubernetes中DNS组件为整个集群提供DNS服务 xff0c 从而实现服务之间的访问 Kubernetes的DNS服务在Kubernetes中经历了3个阶段 xff1a 1 3版本之前skydns1 3 1 10版本kube
  • k8s日志收集

    日志收集介绍 日志收集的目的 xff1a 分布式日志数据统一收集 xff0c 实现集中式查询和管理故障排查安全信息和事件管理报表统计及展示功能 日志收集的价值 xff1a 日志查询 问题排查 故障恢复和故障自愈应用日志分析 xff0c 错误
  • k8s网络插件之Calico

    Calico简介 Calico官方文档 xff1a https projectcalico docs tigera io getting started kubernetes quickstart Calico是一套开源的网络和网络安全解决

随机推荐

  • ceph集群维护常用操作

    文章目录 通过套接字进行单机管理集群启停移除节点ceph配置文件存储池分类副本池IO纠删码池IO PG与PGPPG数量计算PG常见状态存储池管理创建存储池查看存储池删除存储池存储池配额 存储池可用参数存储池快照 通过套接字进行单机管理 可以
  • rbd块存储使用

    文章目录 rbd存储池镜像管理创建镜像查看镜像删除镜像镜像回收站功能镜像特性管理创建image时指定要启用的特性启用特性 xff08 针对已存在的image添加特性 xff09 禁用特性 xff08 针对已存在的image移除特性 xff0
  • 基于fo-dicom 的 Worklist & CStore 我的学习实现路线

    学习了三个周的DICOM协议 xff0c 主要进行了Worklist CStore应用测试 xff0c 下面总结一下过程中收获的心得 刚开始接触DICOM这个东西领导提出两个需求测试实现Worklist和DICOM文件下载 xff0c 后面
  • CephFs使用

    CephFS简介 官方文档 xff1a https docs ceph com en quincy cephfs CephFS即ceph filesystem xff0c 可以实现文件系统共享功能 xff08 POSIX标准 xff09 x
  • Ceph对象存储使用

    文章目录 对象存储简介RadosGW简介RadosGW配置RGW使用的存储池配置rgw使用的http端口配置rgw使用https配置rgw高可用 客户端s3cmd测试数据读写创建rgw用户安装s3cmd客户端配置s3cmd访问rgw测试数据
  • Openstack(nova)、kvm、qemu和libvirtd之间的联系

    之前一直不清楚kvm qemu libvirtd和nova组件之间的区别和联系 xff0c 今天在网上看了几篇文章 xff0c 基本搞清了这几者之间的关系 下面简单总结一下 先介绍一下这几种技术 一 xff1a QEMU QEMU是一个模拟
  • ROS py文件编译错误“ catkin_install_python() called with non-existing file”

    我遇到的有2种情况会出现这种报错 1 CMakeLists txt文件内编写错误 xff0c 仔细检查 py文件名是否写错了 catkin install python PROGRAMS scripts demo01 pub p py sc
  • 最左匹配原则的底层原理

    什么是最左匹配原则 顾名思义 xff1a 最左优先 xff0c 以最左边的为起点任何连续的索引都能匹配上 同时遇到范围查询 gt lt between like 就会停止匹配 例如 xff1a 如果建立 a b 顺序的索引 xff0c 我们
  • putty远程登录不上,并行配置不正确,两招搞定

    64 putty登录不上 xff0c 两步搞定 xff0c 亲测有效 场景 xff1a putty应用程序的并行配置不正确 方法1 xff1a Win 43 R xff0c 输入 services msc xff0c 点击确定就会弹出服务窗
  • 深度学习之python使用过程中的内存管理

    深度学习之python使用过程中的内存管理 在使用深度学习进行预测的时候 xff0c 往往会使用一些list存储生成的坐标和label以及包含识别结果的图片 xff0c 但是如果不及时清理则会造成内存爆满 xff0c 所以及时的清理多余内存
  • 【技术栈——00042】Docker网络端口指定的两种方式

    dockers在端口指定是的时候可用用以下两种形式 第一种 ip是宿主机ip xff0c port1是宿主机端口 xff0c port2是容器里的端口 port1映射到port2 参数 xff1a p ip port1 port2 第二种
  • 操作系统、数据库的默认密码

    Window xff1a 计算机管理员administrator的默认密码是空的 Linux xff1a 最高权限root xff0c 密码toor arch Linux xff1a 用户root xff0c 密码blackrch Sql
  • shell脚本--函数(函数结果赋值给数组)

    函数结果 赋予数组 一个数组可以交给函数加工之后在赋予给一个新的数组 场景 xff1a 用户获赠流量包 xff08 每人增加5G xff09 xff0c 结果运算 span class token punctuation span span
  • 最简单的引导程序

    个最简单的引导程序的写法 xff0c 功能很少 xff0c 但是我想对操作系统的初学者有一定的帮助 xff1b 它实现的功能是制作一张可引导的软盘 xff0c 软盘的实际内容则是一段程序 xff0c 则段程序在系统引导的时候在屏幕 xff1
  • ubuntu18.04 安装VMware出现gcc无法安装的问题

    在学习linux过程中需要安装VMware 而安装完成后出现报错 提示要求安装gcc 查阅资料后 ubuntu一般在安装后是自带gcc的 于是查看gcc版本 gcc v 提示没有安装gcc 尝试apt安装gcc sudo apt get i
  • vnc服务搭建及配置

    一 xff0c centos6系统 第一步 xff0c 安装VNC packages xff1a root 64 yum install tigervnc server y 第二步 xff0c 开启VNC服务 xff08 第一次开启会要求设
  • vnc之登录失败:Authentication Failure

    vnc设置正常 xff0c 密码通过vncpasswd设置过 xff0c 但是登录后总是限制认证失败 解决方法 xff1a 用户登录服务器的密码和登录vnc的密码是可以不一样的 1 首先 xff0c 通过ssh登陆用户 xff0c 输入容v
  • ftp服务之锁定用户家目录

    很多情况下 我们希望限制ftp用户只能在其主目录下 root dir 下活动 不允许他们跳出主目录之外浏览服务器上的其他目录 这时候我就需要使用到chroot local user chroot list enable chroot lis
  • 惠普暗影精灵2更新bios系统,防止电池鼓包

    https support hp com cn zh drivers selfservice omen by hp 15 ax000 laptop pc series 10862325 model 12732710 bios版本怎么看 查看
  • stm32直流电机控制—PID算法篇

    stm32直流电机控制 PID算法篇 一 常用的控制算法1 控制系统的基本结构 xff1a 2 常用控制算法 xff1a 位式控制 二位式控制算法 具有回差的二位式控制算法 三位式控制算法 小结 二 PID控制算法1 PID控制算法的基本思