在stm32f103上面写了一个脉冲模块,6通道的大概能到20KHz……
标题:在stm32f103上面写了一个脉冲模块,6通道的大概能到20KHz……最近空闲的时候在stm32f103上,仿照grbl的stepper流程写了一个差不多功能的模块,
不同的是grbl的是联动处理,我写的是每个通道可以独立的,写完测试了一下发现速度有点低,
在带了6个脉冲通道的情况下,中断占时就快到40us了,我只测试到了20KHz的样子,就没往上测。
我是觉得这样的速度有点低的,4通道的话40KHz,2通道的话60KHz,差不多这样子……
有坛友做过类似工作的话,交流一下?是否有提高的空间?
代码的话先不放了,没什么太大的价值,大概的框架如下:
定时中断 ISR1
{
拉高管脚(上次计算的结果)
启动定时中断ISR2,拉低管脚
for (遍历轴)
{
从指令缓冲区取数据计算
if (是否需要拉高管脚)
....
}
全部空闲则停止定时中断
}
定时中断 ISR2
{
拉低所有轴管脚
}
只开一个定时器,大概500K中断频率,每个引脚对应一个变量计数,想要引脚什么频率就看变量计数值,翻转IO输出。 亽亼 发表于 2020-4-8 15:49
只开一个定时器,大概500K中断频率,每个引脚对应一个变量计数,想要引脚什么频率就看变量计数值,翻转IO输 ...
大概的流程是这样的啊,但你说的500KHz……你认真的吗? 落叶知秋 发表于 2020-4-8 16:26
大概的流程是这样的啊,但你说的500KHz……你认真的吗?
f103就72M,500K应该还行吧,不行的话你就降一些,基本上芯片跑这个中断就没办法跑其他了。
也没啥办法,谁让你要用f103呢。 亽亼 发表于 2020-4-8 17:30
f103就72M,500K应该还行吧,不行的话你就降一些,基本上芯片跑这个中断就没办法跑其他了。
也没啥办法, ...
兄弟,这种多通道高频率的中断。。任何cpu都扛不动啊。放i7上也能把核占满,而且实时性根本无法保证。因为cpu架构不擅长做这种事情。专业的活要给专业的工具去做,要么用2个stc去专门做这个,stm32发指令,要么用一片fpga代替stm32,跑个riscv软核一样干活,这样别说6路了,600路都能轻松搞定。 wye11083 发表于 2020-4-8 18:28
兄弟,这种多通道高频率的中断。。任何cpu都扛不动啊。放i7上也能把核占满,而且实时性根本无法保证。因 ...
多通道高速脉冲一般是推荐fpga来搞,我这是针对lz的代码提另外一个可能方案(该方案还不一定可行),实际效果说实话我都没试过。 亽亼 发表于 2020-4-8 18:42
多通道高速脉冲一般是推荐fpga来搞,我这是针对lz的代码提另外一个可能方案(该方案还不一定可行),实际 ...
多谢你提意见,但500khz的中断,不知道是你太高看stm32f103,还是太小看stm32f103? wye11083 发表于 2020-4-8 18:28
兄弟,这种多通道高频率的中断。。任何cpu都扛不动啊。放i7上也能把核占满,而且实时性根本无法保证。因 ...
用逻辑器件去做stepper是比较合理,我只是在探究这款芯片的性能可以去到哪里…… 对lz的想法蛮有意思的。 为什么电平拉低不能在同一个定时器中断呢? 把拉低拉高引脚的函数贴出来,库函数效率很低 qinxg 发表于 2020-4-9 08:32
把拉低拉高引脚的函数贴出来,库函数效率很低
用的标准库的接口,或许可以自己写寄存器看看有没有省些时间 楼上说的对,看下这段代码的汇编,能不能再精简 whatcanitbe 发表于 2020-4-8 23:30
为什么电平拉低不能在同一个定时器中断呢?
不是不能,但拉低电平安排在另外一个中断里,是为了将最多的时间留给ISR1里面的计算流程,
ISR2的优先级会比ISR1的高,耗时也短很多,几个us,其余时间都为了给ISR1里面处理。
如果在同一个定时器中断的话,原本ISR1里面的流程就很占时间,ISR2里面流程占时少,这样会浪费CPU时间,
而且如果动态改定时器中断间隔的话,有可能会让脉冲的高电平持续时间波动更大,受ISR1的耗时影响,
我觉得还不如用两个定时器好些 落叶知秋 发表于 2020-4-9 08:38
用的标准库的接口,或许可以自己写寄存器看看有没有省些时间
想速度快就直接操作IO口,以103的能力单通道搞到500K没问题 modbus 发表于 2020-4-9 09:20
想速度快就直接操作IO口,以103的能力单通道搞到500K没问题
如果只是一两个脉冲通道的话,就不会用这种软件stepper模块了,直接用定时器的pwm模式,可以做到更高频率,还不占CPU时间。
还有,考虑到中断入栈出栈,还有缓冲区和计算,你说的500K,也是认真的? {:smile:}双定时器来实现,还可以这样玩……学习了{:lol:} 一个cpld,多路输出稳定,释放cpu压力 ndk 发表于 2020-4-9 18:55
一个cpld,多路输出稳定,释放cpu压力
除了成本高了点,还需要设计和维护cpld的程序,估计后面这点是很多人不用cpld的最大原因{:biggrin:}
其实如果想要的脉冲通道不是很多,又不嫌复杂的话,可以整个DMA的定时器脉冲输出功能,或是级联定时器PWM,
但我嫌做起来麻烦,而且电路管脚有要求,就没有去尝试了 上周末把代码优化了一下,主要有3点:
1. 把GPIO管脚的处理,从使用标准库,改为直接写寄存器,不进行库函数里的那些ASSERT检查;
2. 把两个Timer的机制改为一个Timer了,拉低脉冲管脚的处理,直接放在缓冲处理和时间计算后面;
3. 把for循环语句去掉,替换成宏展开。
优化效果:6通道的脉冲,在Timer里面进行耗时计算,优化前37us,优化后27us
步骤优化占比:(1) 库函数优化,减少了5us;(2) Timer机制优化3us;(3) for循环优化2us(有3个地方用到了)
看上去只能优化到这样,有更好想法的坛友请告知哈{:biggrin:} 超频
降低flash周期 19504643 发表于 2020-4-20 22:17
超频
降低flash周期
没试过超频使用,会有什么问题吗? 每个轴单独一个计数器还是共用一个计数器? whatcanitbe 发表于 2020-4-20 23:18
每个轴单独一个计数器还是共用一个计数器?
“计数器” - 我当作是每个轴的时间事件记录器,是每个轴独立的,原来grbl的方法也是每个轴独立的,只不过是计算是联动的,以短轴为基础 直接上H7@480M,八轴联动800KHz,同样算法M4@168MKHz,八轴联动200K极限,150K妥妥的。脉冲输出架构和你的差不多,不过我的类似AVR446的,定时器时间每次重新计算的,因此用的长轴基础,八轴联动在两个定时器里面做的,很容易拓展成12轴。 jxyctwt 发表于 2020-5-8 07:28
直接上H7@480M,八轴联动800KHz,同样算法M4@168MKHz,八轴联动200K极限,150K妥妥的。脉冲输出架构和你的 ...
“八轴联动”,联动的意思我当作应该是grbl那种,每个运动段可以设置的轴数,这种方式感觉多轴后不太实用,运动段必须等到所有轴完成后才结束 不错,学习了{:victory:} 应该写下去,并把测试结果,测试截图发上来; 加减速控制也在这里面? Stm32Motor 发表于 2023-4-23 16:54
加减速控制也在这里面?
(引用自29楼)
不在,这帖子里面讨论的是stepper,只是发脉冲的 那就是固定的频率发脉冲? 对于机床的运动控制而言这些东西都没什么用,比方说机床跑F480算出来频率是20k,那要是F481呢,要是F481.01呢,单轴看不出来一旦联动就接不上了。再说还有加减速呢,这玩意没五六年一般找不到门,输出频率的准度起码要到0.01Hz ibmx311 发表于 2023-4-23 17:52
对于机床的运动控制而言这些东西都没什么用,比方说机床跑F480算出来频率是20k,那要是F481呢,要是F481.01 ...
(引用自32楼)
呵呵,字数补丁
页:
[1]