0

我目前正在开发一个关于 atmega 2560 的项目,我需要控制多个同步步进电机。这意味着有时一次只有一个电机转动,有时多个电机需要同时转动完全相同的角度。在计划我的方法时,我遇到了一个我不确定如何解决的问题。所以,我决定看看有没有人能给我宝贵的建议。我正在用 C++ 编写程序,我想为步进电机创建一个类(见附件 UML),它有一个方法 rotate(),你猜对了,将步进器在定义的方向上旋转特定角度。当然,这会带来时间问题,因为我需要以一种不会阻塞任何其他代码并使我能够同时转动多个电机的方式来实现该功能。我想出了两种可能的方法:

  1. 使用 atmega 的定时器和中断来创建一个 PWM 信号,每次中断都会使电机转动一步。为了能够一次转动多个电机,我考虑为有源步进器创建一个表。每次输入 ISR 时,它都会检查应该移动哪些步进器并将 PWM 信号传输到相应的引脚。当然,我会以某种方式需要跟踪仍然要转动的步数(也许通过引入另一个成员变量)。
  2. 完全不使用中断,尽可能避免阻塞代码,不使用while循环并使用系统时间进行延迟。

现在我对你们所有人的问题是,无论您认为哪种可能性最好,或者如果还有其他方法,我可以尝试吗?我非常有信心可以实现上述任何一个,但我对它们都不太满意。使用计数器和中断来保证准确的时间是正确的。但是,为活动步进器提供外部表的方法使程序不太容易理解。此外,我还遇到了将 ISR 融入面向对象世界的问题。

任何想法或贡献都受到高度赞赏。

最好的问候 Axodarap

4

1 回答 1

0

我想推荐你使用 ISR。

  1. 使用 ISR 可以让您更轻松地添加新功能。每当您想添加新功能时,您编写它并且您的 ISR 仍然在相同的情况/时间/同步/异步执行。
  2. 使用电机会迫使您使用依赖时间的系统,尤其是在没有来自位置/角度的反馈时。

存储有关步进器的数据有什么问题?您不需要用于活动步进器的外部表,否则我误解了您。您可以在 ISR 中使用静态变量来防止它们在执行后消失。

于 2019-01-22T06:35:12.450 回答