精华内容
下载资源
问答
  • 最终得出将位置环和速度环的输出叠加的方法,在位置没有到达预设位置时虽然位置环的输出会是满偏,但满偏会让速度出现偏差,速度环就会输出负值反过来抑制总的输出,这样我们就可以在实现位置环的同时也有了速度环的...
  • 自平衡车PID 直立环/平衡环+速度环+转向环 代码整定,完整代码程序 .
  • 基于DSP28335的永磁同步电机位置环和速度环,适合学习永磁同步电机的同行参考,同时适合学习电机速度环和位置环的同志们学习使用
  • 此部分代码是以编码器反馈来控制电机的速度和位置。利用PID来调整马达的转速和位置,尤其适合研究平衡小车的朋友参考和借鉴。
  • 本文提出了一种新颖的在线惯性辨识方法,该方法利用负载转矩观测器来优化伺服系统的速度环PID参数。 本文提出的惯性辨识算法采用固定阶数递归经验频域最优参数估计,以提高速度环性能。 为了获得更精确的惯性值,...
  • 伺服驱动器速度环,位置环的调整原则,初次接触电机方面的东西,希望小白可以互相学习
  • 直流电机的速度环PI控制-PI程序直流电机的速度环PI控制-PI程序
  • 永磁同步电机的电流环、速度环都采用PI控制,对永磁电机进行了建模。希望对你有所帮助
  • 自平衡车PID 直立环+速度环 代码整定,完整代码程序 .
  • 速度环的双马达驱动系统双马达驱动系统采用的是单速度环体制。其原理如图1所示。由图1可以看出,对单速度环双马达驱动系统来说两个马达共用一个速度调节器,从两个马达的测速机输出取信号求和后作为速度反馈信号来...
  • 文中详细的介绍永磁同步电机电流环速度环位置环的理论和设计方法
  • 支持HMI串口屏在线改pid参数,以及stm32f1可以通过串口读取hmi上的按键键值。
  • 精品文档 机电系统控制技术 matlab 仿真速度环仿真实验 1具有比例调节器的速度环仿真实验 图 1-1-1 考虑饱和时的具有比例调节器的速度环仿真图 上述模块均可在 Simulink 的子模块中找到 Sources Step Continuous PID...
  • Protues仿真实例-51单片机-直流电机的速度环PI控制-PI程序.rar
  • 伺服系统速度环和位置环控制器参数自整定技术
  • 【开源电机驱动】速度环控制

    千次阅读 2020-10-30 15:53:26
    Introduce 引言 Speend 速度来源 LPFilter 低通滤波器 PID Controller 比例积分微分控制器 Summary 总结

    Introduce

    引言

    The structure of this article is the same as the previous one. First, it introduces the speed related sensors and some calculation methods of "speed". Then I will explain the single speed loop control of the motor, and then I will comb how to nest the current loop and speed loop. I will compare their connections and differences.

    这篇文章的结构和上一篇一样,先介绍和速度相关的传感器,以及“速度”的一些计算方式,然后我要说明电机的单一速度环控制,之后是梳理如何将电流环和速度环嵌套起来使用。我将会对比他们的联系和区别。这篇文章会以简练的风格呈现。


    Speend 

    速度来源

    Hall Encoder

    霍尔型编码器

    1.低精度的霍尔编码器(Low precision hall encoder)

    Hall encoder is based on Hall effect. The following figure shows a typical hall encoder component, mainly including mechanical connector (shell), PCB (connecting cable) and magnetic ring (radial magnetization).

    霍尔式编码器是根据霍尔效应实现的编码器。使用时需要配合磁环使用,下图是一个典型的霍尔编码器零部件,主要包括机械连接件(壳体),PCB(连接线缆)和磁环(径向充磁)。

     

    It is generally installed at the tail of the brush motor, the magnetic ring interference fit is installed on the tail shaft, and the PCB is directly welded together at the motor access point, as shown in the figure below. The accuracy of this kind of encoder is not high. Generally, the number of pulses per cycle is only more than ten. After the number of lines is increased, the cost is very high.

    一般安装在刷电机的尾部,磁环过盈配合安装在尾轴上,PCB于电机接入点直接焊接在一起,如下图所示。这种编码器的精度不高,一般每圈脉冲数只有十几个,线数做高以后,价格不菲。

     

    2.磁编码器(Magnetic Encoder)

    The encoder also detects the angle change of magnet through Hall effect, but there are some differences with the above. First, the small magnet is a cylindrical magnet, but there is only a pair of NS poles. Can be understood as a magnetic pointer, constantly rotating, through the sensor to detect this rotation, output pulse. A typical magnetic encoder chip is as5047p of MPS company. It can measure the angle of 0-360 degrees completely, and the resolution is as high as 14 bits. That is to say, when the magnet is installed on the tail of the motor, it can output 2 ^ 14 pulses for each rotation.

    这种编码器也是通过霍尔效应检测磁铁角度变化,不过和上面的有些区别,一是小磁铁是圆柱磁铁,但只有一对NS极。可以理解为一个带磁性的指针,在不断旋转,通过传感器检测这种转转,输出脉冲。典型的磁编码器芯片有MPS公司的AS5047P,它能够完整的测量0-360度的角度,分辨率高达14位,也就是说,当磁铁安装在电机尾部上时,每旋转一圈,就能输出2^14个脉冲。有兴趣的自行查看AS5047P的数据手册。

    1.jpg

    Grating Encoder

    光栅式编码器

    The principle of grating encoder is relatively simple. The infrared transmitting tube and the receiving tube face each other. If there is occlusion, there is no input at the receiving end, and when there is no occlusion, there is input at the receiving end. The grating code disk is a ring-shaped grid. The number of grids determines the number of output pulses per cycle of the code disk. The cost of this method is low and the wiring harness is high. Generally, it can reach several thousand wires. However, it is sensitive to  light and dust, so it is necessary to seal the sensor.

    光栅式编码器的原理比较简单,红外发射管和接收管面对面,假设有遮挡时,接收端无输入,无遮挡时,接收端有输入.光栅码盘就是环状的栅格。栅格的个数决定了码盘一圈的输出脉冲数。这种方式成本低,线束高,一般能达到几千线,但是对光线和灰尘敏感,一般需要对传感器密闭处理。

     


    Speed PID Controller

    速度比例积分微分控制器

    I use here is a 16 wire encoder DC motor, first of all to analyze, speed acquisition and conversion. Generally, the encoder is quadrature coded, as shown in the figure below. This coding method can detect the direction and know whether the motor is in forward or reverse rotation. Based on this encoder mode, we can use the external interrupt trigger method to detect the falling edge of one phase and detect the level of another phase after entering the interrupt, so as to judge whether the pulse is added or subtracted. Then open a timer to find the speed.

    我在这里使用的是一个带16线编码器的直流电机,首先来分析一下,速度的获取和换算。一般编码器都是正交编码的,如下图所示,这样的编码方式可以检测方向,能够知道电机是在正转还是反转。基于这种编码器方式,我们可以使用外部中断触发的方式,检测某一相的下降沿,进入中断后检测另外一相的电平,以此判断脉冲是加还是减。然后开一个定时器,求出速度。

    If the number of pulses per cycle of encoder is n and the interruption time is t, the general motor will have a reducer, and the deceleration ratio is Q, then the speed s of the output shaft of the motor can be expressed by the following formula:

    设编码器一圈的脉冲个数为N,中断时间为t,一般电机都会有减速器,设减速比为Q,那么电机的输出轴的转速S可以用以下公式表示:

    S = N*Q/t*60 ,这里的单位是 r/min.

    As in the last article, we need to define the input value, output value and expected value of PID controller. The input value is the real speed s, and the expected value is the speed that the motor is expected to achieve. Here, you can test it by yourself, and the expected value cannot be separated from the actual performance of the motor. For example, if the maximum speed of the motor is 500r / min and the expected value is 1000r / min, the system will never achieve the desired results. There is only a single speed closed loop, so the output value is our PWM comparison value. The system diagram is as follows:

    和上一篇文章一样,我们需要明确PID控制器的输入值,输出值和期望值。输入值就是真实速度S,期望值就是希望电机达到的速度,这里可以自行测试一下,期望值不能脱离电机实际性能。比如电机转速最高500r/min,我们期望值给了1000r/min,那么这个系统将永远达不到到我们期望的结果。这里只有单一的速度闭环,所以输出值就是我们PWM的比较值。系统框图如下:

    The speed calculation function is as follows, which is a timer 10ms interrupt service function.

    速度计算函数speed如下,该函数是定时器10ms中断服务函数。

    /*------计算转速-------*/
    void speed()
    {
      int w = count;
      velocity = (w/16.00)/31/0.01*60;// 编码器脉冲*16*31/t*60=转速
      count = 0;
    }

    The figure below shows the expected value of 100, KP_ v =300,Ki_ v =100,Kd_ V = 0.00 motor response curve. Careful readers will find that this waveform is the same as that collected last time. Let's find out the reason behind it.

    下图是期望值100,Kp_v =300,Ki_v =100,Kd_v =0.00电机的响应曲线。细心的读者会发现,这个波形和上次电流采集到的波形如出一辙,我们下面就来找一找背后的原因。


    LP Filter

    一阶低通滤波器

    he speed value is pulse number / sampling time, which can be understood as a differential process, so it is very sensitive to interference. In the actual debugging process, I found that because our Δ t is very small, when the pulse number deviation is a little bit, the speed error will be greatly enlarged. As a result, the controller thinks that the speed value deviates too much, and tries to pull it back. In fact, the deviation is very small, which makes the speed vibrate repeatedly due to excessive force. Therefore, we need a filter.

    速度值是脉冲数/采样时间,可以理解为一个微分过程,因此他对干扰非常敏感,我在实际调试过程中发现,由于我们的Δt很小,当脉冲数偏差一点点,速度值的误差会被放得很大。带来的后果是,控制器以为速度值偏离太多,想办法把它拉回来,实际上偏差很小,这就用力过猛,使得速度反复震荡。那么速度的采样时间大概在什么范围内比较合适呢?回答这个问题,又到了喜闻乐见的具体问题具体分析时间。我的电机是“F”型的蜗杆减速电机,最大转速260RPM,编码器一圈16个脉冲,减速比31,反推回去,电机带动编码器的最大转速260*31=8060RPM,也就是那啥,8060RPM/60S = 134r /s,那么编码器产生一个脉冲的最小周期是 Tmax = 1/134*16 ≈ 5*10^(-4)s,也就是500us,根据采样定理,单片机采集脉冲的采样周期应该至少是250us,大部分单片机很容易达到。这个跟我们测速的周期有啥关系?我们是正交编码器,所以一个有效的脉冲计数,至少有两次边沿被检测到,我们直接取两倍采样时间,那就是说。至少要500us*2=1000us =1ms,单片机才能计数成功。那么速度采样周期设为1ms行不行?举个例子,我们在等车,假设车大约10min一趟,我每10分钟去等一次车,结果是什么?我有可能等到也有可能等不到。回到电机上,当我计数成功,我电机就会有速度,当我没有计到脉冲,电机速度就会为0,然实际上电机有惯性,它还在转动,速度不会是0,我们的控制器接收到了这个信号,以为电机没有输出了,就会猛地给电机加速,所以就会出现奇怪的抖动现象。那么10ms怎么样呢?足够了,但是脉冲计数偏差为1时,速度变化率为1/0.01 =100,编码器精度不高的话,速度也会抖动得厉害。所以我这里使用了100ms的速度测量周期。对于编码器精度特别差的情况,我们得请出另外一个东西,也就是我要将说的滤波器。

    What I'm talking about here is the first-order low-pass digital filter. The filter itself can be understood as a frequency selection network. Low pass filter is only allowed below the cut-off frequency of the signal through, beyond this cut-off frequency will be rapidly attenuated. In order to design digital filter, the analog filter with the same performance is designed firstly, and then the transfer function of the analog filter is mapped to the z plane to obtain the system function of the digital filter. The derivation process from analog filter to digital filter is described as follows:

    我这里说的主要是一阶低通数字滤波器。滤波器本身可以理解为一种选频网络。低通滤波器就是只允许低于截止频率的信号通过,超过此截止频率会被急速衰减。设计数字滤波器一般先由设计出同性能的模拟滤波器,再由模拟滤波器的传递函数映射到Z平面,求出数字滤波器的系统函数。下面说明一下从模拟滤波器到数字滤波器的推导过程:

    The circuit diagram of the first-order low-pass RC analog filter is as follows:

    一阶低通RC模拟滤波器的电路图如下:

     

    在这里插入图片描述

    The relationship between input and output is as follows:

    输入输出的关系为: 

    Vin(t) - Vout(t) = R*i(t) = RC*d(Vout)/dt

    Serialization directly according to sampling time t:

    直接按照采样时间T序列化:

    设Vin序列化:x1,x2,x3,...x(n-1),x(n) ;Vout序列化:y1,y2,y3,...y(n-1),y(n)

    那么微分就可以用y(i) - y(i-1)代替,于是原式转化为:

    x(i) - y(i) = RC*(y(i)-y(i-1)) / T

    整理可得:

    y(i) = x(i)*(T/(RC+T)) + y(i-1)*(RC/(RC+T))

    简化为:

    Y(n) = a*X[n] + (1-a)*Y[n-1]

    注意该滤波器的截止频率为:f = 1/(2pai*RC)

    matlab代码:

    Y = VarName1;       %import data
    subplot(2,1,1),plot(data),title('orignal data'); %orignal data
    len = length(Y);
    a = 0.01;          %attenuation coefficient
    for i=2:len
        Y(i) = a*Y(i)+(1-a)*Y(i-1); 
    end
    subplot(2,1,2),plot(Y),title('LP data') %the data after LP

    The attenuation coefficient is 0.1 and 0.01 and the comparison of original data. Here is a point to be mentioned. The attenuation coefficient is related to the hysteresis. The larger the value is, the better, and the smaller the better.

    衰减系数为0.1和0.01以及原始数据对比,这里要提一点,衰减系数和滞后相关,这个值不是越大越好,也不是越小越好。

     


    Speed & Current PID Controller

    速度-电流双闭环

    The above mentioned single speed loop control, followed by current loop and speed loop cascade control. The control block diagram of the whole system is as follows. Why cascade control? As can be seen from the figure, the speed controller and the current controller are connected in series in a system, so they are called cascade control. So what are its characteristics? If you look at the diagram, you will find that the output of the speed loop is the input of the current loop. Well, that's it. The current loop is responsible for the fast response of the motor, and the speed loop is responsible for controlling the speed of the motor.

    上面说了单一的速度环控制,接下来是电流环和速度环的串级控制。整个系统的控制框图如下。为什么叫串级控制呢?图中可以看出,速度控制器和电流控制器串联在一个系统中,所以称之为串级控制。那么它的特点是什么呢?看图,你会发现,速度环的输出作为电流环的输入。嗯,就是这样。电流环负责电机的快速响应,速度环负责控制电机的速度。

    Cascade PID is not code, but parameter tuning. I'll dig a hole for myself. After that, I'll talk about the position ring, and I'll take a section. The low-pass filter and the low-pass filter are the following. I feel that the PI parameter is not adjusted properly. In addition, compared with the response of pure velocity loop, the speed adjustment of charged current loop is much faster.

    串级PID难的不是代码,而是参数的整定。我给自己挖个坑,后面讲完位置环,专门拿一节来讲。 下面是双闭环控制带低通滤波器和不带低通滤波器的效果。感觉PI参数没有调好。还有一点,对比纯速度环响应,带电流环的速度调节要快不少。

    更新:2020年11月2日 调试结果 


    Summary

    总结

    This paper describes the speed closed-loop control, as well as low-pass filter, and finally speed and current double closed-loop control. The key point of this section is that cascade PID control, current loop as the inner loop, speed loop as the outer loop, outer loop output as the input of the inner loop. The difficulty is parameter setting.

    这篇文章讲述了速度闭环控制,以及低通滤波器,最后还讲了速度和电流双闭环控制。这一节的要点是,串级PID控制,电流环作为内环,速度环作为外环,外环输出作为内环的输入。难点是参数的整定。


    References

    参考文献

    1【滤波器学习笔记:一阶RC低通滤波】.https://blog.csdn.net/qq_27334499/article/details/52186336

    2.【数字 一阶低通滤波器 详细分析】 http://blog.csdn.net/u013608300/article/details/78814693


    日志

    2020年11月5日 第一次修改

    展开全文
  • 基于STM32开发简易直流电机速度环PID闭环控制 ,内有代码,可供参考学习。
  • 在以往的双马达直流调速驱动系统中,从环路上米讲,采用的都是双电流环单速度环工作体制。对每个马达控制器来说,除了电流环以内的有关电路可以利用外,每个马达控制器上的速度调节器和速度反馈电路都不能利用,为了...
  • 基于战舰STM32开发简易直流电机速度环PID闭环控制 内有详细说明
  • 本篇文章我将针对位置式PID算法、直立环、速度环等的编程进行详细的讲解,让每位小伙伴能够对这三个概念的编程逻辑有更加清晰的理解。 一、直立环(PD控制器) 1.中文公式  直立环输出=Kp1×角度偏差+Kd×角度偏差...

      大家好,我是小政。本篇文章我将针对位置式PID算法直立环速度环等的编程进行详细的讲解,让每位小伙伴能够对这三个概念的编程逻辑有更加清晰的理解。

    一、直立环(PD控制器)

    1.中文公式
    直立环输出=Kp1×角度偏差+Kd×角度偏差的微分
     // 角度偏差=真实角度-期望角度

    2.英文公式
    直立环PD控制器:Kp×Ek+Kd×Ek_D
     (Ek:角度偏差;Ek_D:角度偏差的微分)

    • Ek=真实角度-期望角度(Angle-Med,由陀螺仪MPU6050测得)
    • Ek_D=真实角速度(gyro_Y,由陀螺仪MPU6050测得)

    3.软件编程
      根据理论公式进行软件编程,相信看完上面的讲解后这段代码应该比较清晰易懂。

    /*****************  
    直立环PD控制器:Kp*Ek+Kd*Ek_D
    入口:Med:机械中值(期望角度),Angle:真实角度,gyro_Y:真实角速度
    出口:直立环输出
    ******************/
    int Vertical(float Med,float Angle,float gyro_Y) 
    {
      int PWM_out;
      
      PWM_out = Vertical_Kp*(Angle-Med)+Vertical_Kd*(gyro_Y-0);
      
      return PWM_out;
    } 
    

    二、速度环(PI控制器)

    1.中文公式

    速度环输出=Kp2×电机速度偏差+Ki2×电机速度偏差的积分
     // 电机速度偏差=真实速度-期望速度

    2.英文公式

    速度环PI控制器:Kp×Ek+Ki×Ek_S
     (Ek:电机速度偏差;Ek_S:电机速度偏差的积分)

    • Ek=真实速度-期望速度(真实速度:左电机速度+右电机速度;期望速度:0)
    • Ek_S=速度偏差的累加

    3.低通滤波

      期间需要低频滤波,我们是以直立环为主,速度环为辅,速度环相对于直立环来说是一个干扰,最终目的是直立。低频滤波作用是使得波形更加平滑,滤除高频干扰,防止速度过大影响直立环正常工作。

    4.积分限幅

      通过比较限制积分在规定范围内变动,不得超出。

    5.软件编程

      根据理论公式进行软件编程,相信看完上面的讲解后这段代码应该比较清晰易懂。

    /*****************  
    速度环PI控制器:Kp*Ek+Ki*Ek_S(Ek_S:偏差的积分)
    ******************/
    int Velocity(int Target,int encoder_left,int encoder_right)
    {
      // 定义成静态变量,保存在静态存储器,使得变量不丢掉
      static int PWM_out,Encoder_Err,Encoder_S,EnC_Err_Lowout,EnC_Err_Lowout_last;
      float a=0.7;
      
      // 1.计算速度偏差
      //舍去误差--我的理解:能够让速度为"0"的角度,就是机械中值。
      Encoder_Err = ((encoder_left+encoder_right)-Target);
      
      // 2.对速度偏差进行低通滤波
      // low_out = (1-a)*Ek+a*low_out_last
      EnC_Err_Lowout = (1-a)*Encoder_Err + a*EnC_Err_Lowout_last; // 使得波形更加平滑,滤除高频干扰,放置速度突变
      EnC_Err_Lowout_last = EnC_Err_Lowout;   // 防止速度过大影响直立环的正常工作
      
      // 3.对速度偏差积分出位移
      Encoder_S+=EnC_Err_Lowout;
      
      // 4.积分限幅
      Encoder_S=Encoder_S>10000?10000:(Encoder_S<(-10000)?(-10000):Encoder_S);
      
      // 5.速度环控制输出
      PWM_out = Velocity_Kp*EnC_Err_Lowout+Velocity_Ki*Encoder_S;
      
      return PWM_out;
    }
    

    三、转向环

    1.中文公式

    转向环输出=系数×Z轴角速度
     (Z轴角速度由陀螺仪MPU6050测得)

    2.软件编程

      转向环的编程比较简单,我们只需设置一个参数调节Z轴角速度即可。

    /*****************  
    转向环:系数*Z轴角速度
    ******************/
    int Turn(int gyro_Z)
    {
      int PWM_out;
      
      PWM_out = (-0.6)*gyro_Z;
      
      return PWM_out;
    }
    

    四、控制函数

    1、采集编码器数据和MPU6050角度信息

    • 编码器数据:左电机速度,右电机速度
      (两个电机是相对安装,刚好相差180度,为了编码器输出极性一致,就需要对其中一个取反)
    • MPU6050数据:角度数据,角速度数据,角加速度数据

    2、将数据压入闭环控制中,计算出控制输出量

    • 直立环输出
    • 速度环输出
    • 转向环输出

    3、把控制输出量加载到电机上,完成最终的控制

    • 左电机输出(编码器放置相对)
    • 右电机输出
    • 限幅
    • 赋值

    4、控制中断函数
    首先要判断是否接受到中断请求,即检测MPU6050的ANT引脚是否处在低电平(即为发生中断),然后清除中断标志位,进行接下来三步(即上面的三个步骤)。

    void EXTI9_5_IRQHandler(void)
    {
      int PWM_out;
      if(EXTI_GetITStatus(EXTI_Line5)!=0) // 一级判定
      {
        if(PBin(5)==0)    // 二级判断
        { 
          EXTI_ClearITPendingBit(EXTI_Line5); // 清除中断标志位
          // 1.采集编码器数据&MPU6050角度信息
          // 电机是相对安装,刚好相差180度,为了编码器输出极性一致,就需要对其中一个取反
          Encoder_Left  = -Read_Speed(2); 
          Encoder_Right = Read_Speed(4);
          
          mpu_dmp_get_data(&Pitch,&Roll,&Yaw);	    // 读取角度
          MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);  // 读取角速度
          MPU_Get_Accelerometer(&aacx,&aacy,&aacz); // 读取加速度
          // 2.将数据压入闭环控制中,计算出控制输出量
    			Velocity_out=Velocity(Target_Speed,Encoder_Left,Encoder_Right); // 速度环
          Vertical_out=Vertical(Velocity_out+Med_Angle,Roll,gyrox);			  // 直立环
    			Turn_out=Turn(gyroz);	
          
          PWM_out=Vertical_out;//最终输出
          
          // 3.把控制输出量加载到电机上,完成最终控制
          MOTO1 = PWM_out-Turn_out; // 左电机
          MOTO2 = PWM_out+Turn_out; // 右电机
          Limit(&MOTO1,&MOTO2);     // PWM限幅
          Load(MOTO1,MOTO2);        // 加载到电机上
        }
      }
    }
    

    五、整个控制函数源代码

    1、control.c

    #include "control.h"
    
    float Med_Angle=0;      // 机械中值,能使得小车真正平衡住的角度 
    float Target_Speed=0;	  // 期望速度。---二次开发接口,用于控制小车前进后退及其速度。
    float 
      Vertical_Kp=0,
      Vertical_Kd=0;     // 直立环Kp、Kd
    float 
      Velocity_Kp=0,     // 速度环Kp、Ki(正反馈)
      Velocity_Ki=0;
    float 
      Turn_Kp=0;
    
    int Vertical_out,Velocity_out,Turn_out; // 直立环&速度环&转向环的输出变量
    
    int Vertical(float Med,float Angle,float gyro_Y); // 函数声明
    int Velocity(int Target,int encoder_left,int encoder_right);
    int Turn(int gyro_Z);
    
    void EXTI9_5_IRQHandler(void)
    {
      int PWM_out;
      if(EXTI_GetITStatus(EXTI_Line5)!=0) // 一级判定
      {
        if(PBin(5)==0)    // 二级判断
        { 
          EXTI_ClearITPendingBit(EXTI_Line5); // 清除中断标志位
          // 1.采集编码器数据&MPU6050角度信息
          // 电机是相对安装,刚好相差180度,为了编码器输出极性一致,就需要对其中一个取反
          Encoder_Left  = -Read_Speed(2); 
          Encoder_Right = Read_Speed(4);
          
          mpu_dmp_get_data(&Pitch,&Roll,&Yaw);	    // 读取角度
          MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);  // 读取角速度
          MPU_Get_Accelerometer(&aacx,&aacy,&aacz); // 读取加速度
          // 2.将数据压入闭环控制中,计算出控制输出量
    			Velocity_out=Velocity(Target_Speed,Encoder_Left,Encoder_Right); // 速度环
          Vertical_out=Vertical(Velocity_out+Med_Angle,Roll,gyrox);			  // 直立环
    			Turn_out=Turn(gyroz);	
          
          PWM_out=Vertical_out;//最终输出
          
          // 3.把控制输出量加载到电机上,完成最终控制
          MOTO1 = PWM_out-Turn_out; // 左电机
          MOTO2 = PWM_out+Turn_out; // 右电机
          Limit(&MOTO1,&MOTO2);     // PWM限幅
          Load(MOTO1,MOTO2);        // 加载到电机上
        }
      }
    }
    
    /*****************  
    直立环PD控制器:Kp*Ek+Kd*Ek_D
    
    入口:Med:机械中值(期望角度),Angle:真实角度,gyro_Y:真实角速度
    出口:直立环输出
    ******************/
    int Vertical(float Med,float Angle,float gyro_Y) 
    {
      int PWM_out;
      
      PWM_out = Vertical_Kp*(Angle-Med)+Vertical_Kd*(gyro_Y-0);
      
      return PWM_out;
    } 
    
    /*****************  
    速度环PI控制器:Kp*Ek+Ki*Ek_S(Ek_S:偏差的积分)
    ******************/
    int Velocity(int Target,int encoder_left,int encoder_right)
    {
      // 定义成静态变量,保存在静态存储器,使得变量不丢掉
      static int PWM_out,Encoder_Err,Encoder_S,EnC_Err_Lowout,EnC_Err_Lowout_last;
      float a=0.7;
      
      // 1.计算速度偏差
      //舍去误差--我的理解:能够让速度为"0"的角度,就是机械中值。
      Encoder_Err = ((encoder_left+encoder_right)-Target);
      // 2.对速度偏差进行低通滤波
      // low_out = (1-a)*Ek+a*low_out_last
      EnC_Err_Lowout = (1-a)*Encoder_Err + a*EnC_Err_Lowout_last; // 使得波形更加平滑,滤除高频干扰,放置速度突变
      EnC_Err_Lowout_last = EnC_Err_Lowout;   // 防止速度过大影响直立环的正常工作
      // 3.对速度偏差积分出位移
      Encoder_S+=EnC_Err_Lowout;
      // 4.积分限幅
      Encoder_S=Encoder_S>10000?10000:(Encoder_S<(-10000)?(-10000):Encoder_S);
      
      // 5.速度环控制输出
      PWM_out = Velocity_Kp*EnC_Err_Lowout+Velocity_Ki*Encoder_S;
      
      return PWM_out;
    }
    
    /*****************  
    转向环:系数*Z轴角速度
    ******************/
    int Turn(int gyro_Z)
    {
      int PWM_out;
      
      PWM_out = Turn_Kp*gyro_Z;
      
      return PWM_out;
    }
    
    

      以上就是平衡小车系列文章第六讲——位置式PID、直立环与速度环软件编程讲解,平衡小车系列文章作者在持续更新中。若文章中出现错误或者小伙伴对以上内容有所疑问,欢迎大家在评论区留言,小政看到后会尽快回复大家!
    【平衡小车制作】(七)串级PID调参及平衡成果展示(超详解)https://blog.csdn.net/weixin_44270218/article/details/113786386

    展开全文
  • 实现用STM32做直立车,现已能实现原地直立,平稳,无抖动等现象,如需自己用是谁stm32做直立车的,这个事一个很好的参考例子。
  • 直流电机的速度环PI控制-PI程序.使用简单 程序和电路图都在里面
  • 目录电机控制系列文章前言一、速度环开环传递函数二、速度环开环传递函数零极点配置三、速度环闭环性能四、速度滤波器的影响总结 前言 大家在做感应(异步)电机磁场定向控制(FOC)的时候,是否还在疑惑PI参数怎么...

    电机控制系列文章

    感应(异步)电机磁场定向控制MATLAB/Simulink建模
    感应(异步)电机磁场定向控制电流环PI控制参数设计



    前言

    大家在做感应(异步)电机磁场定向控制(FOC)的时候,是否还在疑惑PI参数怎么给,还在用PI参数整定口诀一点一点去试,或者按书籍论文的计算公式搞出来不对?那你的电机控制理论需要进一步深入了,如果按照书籍论文的计算公式算出来不能用,你可以来这里看看你的MATLAB/Simulink建模有没有问题:
    感应(异步)电机磁场定向控制MATLAB/Simulink建模
    如果是不知道PI参数怎么给,我来指导你设计合适的PI参数。
    事实上TI(德州仪器)早就把这些东西工程化了,《InstaSPIN-FOC™ and InstaSPIN-MOTION™ User’s Guide》里有详细的指导,本人也是从其中窥得PI参数设计大法。如果你看过这个文档,没关系,也可以看看我写的,其中也有我个人的理解。
    电流环的PI参数设计已经在感应(异步)电机磁场定向控制电流环PI控制参数设计中介绍过了。本文接着介绍速度环PI参数设计。


    一、速度环开环传递函数

    速度环PI仍采用下图所示的串联型PI。
    串联型PI
    与TI文件不同,我们将参考转矩作为速度环PI的输出,则被控对象传递函数为
    ω m ( s ) T e ∗ ( s ) = i sq ∗ ( s ) T e ∗ ( s ) × i sq ( s ) i sq ∗ ( s ) × T e ( s ) i sq ( s ) × ω m ( s ) T e ( s ) = 2 3 L r N p L m ψ r × 1 s ω b_curr + 1 × 3 2 N p L m L r ψ r × 1 J s = 1 J s ( s ω b_curr + 1 ) \begin{aligned} \frac {\omega_{\text m}(s)} {T_{\text e}^*(s)} &= \frac {i_{\text {sq}}^*(s)} {T_{\text e}^*(s)} \times \frac {i_{\text {sq}}(s)} {i_{\text {sq}}^*(s)} \times \frac {T_{\text e}(s)} {i_{\text {sq}}(s)} \times \frac {\omega_{\text m}(s)} {T_{\text e}(s)} \\ &= \frac 2 3 \frac {L_{\text r}} {N_{\text p}L_{\text m}\psi_{\text r}} \times \frac 1 {\frac s {\omega_{\text {b\_curr}}}+1} \times \frac 3 2 N_{\text p}\frac {L_{\text m}} {L_{\text r}}\psi_{\text r} \times \frac 1 {Js} \\ &= \frac 1 {Js(\frac s {\omega_{\text {b\_curr}}}+1)} \end{aligned} Te(s)ωm(s)=Te(s)isq(s)×isq(s)isq(s)×isq(s)Te(s)×Te(s)ωm(s)=32NpLmψrLr×ωb_currs+11×23NpLrLmψr×Js1=Js(ωb_currs+1)1
    ω b_curr \omega_{\text {b\_curr}} ωb_curr为电流环设计带宽, ω b_curr = K p series L \omega_{\text {b\_curr}} = \frac {K_{\text p}^{\text{series}}} L ωb_curr=LKpseriesJ为转动惯量。
    速度环开环传递函数为
    G spd_ol ( s ) = s p d K p series s p d K i series ( 1 + s s p d K i series ) s × 1 J s ( s ω b_curr + 1 ) = s p d K p series s p d K i series ( 1 + s s p d K i series ) J s 2 ( 1 + s ω b_curr ) \begin{aligned} G_{\text{spd\_ol}}(s) &= \frac {spdK_{\text p}^{\text{series}} spdK_{\text i}^{\text{series}} (1+\frac s {spdK_{\text i}^{\text{series}}})} s \times \frac 1 {Js(\frac s {\omega_{\text {b\_curr}}}+1)} \\ &= \frac {spdK_{\text p}^{\text{series}} spdK_{\text i}^{\text{series}} (1+\frac s {spdK_{\text i}^{\text{series}}})} {Js^2(1+\frac s {\omega_{\text {b\_curr}}})} \end{aligned} Gspd_ol(s)=sspdKpseriesspdKiseries(1+spdKiseriess)×Js(ωb_currs+1)1=Js2(1+ωb_currs)spdKpseriesspdKiseries(1+spdKiseriess)


    二、速度环开环传递函数零极点配置

    开环传函有两个零极点,所以从零频开始,增益就以每十倍频40dB的斜率下降。此外,有一个PI零点,可以减少每十倍频20dB斜率,还有一个电流环极点,可以增加每十倍频20dB斜率。
    TI文件里的思想是,首先为了保证稳定性,将电流环极点放在最远处。然后令电流环极点与穿越频率之比等于穿越频率与PI零点之比,即
    ω pole ω 0dB = ω 0dB ω zero = δ \frac {\omega_{\text {pole}}} {\omega_{\text {0dB}}} = \frac {\omega_{\text {0dB}}} {\omega_{\text {zero}}} = \delta ω0dBωpole=ωzeroω0dB=δ
    速度环开环波特图
    这样做的目的是在波特图上让穿越频率正好在零点与极点的中间。穿越频率对应的相位影响着相位裕度。TI这样做只用调节这一个参数δ,就可以调整速度环的低频、中频、高频,就很方便。这两个比例也可以不相等,比如把PI零点设为零,那么只有 s p d K p series spdK_{\text p}^{\text{series}} spdKpseries,也是可行的,只不过低频增益弱一点。
    由等比例关系可得到
    s p d K i series = ω b_curr δ 2 s p d K p series = J δ s p d K i series \begin{aligned} spdK_{\text i}^{\text{series}} &= \frac {\omega_{\text {b\_curr}}} {\delta^2} \\ spdK_{\text p}^{\text{series}} &= J\delta spdK_{\text i}^{\text{series}} \end{aligned} spdKiseriesspdKpseries=δ2ωb_curr=JδspdKiseries
    δ应大于1,否则穿越频率大于电流环极点,会导致相位裕度不够,系统不稳定。由下面的开环波特图可以看到,δ越小,增益就越大,带宽越宽,但相位裕度越小,越不稳定。
    速度环开环波特图


    三、速度环闭环性能

    下面分别是速度环闭环幅频特性和阶跃响应,可以看出,δ越小,带宽越宽,响应越快,但超调和振荡越大。因此,TI建议δ取值范围为2~30。
    速度环闭环波特图
    速度环阶跃响应


    四、速度滤波器的影响

    速度一般要经过一个一阶低通滤波器,相当于在开环传函里又引入了一个极点。这时在设计 s p d K i series spdK_{\text i}^{\text{series}} spdKiseries时,选择滤波器极点和电流环极点中最小的就行。
    s p d K i series = min ⁡ ( ω b_curr , ω filter ) δ 2 spdK_{\text i}^{\text{series}} = \frac {\min(\omega_{\text {b\_curr}},\omega_{\text {filter}})} {\delta^2} spdKiseries=δ2min(ωb_curr,ωfilter)


    总结

    本文介绍了感应(异步)电机磁场定向控制速度环PI控制参数设计,主要内容从《InstaSPIN-FOC™ and InstaSPIN-MOTION™ User’s Guide》中提取,同时包含我个人的理解,以期这篇文章能帮助大家设计速度环PI参数。


    如果懒得搭模型,可以来这里下载
    感应(异步)电机间接磁场定向控制MATLAB/Simulink仿真模型

    展开全文
  • 运动伺服一般都是三环控制系统,从内到外依次是电流环、速度环、位置环。 1、电流环:电流环的输入是速度环PID调节后的输出,我们称为“电流环给定”吧,然后呢就是电流环的这个给定和“电流环的反馈”值进行比较后...

    原文:https://blog.csdn.net/sunjiajiang/article/details/8252026

     

    运动伺服一般都是三环控制系统,从内到外依次是电流环、速度环、位置环。

    1、电流环:电流环的输入是速度环PID调节后的输出,我们称为“电流环给定”吧,然后呢就是电流环的这个给定和“电流环的反馈”值进行比较后的差值在电流环内做PID调节输出给电机,“电流环的输出”就是电机的每相的相电流,“电流环的反馈”不是编码器的反馈而是在驱动器内部安装在每相的霍尔元件(磁场感应变为电流电压信号)反馈给电流环的。

    2、速度环:速度环的输入就是位置环PID调节后的输出以及位置设定的前馈值,我们称为“速度设定”,这个“速度设定”和“速度环反馈”值进行比较后的差值在速度环做PID调节(主要是比例增益和积分处理)后输出就是上面讲到的“电流环的给定”。速度环的反馈来自于编码器的反馈后的值经过“速度运算器”得到的。

    3、位置环:位置环的输入就是外部的脉冲(通常情况下,直接写数据到驱动器地址的伺服例外),外部的脉冲经过平滑滤波处理和电子齿轮计算后作为“位置环的设定”,设定和来自编码器反馈的脉冲信号经过偏差计数器的计算后的数值在经过位置环的PID调节(比例增益调节,无积分微分环节)后输出和位置给定的前馈信号的合值就构成了上面讲的速度环的给定。位置环的反馈也来自于编码器

      编码器安装于伺服电机尾部,它和电流环没有任何联系,他采样来自于电机的转动而不是电机电流,和电流环的输入、输出、反馈没有任何联系。而电流环是在驱动器内部形成的,即使没有电机,只要在每相上安装模拟负载(例如电灯泡)电流环就能形成反馈工作。

     

    进一步参考:伺服电机三环控制系统:https://blog.csdn.net/u013528298/article/details/80421244

     

     谈谈PID各自对差值调节对系统的影响

      1、单独的P(比例)就是将差值进行成比例的运算,它的显著特点就是有差调节,有差的意义就是调节过程结束后,被调量不可能与设定值准确相等,它们之间一定有残差,残差具体值您可以通过比例关系计算出。增加比例将会有效减小残差并增加系统响应,但容易导致系统激烈震荡甚至不稳定。

      2、单独的I(积分)就是使调节器的输出信号的变化速度与差值信号成正比,大家不难理解,如果差值大,则积分环节的变化速度大,这个环节的正比常数的比例倒数我们在伺服系统里通常叫它为积分时间常数,积分时间常数越小意味着系统的变化速度越快,所以同样如果增大积分速度(也就是减小积分时间常数)将会降低控制系统的稳定程度,直到最后出现发散的震荡过程。这个环节最大的好处就是被调量最后是没有残差的。

      3、PI(比例积分)就是综合P和I的优点,利用P调节快速抵消干扰的影响,同时利用I调节消除残差。

      4、单独的D(微分)就是根据差值的方向和大小进行调节的,调节器的输出与差值对于时间的导数成正比,微分环节只能起到辅助的调节作用,它可以与其他调节结合成PD和PID调节。它的好处是可以根据被调节量(差值)的变化速度来进行调节,而不要等到出现了很大的偏差后才开始动作,其实就是赋予了调节器以某种程度上的预见性,可以增加系统对微小变化的响应特性。

    5、PID综合作用可以使系统更加准确稳定的达到控制的期望。

           伺服的电流环的PID常数一般都是在驱动器内部设定好的,操作使用者不需要更改

      速度环主要进行PI(比例和积分),比例就是增益,所以我们要对速度增益和速度积分时间常数进行合适的调节才能达到理想效果。

      位置环主要进行P(比例)调节。对此我们只要设定位置环的比例增益就好了。

      位置环、速度环参数调节没有什么固定的数值,要根据外部负载的机械传动连接方式、负载的运动方式、负载惯量、对速度、加速度要求以及电机本身的转子惯量和输出惯量等等很多条件来决定,调节的简单方法是在根据外部负载的情况进行大体经验的范围内将增益参数从小往大调,积分时间常数从大往小调,以不出现震动超调的稳态值为最佳值进行设定。

      当进行位置模式需要调节位置环时,最好先调节速度环(此时位置环的比例增益设定在经验值的最小值),调节速度环稳定后,再调节位置环增益,适量逐步增加,位置环的响应最好比速度环慢一点,不然也容易出现速度震荡。

     

     

     

    展开全文
  • 电流环速度环位置环.pdf
  • 基于stm32cubeMX的平衡小车HAL库+蓝牙遥控+直立环+速度环+转向环 一、代码工程链接 我的平衡车代码,HAL库,cubeMX配置,主控stm32f103,程序代码容易移植,建议先看完正文 ...我自己在cuebmx所配置的用到的资源: Keil...
  • 智能车制作——速度环PID

    千次阅读 多人点赞 2020-08-26 21:14:29
    速度环位置式与增量式调参   在调位置式速度环时我们先加大Kp值,同时令Ki、Kd为0,查看编码器值和目标值的差值,当反馈回来的编码器值在目标值上下震荡时加入Ki值即可。   通过上面的代码理解我们可以知道增量...
  • 其实单环我们先出了所有题目,但是效果显然没有串级PID的效果好,有人需要的话可以把程序包发出来,板球运行视屏也有 另外:天下舵机参差不齐(哪怕型号相同),想要好的效果就多写两...串级PID-速度环作为内环 ...
  • 速度环PID控制直流电机

    千次阅读 2021-02-02 13:48:49
    STM32电机PID速度控制 编码器 1.概述 编码器(encoder)是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。编码器把角位移或直线位移转换成电信号,前者称为码盘,后者称为码尺。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 112,464
精华内容 44,985
关键字:

速度环