|
我最近在学习ethercat从站的时候,遇到一个很奇怪的问题。我想用ethercat控制两个步进电机,这两个步进电机要求速度,位置可调。大概等效于,开环发脉冲,0-48khz的脉冲固定个数输出,不能多和少。为了保险起见,我直接使用一个定时器以一个比较高的频率定时中断,然后软分频,在中断里手动翻转io口电平,并且把改定时器的优先级设置到最高。可是测试结果和我预想的不太一样,频率低的时候,十几khz,都正常,脉冲波形和个数都很好,但是在频率高的的时候,波形就不正常了。看起来似乎是到了改中断翻转io的时候,被什么东西阻止了,等待了一会才翻转,尽管脉冲个数还对,但是过程中的频率变来变去的。最后我不断调试,发现只要把ethercat的SPI通信代码注释掉,不用,频率就正常,一用就不正常。按道理说我这部分SPI的代码中断优先级比定时器的中断优先级低,不应该打乱定时器的输出。最后我试着问AI,AI和我提到了一个信息“总线阻塞”,说是因为我的定时器和ethercat的SPI外设共用的一个总线,ethercat的SPI的通信频率比较高每2ms交互一次数据,每次可能还要分几段才能发完,就导致总线会出现一个频率比较快的阻塞时间片段,该片段内,定时器等外设无法访问总线,要等SPI释放总线后才能操作。所以当我输出脉冲的那个定时器在输出较高频率的脉冲时,就会有更大概率碰到这个阻塞时间,到了该中断翻转电平的时候,由于总线被阻塞,要等待一会。恰恰是因为这个等待,造成了频率处于一个变化不稳定的状态。对于这个大佬们怎么看?总线阻塞了,中断也要等待释放,才能触发,执行中断函数吗?即使优先级设置到最高也没有用吗?这个优先级和总线的关系到底是怎么样的,小弟现在还没有理解透彻,有没有大佬们能指点一下?
|
|