使用C ++

时间:2019-01-01 17:54:16

标签: c++ atmega stepper

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

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

现在我向大家提出的问题是,您认为最有效的可能性是什么,或者如果还有其他事情,我可以尝试吗?我非常有信心可以实现以上任何一个,但是我对两者都不满意。使用计数器和中断以确保准确的计时是正确的。但是,为活动步进器提供外部表的方法使程序难以理解。此外,我还遇到了使ISR适应面向对象世界的问题。

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

最好的问候 Axodarap

1 个答案:

答案 0 :(得分:0)

我建议您使用ISR。

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

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