搜索
bottom↓
回复: 32

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

[复制链接]

出40入42汤圆

发表于 2020-4-8 14:58:04 | 显示全部楼层 |阅读模式
标题:在stm32f103上面写了一个脉冲模块,6通道的大概能到20KHz……

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

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

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

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

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

  13. 定时中断 ISR2
  14. {
  15.   拉低所有轴管脚
  16. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2020-4-8 15:49:46 | 显示全部楼层
只开一个定时器,大概500K中断频率,每个引脚对应一个变量计数,想要引脚什么频率就看变量计数值,翻转IO输出。

出40入42汤圆

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

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

出0入0汤圆

发表于 2020-4-8 17:30:01 | 显示全部楼层
落叶知秋 发表于 2020-4-8 16:26
大概的流程是这样的啊,但你说的500KHz……你认真的吗?

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

出0入442汤圆

发表于 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路都能轻松搞定。

出0入0汤圆

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

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

出40入42汤圆

 楼主| 发表于 2020-4-8 20:27:44 来自手机 | 显示全部楼层
亽亼 发表于 2020-4-8 18:42
多通道高速脉冲一般是推荐fpga来搞,我这是针对lz的代码提另外一个可能方案(该方案还不一定可行),实际 ...

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

出40入42汤圆

 楼主| 发表于 2020-4-8 20:29:33 来自手机 | 显示全部楼层
wye11083 发表于 2020-4-8 18:28
兄弟,这种多通道高频率的中断。。任何cpu都扛不动啊。放i7上也能把核占满,而且实时性根本无法保证。因 ...

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

出0入0汤圆

发表于 2020-4-8 20:44:06 | 显示全部楼层
对lz的想法蛮有意思的。

出100入85汤圆

发表于 2020-4-8 23:30:07 | 显示全部楼层
为什么电平拉低不能在同一个定时器中断呢?

出0入4汤圆

发表于 2020-4-9 08:32:35 | 显示全部楼层
把拉低拉高引脚的函数贴出来,  库函数效率很低

出40入42汤圆

 楼主| 发表于 2020-4-9 08:38:25 | 显示全部楼层
qinxg 发表于 2020-4-9 08:32
把拉低拉高引脚的函数贴出来,  库函数效率很低

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

出0入0汤圆

发表于 2020-4-9 08:38:38 | 显示全部楼层
楼上说的对,看下这段代码的汇编,能不能再精简

出40入42汤圆

 楼主| 发表于 2020-4-9 08:45:05 | 显示全部楼层
whatcanitbe 发表于 2020-4-8 23:30
为什么电平拉低不能在同一个定时器中断呢?

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

出0入0汤圆

发表于 2020-4-9 09:20:34 | 显示全部楼层
落叶知秋 发表于 2020-4-9 08:38
用的标准库的接口,或许可以自己写寄存器看看有没有省些时间

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

出40入42汤圆

 楼主| 发表于 2020-4-9 09:43:40 来自手机 | 显示全部楼层
modbus 发表于 2020-4-9 09:20
想速度快就直接操作IO口,以103的能力单通道搞到500K没问题

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

出0入0汤圆

发表于 2020-4-9 18:52:15 | 显示全部楼层
双定时器来实现,还可以这样玩……学习了

出0入0汤圆

发表于 2020-4-9 18:55:18 来自手机 | 显示全部楼层
一个cpld,多路输出稳定,释放cpu压力

出40入42汤圆

 楼主| 发表于 2020-4-9 19:52:57 | 显示全部楼层
ndk 发表于 2020-4-9 18:55
一个cpld,多路输出稳定,释放cpu压力

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

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

出40入42汤圆

 楼主| 发表于 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个地方用到了)

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

出0入0汤圆

发表于 2020-4-20 22:17:41 | 显示全部楼层
超频
降低flash周期

出40入42汤圆

 楼主| 发表于 2020-4-20 22:48:18 来自手机 | 显示全部楼层
19504643 发表于 2020-4-20 22:17
超频
降低flash周期

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

出100入85汤圆

发表于 2020-4-20 23:18:11 来自手机 | 显示全部楼层
每个轴单独一个计数器还是共用一个计数器?

出40入42汤圆

 楼主| 发表于 2020-4-21 08:32:59 | 显示全部楼层
whatcanitbe 发表于 2020-4-20 23:18
每个轴单独一个计数器还是共用一个计数器?

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

出0入0汤圆

发表于 2020-5-8 07:28:53 来自手机 | 显示全部楼层
直接上H7@480M,八轴联动800KHz,同样算法M4@168MKHz,八轴联动200K极限,150K妥妥的。脉冲输出架构和你的差不多,不过我的类似AVR446的,定时器时间每次重新计算的,因此用的长轴基础,八轴联动在两个定时器里面做的,很容易拓展成12轴。

出40入42汤圆

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

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

出0入0汤圆

发表于 2020-5-10 14:27:26 | 显示全部楼层
不错,学习了

出0入0汤圆

发表于 2022-4-1 15:59:57 | 显示全部楼层
应该写下去,并把测试结果,测试截图发上来;

出50入135汤圆

发表于 2023-4-23 16:54:19 | 显示全部楼层
加减速控制也在这里面?

出40入42汤圆

 楼主| 发表于 2023-4-23 17:06:12 | 显示全部楼层
Stm32Motor 发表于 2023-4-23 16:54
加减速控制也在这里面?
(引用自29楼)

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

出50入135汤圆

发表于 2023-4-23 17:24:14 | 显示全部楼层
那就是固定的频率发脉冲?

出0入300汤圆

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

出40入42汤圆

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

呵呵,字数补丁
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 19:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表