4

在使用 Microchip TCP/IP 堆栈时,我有一个关于步进电机控制的问题。

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

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

我正在考虑为这个项目使用指令时钟速度为 16MHz(32Mhz/2 使用内部 FRC+PLL)的 PI​​C24F。您认为步进器的中断会破坏以太网通信还是反之亦然?有没有更好的方法来做到这一点?

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

4

3 回答 3

1

I had the same problem which was about managing the Microcontroller cpu's time between controling a stepper motors and receiving data from pc and from sensors but I solved by divide the control program (pulses) into pieces each 1Kbyte and send them to microcontroller memory. then I was able to free its cpu time .

于 2011-03-26T18:16:01.737 回答
1

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

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

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

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

现在,如果您的 PIC 控制器已优先处理中断,则这些都不是必需的。在这种情况下,只需将步进中断置于比 TCP 中断更高的优先级上,就可以了。但是,我不相信 PIC 具有用户功能,但我可能会弄错。迁移到另一个支持优先中断的平台可能也是一个好主意,因为将使代码更简洁,并使您的生活更轻松。

于 2011-01-07T15:29:19.860 回答
0

主机是否需要在 0.5 毫秒的边界上启动和​​停止步进器?我没有任何数据来支持这一点,但我的感觉是以太网链路的可变延迟可能会影响您对命令的响应能力,尤其是在同一网络上还有其他设备的情况下。

于 2011-01-07T16:00:31.777 回答