磊磊映画 发表于 2021-11-22 19:20:57

STM32驱动步进电机精确可控输出脉冲个数方案及对比

本帖最后由 磊磊映画 于 2021-11-22 19:25 编辑

最近在调试 步进电机, 控制方式主要是通过脉冲计数方式 控制步进电机运动,具体的运动距离由 发送的脉冲数来决定实现的。
以前的项目用需要两路步进电机信号,主从定时器脉冲计数方式需要占用两个定时器,
现在项目用了6路步进电机 继续用主从计数方式明显 定时器不够用了,经过查阅资料 转帖原贴

发现还可以使用:
定时器CHx独立通道dma,改变dma传输长度控制个数方式来实现可控脉冲数控制步进电机运动
节省单片机资源 一路定时器最多可输出4路,还不需要CPU介入。
比之前用的主从计数方式方便多了。特分享如下:
精确可控输出脉冲个数方案 总共有7种:
各有优缺点 :
7种实现方案对比:

1.低频定时器翻转io,中断内统计个数         优点:简单                                             缺点:浪费cpu,频率可能低
2.输出比较模式,中断内统计个数               优点:可变周期 占空比,路数多的去了   缺点:浪费cpu,频率也可能低
3.pwm连通外部中断或外部计数数个数          优点:简单                                          缺点:浪费cpu,浪费定时器待测(懒得用这个方法)
4.高级定时器 重复计数寄存器+单脉冲模式    优点:频率比前俩高点                            缺点:定时器固定了,只能高级定时器,路数少待测(懒得用这个方法)
5.定时器主从模式                                       优点:周期占空比都可变                         缺点:用两个定时器,路数也少
6.定时器UP溢出通道dma,改变dma传输长度控制个数   优点:能读取剩余脉冲个数
                                                                可变占空比,周期,用于可以调速等         缺点:好像没哈缺点(与7比路数少浪费定时器,推荐7)
7.定时器CHx独立通道dma,改变dma传输长度控制个数(上一个用的溢出dma一个定时器只能产生一路有点浪费,改成用通道dma)
                                                            一个定时器可以产生3路或4路,dma限制不能是4,例如定时器5、8可以4路
                                                               优点:能读取剩余脉冲个数
                                                               可变占空比,周期,用于可以调速等         缺点:好像没哈缺点

















丢丢时光机 发表于 2021-11-22 19:52:55

好贴,赞一个

advarx21ic 发表于 2021-11-22 19:56:36

本帖最后由 advarx21ic 于 2021-11-22 19:59 编辑

方法6可能好一点,频率可调

更正:
搞错了,7也是频率可调

minzhuzhongguo 发表于 2021-11-23 04:42:20

值得参考,感谢!

xiaoergao 发表于 2021-11-23 08:04:46

用ch通道如果同一个timer 下2个ch的脉冲需要频率不一样就比较难以实现。

三年模拟 发表于 2021-11-23 09:01:00

楼主不错,已经玩精通了单片机控制步进电机,但是加上编码器反馈单片机就很吃力了,我以前的项目用的主从定时器方案,不过现在的运动控制方案,已经改用fpga了,最多支持16路步进,带编码,脉冲频率从1k->1M 无压力输出,支持t型和s型,路程都是动态计算的,fpga其实要比单片机实现简单的。

advarx21ic 发表于 2021-11-23 09:05:48

xiaoergao 发表于 2021-11-23 08:04
用ch通道如果同一个timer 下2个ch的脉冲需要频率不一样就比较难以实现。

对,刚刚看了数据手册,每个定时器只有一个ARR寄存器用来控制周期,所以,每个ch独立控制周期是不可能的了。

yelong98 发表于 2021-11-23 09:30:45

方式7受限于dma通道数量吧?stm32f4能做多少轴?

ibmx311 发表于 2021-11-23 09:49:06

电机用的话主要是加减速,加减速一进去就复杂了。然后可靠一点的要闭环,如果采用绝对编码器闭环又会严重开销速度,然后挂入系统要有总线协议再加上协议基本概念已经是体系级别的了,外设配置只不过是必须要攻克的项目之一罢了

磊磊映画 发表于 2021-11-23 14:45:37

xiaoergao 发表于 2021-11-23 08:04
用ch通道如果同一个timer 下2个ch的脉冲需要频率不一样就比较难以实现。

要求不高的话,可以串行实现。并行实现不了了

磊磊映画 发表于 2021-11-23 14:46:13

ibmx311 发表于 2021-11-23 09:49
电机用的话主要是加减速,加减速一进去就复杂了。然后可靠一点的要闭环,如果采用绝对编码器闭环又会严重开 ...

嗯,先把驱动调通

GUOHUDONG 发表于 2021-11-23 15:04:55

值得参考,感谢!

cihuhit 发表于 2021-11-23 21:13:03

谢谢楼主,最近正好要用上

whatcanitbe 发表于 2021-11-23 22:08:00

谢谢共享,正好需要

lcmdw 发表于 2021-11-23 22:21:49

值得参考,感谢!

advantech 发表于 2021-11-23 23:09:09

三年模拟 发表于 2021-11-23 09:01
楼主不错,已经玩精通了单片机控制步进电机,但是加上编码器反馈单片机就很吃力了,我以前的项目用的主从定 ...

我正在做ZYNQ的方案,动态计算都是FPGA实现那就太牛了.

chenhuiedu 发表于 2021-11-23 23:14:40

最近一直在研究多轴的方案,这资料真贴心,谢谢楼主

xiaoergao 发表于 2021-11-24 10:17:07

6.定时器UP溢出通道dma,改变dma传输长度控制个数   优点:能读取剩余脉冲个数
其他的机种都用过,目前使用的是这个方式。相对来说比较折中。
另外DMA的方式有个问题,即在高速的时候停止timer可能会过冲。如果1Mhz的频率发送脉冲的时候,DMA产生中断后停止TIMER可能会多发几个脉冲。我使用F4和H7测试500kHz以内的速度都没有问题。

xiaoergao 发表于 2021-11-24 10:23:06

另外很多坛友提到加减速的问题,我是这样做的。
在CPU空闲的时候不断轮训已经发送的脉冲数,动态改变Timer的频率。因为大多数应用加减速的过程中对速度要求不太严格。所以速度变化晚那么几个ms影响不大。这样实际是利用CPU的空闲资源。另外既然是运动控制,像急停、极限等信号也是要不断判断的,也需要CPU不断的轮训。采用中断的话如果机械开关或者光电感应器会有信号抖动,处理起来会稍微麻烦一些。

磊磊映画 发表于 2021-11-24 10:23:10

chenhuiedu 发表于 2021-11-23 23:14
最近一直在研究多轴的方案,这资料真贴心,谢谢楼主

{:biggrin:}这是个套餐,各种方案都有

whatcanitbe 发表于 2021-11-26 13:02:58

dma怎么实现插补有没有研究?

磊磊映画 发表于 2021-11-26 13:34:58

whatcanitbe 发表于 2021-11-26 13:02
dma怎么实现插补有没有研究?

st官方有个步进电机 驱动方案    用了DMA和 中断实现的 我下载资料还没来得及看 发上来你看看


whatcanitbe 发表于 2021-11-26 14:26:14

磊磊映画 发表于 2021-11-26 13:34
st官方有个步进电机 驱动方案    用了DMA和 中断实现的 我下载资料还没来得及看 发上来你看看




里面有插补相关的?

Corona_spark 发表于 2021-11-26 14:45:57

好资料!收藏了。

lm4766 发表于 2021-11-26 20:31:30

收藏一下。

天下乌鸦一般黑 发表于 2022-3-23 21:41:49

多谢分享。看了7.1的办法。我试了下,低速还好,高速(大概在250Khz)的脉冲速度以上,数量就不对了。比如我发10个,实际示波器上,只有9个。~
对着芯片手册的定时器和dma部分分析了半天也没想明白咋回事。
有高手指点下么。

zhcj66 发表于 2022-11-4 08:25:36

磊磊映画 发表于 2021-11-23 14:45
要求不高的话,可以串行实现。并行实现不了了
(引用自10楼)

串行能说说原理不?

akey3000 发表于 2022-11-4 08:55:53

三年模拟 发表于 2021-11-23 09:01
楼主不错,已经玩精通了单片机控制步进电机,但是加上编码器反馈单片机就很吃力了,我以前的项目用的主从定 ...
(引用自6楼)

步进电机控制看起来也很复杂

yangpeng012 发表于 2022-11-7 09:54:12

DMA方式没用过,一直是比较输出模式(PWM1/PWM2)可控占空比

whatcanitbe 发表于 2022-11-7 10:05:44

yangpeng012 发表于 2022-11-7 09:54
DMA方式没用过,一直是比较输出模式(PWM1/PWM2)可控占空比
(引用自29楼)

你的比较输出模式是怎么弄的?

yangpeng012 发表于 2022-11-7 10:53:19

whatcanitbe 发表于 2022-11-7 10:05
你的比较输出模式是怎么弄的?
(引用自30楼)

可以参考楼主发的示例,原理基本一样的

yangpeng012 发表于 2022-11-8 14:26:07

楼主有时间帮忙看一下这个问题吗? 输出比较模式,中断内统计个数

vavasi 发表于 2022-11-8 20:54:00

赞一个谢谢楼主

Tangdonghua 发表于 2023-6-29 21:19:52

请问一个7.1和7.2可以做到频率动态改变吗?

szafa 发表于 2023-7-5 13:50:52

Tangdonghua 发表于 2023-6-29 21:19
请问一个7.1和7.2可以做到频率动态改变吗?
(引用自34楼)

可以的。完全没问题

liuzhijun2008 发表于 2023-12-12 23:23:04

真不错,学习了
页: [1]
查看完整版本: STM32驱动步进电机精确可控输出脉冲个数方案及对比