电机推子PID控制


15

我正在尝试使用Arduino控制电动推子(线性滑动电位器)。
PID控制为“跳到”特定的目标位置提供了良好的结果,但是跟踪斜坡是一个问题,它一点也不平滑。不管我尝试什么,运动都非常生涩。

这是跟踪斜坡时参考位置,测量位置和电机输出的曲线图: 跟踪坡道

这是相同测试的视频

在商业系统上,看起来更平滑,请参阅

详细信息
电机推子是Alps RSA0N11M9A0K。为了驱动它,我使用的是ST L293D H桥,由稳定的10 V DC电源(XL6009)供电。
在Arduino UNO(ATmega328P)上,我使用的是引脚9和10,其PWM频率为31.372 kHz,无法听到(Timer1的预分频比为1 TCCR1B = (TCCR1B & 0b11111000) | 0b001)。
电位计连接在地和5V之间,抽头与往常一样进入ADC0。

控制器
我使用的是具有防饱和功能的简单PID控制器,其更新速率为1 kHz(Ts = 1e-3 s):

float update(int16_t input) {
  int16_t error = setpoint - input;
  int16_t newIntegral = integral + error;
  float output = k_p * error 
               + k_i * newIntegral * Ts 
               + k_d * (input - previousInput) / Ts;

  if (output > maxOutput)
    output = maxOutput;
  else if (output < -maxOutput)
    output = -maxOutput;
  else
    integral = newIntegral;

  previousInput = input;
  return output;
}

控制器的输出是-127到127之间的值。PWM输出的生成如下:

const int8_t knee = 48;

uint8_t activation(int8_t val) {
  if (val == 0)
    return 0;
  else {
    return map(val, 0, 127, 2 * knee, 255);
  }
}

void writeMotor(int8_t val) {
  if (val >= 0) {
    analogWrite(forward, activation(val));
    digitalWrite(backward, 0);
  } else {
    analogWrite(backward, activation(-val));
    digitalWrite(forward, 0);
  }
}

我在7位PWM信号上添加了48,因为这是电动机开始以31 kHz的速度运动的地方,然后将其按比例缩放为8位数字(因为这就是该analogWrite功能的预期): PWM速度

我已经尝试过
我已经尝试将EMA过滤器添加到输入,控制信号,PID控制器的微分组件,但无济于事。我还尝试降低模拟输入的分辨率,使用磁滞现象使其在静止时不会在两个值之间翻转。这似乎没有任何影响。将时间步长增加到10 ms似乎也无济于事。

我还尝试了在MATLAB中进行系统识别,并尝试在Simulink中对其进行了调优(在本视频系列之后)。我有一个拟合度为91%的模型,但我不知道如何处理MATLAB模型的输入和输出非线性,它们如何影响PID调整以及如何在Arduino上实现它。

我尝试的最后一件事是制作两种不同的控制器:一种用于参考位置的大跳跃,一种用于跟踪斜坡时的小误差。这似乎有所帮助,因为这样我可以在跟踪时增加积分系数,而在跳跃时不增加过冲。
但是,通过增加积分(和比例)增益,电动机即使在静止且参考值不变的情况下也总是在做一些事情。(它并没有真正移动,但是您可以感觉到它在振动。)
我几乎没有微分增益,因为将其增大到高于1e-4似乎会使它更加抖动,而且我并没有真正注意到0和1e-4。

我的猜测是,它需要更多的功率来克服静摩擦,然后动摩擦变小,因此它会过冲,因此它将电动机向后驱动,使其停止,然后必须再次克服静摩擦,然后再次向前冲等

商业控制器如何克服这个问题?

我的背景
我是电机工程专业的第三年,我已经学习了控制理论,数字信号处理,LQR控制等课程,因此我具有一定的理论背景,但是在将所有这些理论应用于这个真实的系统。


编辑
我已经按照laptop2d的建议测试了开环传感器的测量结果,并对结果感到非常惊讶:在高PWM频率下,读数中会有令人讨厌的峰值。在490 Hz时,没有任何信号。
而且这是一个恒定的占空比,因此我无法想象当电动机快速反转方向时会收到什么样的噪声。

在此处输入图片说明

因此,在再次开始使用控制器之前,我必须找到一种方法来滤除这些噪声。

编辑2
使用指数移动平均滤波器不足以滤除噪声。

EMA

我尝试过0.25、0.50和0.75的极点。小杆没有太大的作用,大杆增加了太多的延迟,因此我不得不降低增益以保持稳定,从而导致整体性能变差。

我在电位计两端(抽头和地之间)添加了一个0.1 µF电容器,这似乎可以清除它。

目前,它已经足够好了。同时,我正在阅读Tim Wescott发表论文
谢谢大家的帮助。


可以精确控制31KHz pwm吗?
哈桑·阿拉特

@Hasanalattar:不,我可以使用的频率在第二张图中(1、8、64、256、1024的预分频器)。4 kHz和500 Hz是可以听见的,因此它们会发出令人讨厌的蜂鸣声,我想避免这种声音。剩下31 kHz,120 Hz和30 Hz。我认为后两者太慢了。PWM分辨率为8位,但我使用的更少,因为我的控制信号仅为7位,并且我仅使用高于96的PWM值
。– tttapa

1
链接的H桥位于数据表的首页:This device is suitable for use in switching applications at frequencies up to 5 kHz. 但是,如果将所有延迟加在一起,则第3页的电气特性建议绝对最大值为690kHz。(下4行)就我个人而言,我会比这慢很多,但我认为31kHz应该足够...如果不是第1页上的注释的话
。– AaronD

但是,这假设占空比是固定的。(或“不关心”的占空比为绝对最大频率“只是扭动它” -你会发现它是不对称的)高和低的占空比可以产生一些很窄脉冲,所以多宽的那些相比,页面3的底部?
AaronD

1
不知道这是否是您的问题,但是如果时间戳可以变化,那么我认为您应该将error * Ts添加到积分中,而不仅仅是误差,并且不要将积分乘以Ts。(如果Ts始终是常数,那么没关系)
user253751 '19

Answers:


9

控制系统仅与传感器一样好,运行传感器开环并移除控制输入。创建自己的传感器输入并缓慢滑动(或找到可靠可靠地缓慢滑动的方法),同时获取位置数据以确保它不是传感器。如果传感器有噪声,请通过更换新传感器或使其并联或对传感器的输出进行滤波来提高传感器的性能。您可能需要更高分辨率的传感器。

如果传感器不嘈杂,则需要获得不同的控制回路。PID是一阶系统,在速率控制方面并不是很出色。


谢谢,较高的PWM频率确实存在很多噪声,因此我必须找到一种改善方法。您是否有关于如何执行操作的任何指示?
tttapa

使用机械或数字滤波器。如果您不能这样做,那么并联传感器可能会很好。meta.stackexchange.com/questions/126180/...
电压尖峰

6

您认为问题出在摩擦,或者是摩擦和反冲的结合,这是正确的。您对于各种脉冲宽度的平均速度与占空比的关系图是具有摩擦力的系统的特征。 本文解释了您所看到的内容,并提供了自从一开始就用于解决问题的解决方案概要。您不会在工程课程中看到它们,因为它们很难分析。您基本上必须根据具体情况与他们玩弄才能使它们正常工作。

我不知道商业控制器会做什么,尽管我怀疑那里有各种各样的解决方案。过去我做过的事情是,当PID控制器发出的电动机驱动信号低于某个阈值(在您的情况下,可能是60到70个计数)时,我开始以阈值向电动机驱动脉冲,使平均驱动等于PID输出的周期。我通常为此使用sigma-delta-ish调制器,因为它可以用很少的几行实现,但是您可以选择任何适合您的方法。


4

似乎大多数噪声来自PWM驱动信号。

您是否尝试过将ADC捕获与PWM周期同步?大多数微控制器都有一种在定时器上触发ADC捕获的方法,因此您始终可以在周期的同一点触发。

为了获得最低的噪声,在接通电动机电源之前,最佳的采样位置将是正确的,因为那时任何尖峰都有最长的建立时间。但是无论在什么位置,同步捕获都会减少尖峰,因为偏移量在PWM周期的同一点将保持大致相同。


3

因此,在再次开始使用控制器之前,我必须找到一种方法来滤除这些噪声。

您可以使用以下代码(低通滤波)在代码中过滤传感器噪声(或任何其他噪声测量/变量):

小号已过滤[ķ]=α小号已过滤[ķ-1]+1-α小号生的[ķ]

哪里 0<<α1。值越接近1,就越平滑,但也会增加滞后性,例如从0.9开始,看看它的行为。


我已经尝试过了,但这还不足以摆脱高峰,并且增加了太多的滞后。
tttapa '19

@tttapa我明白了。您尝试使用哪个alpha值?(0.8,0.9)您可能已经做了一些调整,只是想知道。
Big6

我更新了原始帖子,以添加我尝试过的EMA过滤器图。我也尝试过0.9,甚至比0.75还差,由于延迟,增益必须低得多。我认为我将使用有限的EMA来清除ADC噪声,但现在电容器已经足够。
tttapa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.