本人想使用STM32F103输出占空比50%的方波用于控制步进电机,共需四路.看STM32资料上说有4路定时器,每路定时器又有四路独立的比较匹配通道.
如果我用一个定时器的四路通道输出4路频率不同的占空比50%的方波行不行呢,有无解决方法.
应该可以,但要根据具体情况考虑设计
请楼主提出你的具体要求,我们来讨论。请说明四路输出的频率各是多少,变化范围是多少。
频率能行的
多谢香主这么快就回复了!
我的频率几K至几百K之间变化就行了.
我以前用AVR的.我对定时器比较匹配理解是这样的:定时器值从0开始增加.当与设定的匹配值比较相等了,定时器清零.又重新开始从0开始计数.
如果一路定时器只控制一路比较匹配时当然是没问题了.但是一路定时器控制多路频率不同的比较匹配时显然会冲突了.因为定时器清0的时间不一样.会互相影响.
当然.一个定时器控制产生四路周期相同的PWM波当然是没问题的.
我在STM32的数据手册里实在找不到答案.
再问一个问题:频率变化的精度要求多高?
不要说精度越高越好,这样等于没说。
使用STM32的单个普通定时器产生4路不同频率的方波
STM32的普通定时器有四路输出:TIMx_CH1、TIMx_CH2、TIMx_CH3和TIMx_CH4,可以使用输出比较的方法产生不同频率的方波输出,简单的方法是:
1)设置计数器为向上计数模式,将自动重装载寄存器设置为0xFFFF;这样计数器会循环计数。
2)每个定时器通道设置为输出比较模式,并设置比较匹配时对应的输出管脚翻转输出。
3)按照输出波形的半波周期计算出一个数值称作Half_Cyc。例如:定时器的时钟频率是72MHz,需要产生3456Hz的方波,则Half_Cyc = 72M/(3456*2) = 41667;如需要产生200kHz的方波,则Half_Cyc = 72M/(200k*2) = 180。
4)设置每个通道在输出比较匹配时产生中断,在中断中将比较寄存器的数值读出并加上Half_Cyc的数值,如果计算出的数值超过16位则舍弃超出的部分,再把这个新的数值写回相应的比较寄存器;这样下次比较成功将刚好发生在一个半波周期之后,对应的管脚将被翻转。
上述方法在要求频率不高时十分有效,但如果频率较高时会有频繁的中断产生,这时可以使用DMA加以改善。
上述方法的基础是通过不断改变输出比较的匹配点进而产生管脚翻转输出,我们可以事先计算好这些比较匹配点,并通过DMA在每次匹配时逐次更新比较寄存器的内容:
方法一、使用两个DMA缓冲区,在DMA控制器操作一个缓冲区时,程序计算好另一个缓冲区的数据,然后在DMA传输结束的中断处理中切换DMA操作的缓冲区。
方法二、使用一个大的DMA缓冲区,先计算好半个缓冲区的内容,启动DMA为循环模式并设置它在DMA传送一半和完成时均产生中断;启动DMA后继续计算好另外半个缓冲区的内容,当发生DMA中断时表示有一半缓冲区变空,这时在中断处理中计算好这半个缓冲区。
只要DMA缓冲区开的足够大,方法二可以保证CPU有充足的时间进行数据处理,并且保证不断地输出波形。
声明:以上说明没有经过实际验证,只是一个原理说明,也许还有没考虑周全的地方。
看来只能用版主的方法了
又研究了下手册,它的比较匹配模式跟AVR是不一样的,它的定时器与比较值相等时并不自己清0定时器。要做四路不同频率的只能用版主的方法了
控制步进电机好像不需要很多种频率,只需要快慢各几种频
我前面一直在问“频率变化范围是多少?”“频率变化的精度要求多高?”,如果能够定义一些指定的频率和对频率的精度要求不高,我在5楼描述的方法应该可以有所简化。
可以4路通道都使用PWM方式
但是4路的频率应该一样,占空比可以不一致。
PWM方式频率可调吗?
我想PWM的频率每6MS变一次,频率范围为500HZ--40KHZ,能实现这样的功能吗?
回楼上可以的
如果是用一个定时器产生四路PWM,频率是可调的.但是四路的频率只能是相同的.
回复楼上
楼主的这个问题刚好昨天我问了ST的技术支持了,
4路PWM频率不同的话是需要占用4个定时器的。
一个定时器的4路PWM只能频率相同、输出占空比不同。
13楼所说的前提是使用定时器的PWM模式
但如果使用我在5楼提出的方案,没有那样的限制,一个定时器的4路输出可以是不同的频率。