每当我看到电动机的PID控制时,它都会涉及一个编码器,因此算法会知道电动机或车轮的实际位置。
但是有了机器人,我就无法使用编码器。我每个车轮只有一个光耦合器,它可以计算出车轮移动了多少度。我可以使用它来增加计数器,但是计数器总是增加(如果车轮向前移动或车轮向后移动)。 Arduino PID自动调谐库。在第一个图中,我不会看到INPUT上的递减。

我的目标是移动一个由简单轨迹驱动的小两轮机器人小段,这些轨迹随着时间的推移完全停止(直线10厘米,停止,向右移动90度,停止,笔直直到检测到障碍物) ...)

您能给我一些建议吗?
我首先想到的是将PID位置控制转换为速度控制(对于反馈回路更方便)我有),并记下行驶距离的计数器,以告知速度控制何时停止。

评论

从技术上讲,这是一个光遮断器。您有正确的想法,可以使用此设置(速度和位置)进行闭环控制。唯一的“模糊性”区域是在非常低的速度附近,您需要一些处理方式(例如,多维数据集的答案)。

是的,伙计与更好的“正交编码器”相反,有人称它为简单的编码器或编码器,后者提供了精确的位置信息(带有两个光耦合器)。我想停下来并且电机有惯性时会出错,但这是我能达到的最佳效果。谢谢。

#1 楼

我不是专家(正在构建机器人,我会不断学习:)),但是我也面临着类似的问题(尽管不是arduino)。使用单个反射传感器计算滴答声。我假设电机+齿轮足够坚固,以至于当我不发送命令时它们将永远不会转动。然后,我会跟踪旋转方向,并在需要更改旋转方向时,强迫电动机停转几毫秒,以确保它没有朝错误的方向旋转。对于代码,但似乎可以正常工作。

对于PID:我要输入速度差(编码器滴答声/计时器间隔),并将输出用于PWM(实际上是将其馈送到遥控车ESC)。这非常好用,即使电动机在启动过程中几乎没有转矩,也相当稳定。

如果某些代码可以帮助您,这是我对AVR的实现:
https://github.com/bluecube/robomower2/blob/master/src_avr/drive/main.c

评论


$ \ begingroup $
非常感谢@cube。不仅您已经确认了我正在考虑的想法是可行的,而且您也很乐意分享您的工作。我将看到它并获得有关我的车辆的想法。
$ \ endgroup $
– Chirrin Dul
2014年4月28日在6:26

#2 楼

我有相同的系统。这是一个只有一个传感器的车轮编码器。每转一圈我只能得到20个计数。这个用起来很简单。设置电动机方向的软件还将全局变量设置为+1或-1。然后,当中断处理程序收到“滴答”信号时,会将全局变量添加到当前计数中。仅当电动机坚固或系统中存在很多摩擦时,此方法才有效。如果可能会出现不受控的车轮运动,则失败。

评论


$ \ begingroup $
非常感谢,user3150208。我有一个孩子,我没有足够的时间。我已经进行了速度控制,两个车轮之间有些差异,有时甚至达到峰值。因此,我要向PID控制器求出速度的最后4个值的平均值。缺点是我必须再调整一次P,I和D值,因为响应时间现在不同了。我必须对Arduino代码进行一些修改,因为我需要两个轮子的两个计数器。第三个计数器用于PID定时。
$ \ endgroup $
– Chirrin Dul
2015年1月6日,12:23