C 步进电机控制定时

C 步进电机控制定时,c,timer,interrupt,motordriver,C,Timer,Interrupt,Motordriver,我有一个关于使用微芯片TCP/IP堆栈时步进电机控制的问题 在过去,我用一个定时器来控制步进电机。我将计时器的周期设置为脉冲之间所需的时间,然后根据需要在计时器刻度ISR中更改电机相位输出。在我这样做的情况下,我的步进器以每秒400个脉冲的最大速率移动,这意味着中断每2.5毫秒发生一次。我用USB和主机通信 我现在正在开发一种新产品,它将使用TCP/IP协议栈通过以太网与PC进行通信。它还将通过SPI和UART模块与其他设备通信。这个新设备必须能够操作高达每秒2000个脉冲的步进器,这意味着如果

我有一个关于使用微芯片TCP/IP堆栈时步进电机控制的问题

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

我现在正在开发一种新产品,它将使用TCP/IP协议栈通过以太网与PC进行通信。它还将通过SPI和UART模块与其他设备通信。这个新设备必须能够操作高达每秒2000个脉冲的步进器,这意味着如果我使用相同的定时器/ISR方法来驱动步进器,中断可能每0.5毫秒触发一次。步进电机是根据从主机接收到的命令打开和关闭的,因此与主机的通信和电机的操作需要同时和谐地进行。如果步进机速度略有变化,这不是问题,但并不理想。另外,如果步进器停下来,在它的中间移动30mm,那是不可接受的。 我正在考虑在本项目中使用指令时钟速度为16MHz(32Mhz/2,使用内部FRC+PLL)的PIC24F。您认为步进机的中断是否会中断以太网通信,反之亦然?有更好的方法吗


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

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

您的其他选项是使用单独的PIC进行步进控制,如您所提到的,或者使用伪线程(userland线程,但在大多数PIC平台的编译器中通常不可用)

但也许对您最有效的方法是让软件的主回路控制步进电机(用于…移动、睡眠、继续),然后使用中断来处理传入的TCP/IP请求,您将修改状态寄存器/变量

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


现在,如果PIC控制器对中断进行了优先级排序,那么这些都是不必要的。在这种情况下,只需将步进中断置于比TCP中断更高的优先级,您就可以开始了。然而,我不相信PIC有这样的用户功能,但我可能弄错了。迁移到另一个支持优先中断的平台也可能是一个好主意,因为这将使代码更干净,总体上使您的生活更轻松。

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

我也遇到过同样的问题,那就是在控制步进电机和接收来自pc和传感器的数据之间管理微控制器cpu的时间,但我通过将控制程序(脉冲)分成每1KB的片段并将其发送到微控制器内存来解决。然后我就可以释放它的cpu时间。

试试看?事实上,我处理过的所有图片都有优先中断。您可以将优先级从1设置为7。但我想真正的问题是,如果TCP/IP中断因优先级较高的中断而延迟,这会导致通信中出现任何错误吗?暂停?等等?不,在我的情况下,启动和停止时间可以延迟到几百毫秒而不会造成任何问题。