我对使用 Microchip TCP/IP 堆栈时的步进电机控制有疑问。
过去,我使用定时器来控制步进电机。我将定时器的周期设置为脉冲之间所需的时间,然后根据定时器节拍 ISR 中的需要更改电机相位输出。在我这样做的情况下,我的步进器以每秒大约 400 个脉冲的最大速率移动,这意味着中断每 2.5 毫秒发生一次。我正在使用 USB 与主机通信。
我现在正在开发一种新产品,它将使用 TCP/IP 堆栈通过以太网与 PC 通信。它还将通过 SPI 和 UART 模块与其他设备通信。这个新设备必须能够以高达每秒 2000 个脉冲的速度运行步进器,这意味着如果我使用相同的定时器/ISR 方法来驱动步进器,中断可能每 .5 毫秒触发一次。步进器根据从主机接收到的命令打开和关闭,因此与主机的通信和电机的运行需要协调一致地同时进行。如果步进速度略有变化,这不是问题,但并不理想。此外,如果步进器在移动过程中暂停 30 毫秒,那将是 Not Acceptable 。
我正在考虑在此项目中使用指令时钟速度为 16MHz(使用内部 FRC+PLL 时为 32Mhz/2)的 PIC24F。您是否认为步进器的中断会中断以太网通信,反之亦然?有更好的方法吗?
我考虑过使用单独的 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/