c - 步进电机控制时序

标签 c timer interrupt motordriver

我对使用 Microchip TCP/IP 堆栈时的步进电机控制有疑问。

过去,我使用定时器来控制步进电机。我将定时器的周期设置为脉冲之间所需的时间,然后根据定时器节拍 ISR 中的需要更改电机相位输出。在我这样做的情况下,我的步进器以每秒大约 400 个脉冲的最大速率移动,这意味着中断每 2.5 毫秒发生一次。我正在使用 USB 与主机通信。

我现在正在开发一种新产品,它将使用 TCP/IP 堆栈通过以太网与 PC 通信。它还将通过 SPI 和 UART 模块与其他设备通信。这个新设备必须能够以高达每秒 2000 个脉冲的速度运行步进器,这意味着如果我使用相同的定时器/ISR 方法来驱动步进器,中断可能每 .5 毫秒触发一次。步进器根据从主机接收到的命令打开和关闭,因此与主机的通信和电机的运行需要协调一致地同时进行。如果步进速度略有变化,这不是问题,但并不理想。此外,如果步进器在移动过程中暂停 30 毫秒,那将是 Not Acceptable 。

我正在考虑在此项目中使用指令时钟速度为 16MHz(使用内部 FRC+PLL 时为 32Mhz/2)的 PI​​C24F。您是否认为步进器的中断会中断以太网通信,反之亦然?有更好的方法吗?

我考虑过使用单独的 PIC 来控制步进器,然后我可以发送该 pic 目标位置命令或停止命令来启动和停止运动,但这会在混合中添加另一个固件并使周围的事情复杂化。

最佳答案

这取决于硬件,最好的答案是试一试。

您的其他选择是像您提到的那样使用单独的 PIC 进行步进控制,或者使用伪线程(用户空间线程,但在 PIC 平台的大多数编译器中通常不可用)。

但也许最适合您的方法是让软件的主循环控制步进电机(用于……移动、 sleep 、继续),然后使用中断来处理随附的 TCP/IP 请求您将修改状态寄存器/变量。

使用中断是个好主意,但是当你有如此高优先级的东西时,轮询和循环是更好的选择。为了确保一切顺利,您需要能够保证您的 TCP/IP 中断不会超过 xxx 周期(或毫秒,在 PIC 上也是如此,真的),或者向 TCP 添加步进控制代码/IP 中断处理程序。

如果您的 PIC Controller 具有中断优先级,那么这些都不是必需的。在那种情况下,只需将步进中断置于比 TCP 中断更高的优先级,你就可以开始了。但是,我不认为 PIC 具有用户功能,但我可能弄错了。迁移到另一个确实支持优先中断的平台也可能是个好主意,因为这将使代码更简洁,让您的生活更轻松。

关于c - 步进电机控制时序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4626911/

相关文章:

c - 多维数组的某些元素错误地读为零

如果非模态显示,delphi启动窗体不会触发计时器事件

java - Java 中的 AsyncTask 等价物

c - 识别干扰的可能性

windows - 在内核模式下等​​待垂直空白?

interrupt - 未生成 STM32 HAL UART RXNE 中断

c - 将指向数组的指针传递给函数

c - 包括 Microsoft 可再发行 C 运行时 dll

c - 您将如何使用函数来计算电阻器阵列的电流和电压?

java - 如何设置 Swing 计时器在启动时执行