我正在尝试构建一个由两个直流电动机驱动的差动驱动器的机器人。首先,我实现了PID控制器来独立控制每个电动机的速度。通过获取每个车轮编码器的速度与Arduino微控制器施加的PWM信号的函数关系,使用MATLAB的系统识别工具箱估算开环系统的TF。一切顺利,我成功确定了该控制器的PID增益。

我现在要完成的工作是控制直流电动机的精确(角度)位置。我以为在其他已实现的输入中级联PID控制器。这样一来,我就可以给第一个控制器一个位置,该位置将能够为第二个(速度)控制器生成输出参考,以便它生成适当的PWM值信号来相应地驱动直流电动机。

会起作用吗?那是个好方法吗?还是我应该尝试实现一个不同的控制器来响应位置参考信号输出PWM信号?

非常感谢您的关注,希望有人能为我解决这些疑问。

评论

是。它会很好地工作,并且在商业运动控制器中是非常标准的。如果您的速度环在单个电动机上运行良好,则可以在其上放置一个位置环。将速度控制器与位置控制器“打架”(同时控制PWM)将完全不起作用。

@GuySirton-我认为他不是在谈论与控制器打交道。

我在用编码器反馈控制伺服电动机的速度和位置时遇到了非常困难的时间。我实现了pid,但找不到合适的增益。谁能分享一些速度控制代码?请? Arsh

如果您有新问题,请单击“提问”按钮提问。如果可以帮助提供上下文,请包括指向该问题的链接。

欢迎使用Arsh机器人技术,但在Stack Exchange交流中,需要回答问题。如果您有一个问题,则应将其作为新问题提出(如果它与另一个问题相关,则最好参考原始问题)。查看“如何询问”和“浏览”以获取有关堆栈交换如何工作的更多信息。不过,在提出问题之前,请确保尚未提出和回答问题:调节PID回路的最佳策略是什么?。

#1 楼

我自己完成了此操作,控制了无刷直流电动机的准确位置,使其速度上下倾斜。而且我只使用位置控制器来完成。听起来很明显,但是效果非常好。

控制器的积分项对此至关重要。由于您希望始终使位置误差尽可能接近于零,但是您需要来自控制器的大输出来驱动电动机,因此大部分来自I项。您需要添加的其他内容是前馈项,该项将一些所需的加速度反馈到输出中。这将为控制器提供跟踪快速速度变化所需的额外功率。我们可以称其为FPID控制器。

评论


$ \ begingroup $
这是可行的,但更标准的方法是轮廓生成->位置环->速度环...比仅尝试闭合位置环更好。是的,前馈也是相当标准的,并且有很大的不同。前馈越好,控制回路的工作就越少。
$ \ endgroup $
– Guy Sirton
2014年8月2日在6:11

$ \ begingroup $
@Rocketmagnet,您好,我已经实现了位置控制器,并将其与速度控制器进行了级联,但是尝试调整时遇到了一些困难(正如我在对@ ryan0270的先前评论中所述)帮我吗? :\
$ \ endgroup $
–rflmota
2014年8月2日在16:48

#2 楼

我有些困惑,您是要控制每个车轮的精确位置还是机器人的整体位置。对于前者,级联结构很有意义,其中机器人位置控制环为每个电动机定义了所需的速度。

对于后者(这听起来有点奇怪),您应该能够速度作为位置控制器的“ D”部分,而不是单独的速度控制器。

$$
\开始{align}
u =-k_p(p-p ^ d)-k_d(v-v ^ d)-k_i \ int_0 ^ t( p(t)-p ^ d(t))dt
\ end {align}
$$
其中$ p $和$ v $分别是测量位置和速度,而$ \ cdot ^ d $表示所需的值。

评论


$ \ begingroup $
我实际上是在尝试控制每个车轮的确切位置。我已经实现了PID控制器,但是在调整它时遇到了一些麻烦...我使用了一个“死区”限制,我认为车轮处于所需的位置-因为我的编码器分辨率很高( 7800“滴答声” /革命),并且很难以精确的参考“滴答声”来阻止它。但是我需要使用一个很大的死区,以使电动机不会在目标位置(200节拍)上来回摆动,所以我的分辨率仍然很差,也许我可以更好地调整PID。 ?
$ \ endgroup $
–rflmota
14年7月29日在19:38

$ \ begingroup $
一般来说,调优是一个单独的问题。不过,作为起点,请确保没有积分器,并调谐P和D直到看起来不错为止,但可能会有恒定的偏移量。然后慢慢增加积分器,直到看起来不好,然后将其切成两半。此外,通常应避免像您一样使用死区(尽管有时可能需要这样做)。
$ \ endgroup $
–ryan0270
2014年7月29日在22:19