我正在尝试使用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
功能的预期):
我已经尝试过:
我已经尝试将EMA过滤器添加到输入,控制信号,PID控制器的微分组件,但无济于事。我还尝试降低模拟输入的分辨率,使用磁滞现象使其在静止时不会在两个值之间翻转。这似乎没有任何影响。将时间步长增加到10 ms似乎也无济于事。
我还尝试了在MATLAB中进行系统识别,并尝试在Simulink中对其进行了调优(在本视频系列之后)。我有一个拟合度为91%的模型,但我不知道如何处理MATLAB模型的输入和输出非线性,它们如何影响PID调整以及如何在Arduino上实现它。
我尝试的最后一件事是制作两种不同的控制器:一种用于参考位置的大跳跃,一种用于跟踪斜坡时的小误差。这似乎有所帮助,因为这样我可以在跟踪时增加积分系数,而在跳跃时不增加过冲。
但是,通过增加积分(和比例)增益,电动机即使在静止且参考值不变的情况下也总是在做一些事情。(它并没有真正移动,但是您可以感觉到它在振动。)
我几乎没有微分增益,因为将其增大到高于1e-4似乎会使它更加抖动,而且我并没有真正注意到0和1e-4。
我的猜测是,它需要更多的功率来克服静摩擦,然后动摩擦变小,因此它会过冲,因此它将电动机向后驱动,使其停止,然后必须再次克服静摩擦,然后再次向前冲等
商业控制器如何克服这个问题?
我的背景:
我是电机工程专业的第三年,我已经学习了控制理论,数字信号处理,LQR控制等课程,因此我具有一定的理论背景,但是在将所有这些理论应用于这个真实的系统。
编辑:
我已经按照laptop2d的建议测试了开环传感器的测量结果,并对结果感到非常惊讶:在高PWM频率下,读数中会有令人讨厌的峰值。在490 Hz时,没有任何信号。
而且这是一个恒定的占空比,因此我无法想象当电动机快速反转方向时会收到什么样的噪声。
因此,在再次开始使用控制器之前,我必须找到一种方法来滤除这些噪声。
编辑2:
使用指数移动平均滤波器不足以滤除噪声。
我尝试过0.25、0.50和0.75的极点。小杆没有太大的作用,大杆增加了太多的延迟,因此我不得不降低增益以保持稳定,从而导致整体性能变差。
我在电位计两端(抽头和地之间)添加了一个0.1 µF电容器,这似乎可以清除它。
目前,它已经足够好了。同时,我正在阅读Tim Wescott发表的论文。
谢谢大家的帮助。
This device is suitable for use in switching applications at frequencies up to 5 kHz.
但是,如果将所有延迟加在一起,则第3页的电气特性建议绝对最大值为690kHz。(下4行)就我个人而言,我会比这慢很多,但我认为31kHz应该足够...如果不是第1页上的注释的话