落叶知秋 发表于 2020-4-8 14:58:04

在stm32f103上面写了一个脉冲模块,6通道的大概能到20KHz……

标题:在stm32f103上面写了一个脉冲模块,6通道的大概能到20KHz……

最近空闲的时候在stm32f103上,仿照grbl的stepper流程写了一个差不多功能的模块,
不同的是grbl的是联动处理,我写的是每个通道可以独立的,写完测试了一下发现速度有点低,
在带了6个脉冲通道的情况下,中断占时就快到40us了,我只测试到了20KHz的样子,就没往上测。

我是觉得这样的速度有点低的,4通道的话40KHz,2通道的话60KHz,差不多这样子……
有坛友做过类似工作的话,交流一下?是否有提高的空间?

代码的话先不放了,没什么太大的价值,大概的框架如下:
定时中断 ISR1
{
拉高管脚(上次计算的结果)
启动定时中断ISR2,拉低管脚

for (遍历轴)
{
    从指令缓冲区取数据计算
    if (是否需要拉高管脚)
      ....
}

全部空闲则停止定时中断
}

定时中断 ISR2
{
拉低所有轴管脚
}

亽亼 发表于 2020-4-8 15:49:46

只开一个定时器,大概500K中断频率,每个引脚对应一个变量计数,想要引脚什么频率就看变量计数值,翻转IO输出。

落叶知秋 发表于 2020-4-8 16:26:59

亽亼 发表于 2020-4-8 15:49
只开一个定时器,大概500K中断频率,每个引脚对应一个变量计数,想要引脚什么频率就看变量计数值,翻转IO输 ...

大概的流程是这样的啊,但你说的500KHz……你认真的吗?

亽亼 发表于 2020-4-8 17:30:01

落叶知秋 发表于 2020-4-8 16:26
大概的流程是这样的啊,但你说的500KHz……你认真的吗?

f103就72M,500K应该还行吧,不行的话你就降一些,基本上芯片跑这个中断就没办法跑其他了。
也没啥办法,谁让你要用f103呢。

wye11083 发表于 2020-4-8 18:28:33

亽亼 发表于 2020-4-8 17:30
f103就72M,500K应该还行吧,不行的话你就降一些,基本上芯片跑这个中断就没办法跑其他了。
也没啥办法, ...

兄弟,这种多通道高频率的中断。。任何cpu都扛不动啊。放i7上也能把核占满,而且实时性根本无法保证。因为cpu架构不擅长做这种事情。专业的活要给专业的工具去做,要么用2个stc去专门做这个,stm32发指令,要么用一片fpga代替stm32,跑个riscv软核一样干活,这样别说6路了,600路都能轻松搞定。

亽亼 发表于 2020-4-8 18:42:16

wye11083 发表于 2020-4-8 18:28
兄弟,这种多通道高频率的中断。。任何cpu都扛不动啊。放i7上也能把核占满,而且实时性根本无法保证。因 ...

多通道高速脉冲一般是推荐fpga来搞,我这是针对lz的代码提另外一个可能方案(该方案还不一定可行),实际效果说实话我都没试过。

落叶知秋 发表于 2020-4-8 20:27:44

亽亼 发表于 2020-4-8 18:42
多通道高速脉冲一般是推荐fpga来搞,我这是针对lz的代码提另外一个可能方案(该方案还不一定可行),实际 ...

多谢你提意见,但500khz的中断,不知道是你太高看stm32f103,还是太小看stm32f103?

落叶知秋 发表于 2020-4-8 20:29:33

wye11083 发表于 2020-4-8 18:28
兄弟,这种多通道高频率的中断。。任何cpu都扛不动啊。放i7上也能把核占满,而且实时性根本无法保证。因 ...

用逻辑器件去做stepper是比较合理,我只是在探究这款芯片的性能可以去到哪里……

liangws201 发表于 2020-4-8 20:44:06

对lz的想法蛮有意思的。

whatcanitbe 发表于 2020-4-8 23:30:07

为什么电平拉低不能在同一个定时器中断呢?

qinxg 发表于 2020-4-9 08:32:35

把拉低拉高引脚的函数贴出来,库函数效率很低

落叶知秋 发表于 2020-4-9 08:38:25

qinxg 发表于 2020-4-9 08:32
把拉低拉高引脚的函数贴出来,库函数效率很低

用的标准库的接口,或许可以自己写寄存器看看有没有省些时间

shiang 发表于 2020-4-9 08:38:38

楼上说的对,看下这段代码的汇编,能不能再精简

落叶知秋 发表于 2020-4-9 08:45:05

whatcanitbe 发表于 2020-4-8 23:30
为什么电平拉低不能在同一个定时器中断呢?

不是不能,但拉低电平安排在另外一个中断里,是为了将最多的时间留给ISR1里面的计算流程,
ISR2的优先级会比ISR1的高,耗时也短很多,几个us,其余时间都为了给ISR1里面处理。
如果在同一个定时器中断的话,原本ISR1里面的流程就很占时间,ISR2里面流程占时少,这样会浪费CPU时间,
而且如果动态改定时器中断间隔的话,有可能会让脉冲的高电平持续时间波动更大,受ISR1的耗时影响,
我觉得还不如用两个定时器好些

modbus 发表于 2020-4-9 09:20:34

落叶知秋 发表于 2020-4-9 08:38
用的标准库的接口,或许可以自己写寄存器看看有没有省些时间

想速度快就直接操作IO口,以103的能力单通道搞到500K没问题

落叶知秋 发表于 2020-4-9 09:43:40

modbus 发表于 2020-4-9 09:20
想速度快就直接操作IO口,以103的能力单通道搞到500K没问题

如果只是一两个脉冲通道的话,就不会用这种软件stepper模块了,直接用定时器的pwm模式,可以做到更高频率,还不占CPU时间。
还有,考虑到中断入栈出栈,还有缓冲区和计算,你说的500K,也是认真的?

rifjft 发表于 2020-4-9 18:52:15

{:smile:}双定时器来实现,还可以这样玩……学习了{:lol:}

ndk 发表于 2020-4-9 18:55:18

一个cpld,多路输出稳定,释放cpu压力

落叶知秋 发表于 2020-4-9 19:52:57

ndk 发表于 2020-4-9 18:55
一个cpld,多路输出稳定,释放cpu压力

除了成本高了点,还需要设计和维护cpld的程序,估计后面这点是很多人不用cpld的最大原因{:biggrin:}

其实如果想要的脉冲通道不是很多,又不嫌复杂的话,可以整个DMA的定时器脉冲输出功能,或是级联定时器PWM,
但我嫌做起来麻烦,而且电路管脚有要求,就没有去尝试了

落叶知秋 发表于 2020-4-20 21:39:54

上周末把代码优化了一下,主要有3点:
1. 把GPIO管脚的处理,从使用标准库,改为直接写寄存器,不进行库函数里的那些ASSERT检查;
2. 把两个Timer的机制改为一个Timer了,拉低脉冲管脚的处理,直接放在缓冲处理和时间计算后面;
3. 把for循环语句去掉,替换成宏展开。

优化效果:6通道的脉冲,在Timer里面进行耗时计算,优化前37us,优化后27us
步骤优化占比:(1) 库函数优化,减少了5us;(2) Timer机制优化3us;(3) for循环优化2us(有3个地方用到了)

看上去只能优化到这样,有更好想法的坛友请告知哈{:biggrin:}

19504643 发表于 2020-4-20 22:17:41

超频
降低flash周期

落叶知秋 发表于 2020-4-20 22:48:18

19504643 发表于 2020-4-20 22:17
超频
降低flash周期

没试过超频使用,会有什么问题吗?

whatcanitbe 发表于 2020-4-20 23:18:11

每个轴单独一个计数器还是共用一个计数器?

落叶知秋 发表于 2020-4-21 08:32:59

whatcanitbe 发表于 2020-4-20 23:18
每个轴单独一个计数器还是共用一个计数器?

“计数器” - 我当作是每个轴的时间事件记录器,是每个轴独立的,原来grbl的方法也是每个轴独立的,只不过是计算是联动的,以短轴为基础

jxyctwt 发表于 2020-5-8 07:28:53

直接上H7@480M,八轴联动800KHz,同样算法M4@168MKHz,八轴联动200K极限,150K妥妥的。脉冲输出架构和你的差不多,不过我的类似AVR446的,定时器时间每次重新计算的,因此用的长轴基础,八轴联动在两个定时器里面做的,很容易拓展成12轴。

落叶知秋 发表于 2020-5-10 13:09:43

jxyctwt 发表于 2020-5-8 07:28
直接上H7@480M,八轴联动800KHz,同样算法M4@168MKHz,八轴联动200K极限,150K妥妥的。脉冲输出架构和你的 ...

“八轴联动”,联动的意思我当作应该是grbl那种,每个运动段可以设置的轴数,这种方式感觉多轴后不太实用,运动段必须等到所有轴完成后才结束

dearterry30 发表于 2020-5-10 14:27:26

不错,学习了{:victory:}

wenchm2015 发表于 2022-4-1 15:59:57

应该写下去,并把测试结果,测试截图发上来;

Stm32Motor 发表于 2023-4-23 16:54:19

加减速控制也在这里面?

落叶知秋 发表于 2023-4-23 17:06:12

Stm32Motor 发表于 2023-4-23 16:54
加减速控制也在这里面?
(引用自29楼)

不在,这帖子里面讨论的是stepper,只是发脉冲的

Stm32Motor 发表于 2023-4-23 17:24:14

那就是固定的频率发脉冲?

ibmx311 发表于 2023-4-23 17:52:59

对于机床的运动控制而言这些东西都没什么用,比方说机床跑F480算出来频率是20k,那要是F481呢,要是F481.01呢,单轴看不出来一旦联动就接不上了。再说还有加减速呢,这玩意没五六年一般找不到门,输出频率的准度起码要到0.01Hz

落叶知秋 发表于 2023-4-23 18:40:53

ibmx311 发表于 2023-4-23 17:52
对于机床的运动控制而言这些东西都没什么用,比方说机床跑F480算出来频率是20k,那要是F481呢,要是F481.01 ...
(引用自32楼)

呵呵,字数补丁
页: [1]
查看完整版本: 在stm32f103上面写了一个脉冲模块,6通道的大概能到20KHz……