微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 如何使用STM32输出精确PWM脉冲数和解决方法

如何使用STM32输出精确PWM脉冲数和解决方法

时间:10-02 整理:3721RD 点击:
最近看了一点资料,发现在驱动伺服或步进电机的时候,都需要用精确的PWM脉冲数。并且PWM的频率都还挺高,一般100kHz,还可能是多路同时工作,比如驱动4个伺服。
大体看到有两种做法可以实现精确的脉冲数:
1,外部再弄个IO口接到PWM脚上,用外部中断的办法,单独来计数。此办法可行,但非常不科学,并且浪费资源。  
2,使用定时器,使用一个和PWM频率一致的定时器,使用定时器中断来计数。此方法比第一种办法好了很多,但是仍然感觉比较笨。
STM32的定时器寄存器中有一个重复次数寄存器RCR。   这个寄存器在定时器中可以使用,我想,如果这个重复次数能不能做到PWM的重复次数计数?
请问大家,这个能实现吗?
或者有不用每个脉冲中断一次的办法实现PWM的精确计数吗?

RCR是重复次数计数器,如果你想要用这个你必须这样设置,
假设你想要测量的是100PWM周期为一次计数,需要重复计数10次的话:
1、选择TIM1的时钟源为“外部时钟源模式1”;
2、TIM1向上计数,且计数周期为100;
3、重复计数RCR设为10;
4、设置产生UDE更新时中断,你已经测量到100x10=1000个脉冲了。
以前用过STM32的PWM计数,测量发动机转速,都是基于比较捕获引脚的定时器计数或是中断计数,转速快的时候就用计数方式,转速慢的时候就测量周期,也挺好用的,就是中断进的次数多,不过我的项目中处理速度跟转速有关,所以必须进中断。

直接用单片机的pwm不好控制,我控制步进电机的方法就是用到精确脉冲数
形如
for(脉冲数)
{
IO高电平;延时;IO低电平;延时;
}

可以选择使用DMA来控制发送的脉冲数,最大可以65535个。如果你的脉冲宽度一致,则DMA地址不增加的方式传输;如果你想使用不同频率,可以设置不同的装载值,PWM使用单次触发。如果你发送的脉冲数超过65535个,则可以使用DMA传输完成中断中切换DMA传输的数据起始地址及发送数量,继续发送。这个方法即方便,又减轻CPU的负担,可以同时驱动多个电机工作,还可以根据电机的启动-运行-停止使用不同的频率。不知道这个方法符不符合你的要求呢。

你的精确是什么意思?可控吗?

精确可控就是: 比如我要输出100kHZ,占空比50%的PWM,发出102个脉冲后,自动停止。
发出的PWM脉冲数是准确的。而不仅仅是频率或占空比。

好。。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top