你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于STM32输出精确PWM脉冲数的方法?  

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

评分

参与人数 1 ST金币 +2 收起 理由
glenxu + 2 当然可以!

查看全部评分

收藏 5 评论36 发布时间:2013-9-11 08:50

举报

36个回答
回答时间:2013-9-11 13:09:18

RE:关于STM32输出精确PWM脉冲数的方法?

for(脉冲数)
{
IO高电平;延时;IO低电平;延时;
}
不好意思,发帖的时候点错,接着上面的发
wjandsq 回答时间:2014-12-17 13:07:40
本帖最后由 王建 于 2014-12-17 13:13 编辑

我测试用STM32F103C8发出两路PWM,一路200KHz,另外一路150KHz,这两路频率都是固定的,同时以位置控制的模式(精确个数脉冲)驱动两个伺服电机,还带有USB通讯,没有什么问题。要搞六路的话,还得看资料,换资源多的芯片,六路有点多。DMA方式输出,控制机器人最少8路PWM输出,至少需要8路DMA传输完毕中断。不如上CAN open。
wjandsq 回答时间:2015-1-28 17:04:29
uint16_t SRC_Buffer[20] = {
180, 180, 180, 180, 180, /* 1 */
180, 180, 180, 180, 180, /* 2 */
180, 180, 180, 180, 180, /* 3 */
180, 180, 180, 180, 180, /* 4 */
};

uint16_t SRC_Buffer2[32] = {
120, 120, 120, 120, /* 1 */
120, 120, 120, 120, /* 2 */
120, 120, 120, 120, /* 3 */
120, 120, 120, 120, /* 4 */
120, 120, 120, 120, /* 5 */
120, 120, 180, 120, /* 6 */
120, 120, 120, 120, /* 7 */
120, 120, 120, 120, /* 8 */
};

/* TIM1_CH3 PWM --------------------------------------------------------------*/
/* DMA1_Channel5_Total: DMA传输次数,每次传输发送20个脉冲(200KHz,总计100us) */
uint16_t DMA1_Channel5_Total = 0;
/* Flag_DMA1_Channel5_Sart: DMA启动标志,启动后清零 */
uint16_t Flag_DMA1_Channel5_Sart = 0;
/* Flag_TIM1_PWM3_Finish: TIM1_PWM3发送完毕标志,启动后清零,完成后置位 */
uint16_t Flag_TIM1_PWM3_Finish = 1;
/* Select_Motor_Driect: 选档电机运动方向 1: 正转 0: 反转 */
uint16_t Select_Motor_Driect = 1;

/* TIM3_CH1 PWM -----------------------------------------------------------*/
/* DMA1_Channel3_Total: DMA传输次数,每次传输发送20个脉冲(300KHz,总计100us) */
uint16_t DMA1_Channel3_Total = 0;
/* Flag_DMA1_Channel3_Sart: DMA启动标志,启动后清零 */
uint16_t Flag_DMA1_Channel3_Sart = 0;
/* Flag_TIM1_PWM3_Finish: TIM1_PWM3发送完毕标志,启动后清零,完成后置位 */
uint16_t Flag_TIM3_PWM1_Finish = 1;
/* SWitch_Motor_Driect: 换档电机运动方向 1: 正转 0: 反转 */
uint16_t Switch_Motor_Driect = 1;
我爱下载 回答时间:2013-9-11 12:53:42

RE:关于STM32输出精确PWM脉冲数的方法?

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

RE:关于STM32输出精确PWM脉冲数的方法?

直接用单片机的pwm不好控制,我控制步进电机的方法就是用到精确脉冲数,形如:
for()
{
}
dennywang 回答时间:2013-9-11 20:26:39

RE:关于STM32输出精确PWM脉冲数的方法?

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

RE:关于STM32输出精确PWM脉冲数的方法?

你的精确是什么意思?可控吗?
hongtusy 回答时间:2013-9-13 10:41:13

RE:关于STM32输出精确PWM脉冲数的方法?

精确可控就是: 比如我要输出100kHZ,占空比50%的PWM,发出102个脉冲后,自动停止。
发出的PWM脉冲数是准确的。而不仅仅是频率或占空比。
yygkqzh 回答时间:2014-3-31 18:31:24

回复:关于STM32输出精确PWM脉冲数的方法?

楼主,你好!
请问你实现了吗?
我也急用这个方法,而且最好是一个定时器控制一路,因为我需要6路脉冲。
翱翔云端的鸟 回答时间:2014-12-16 16:01:32
我也遇到了上述问题求教
王云枫 回答时间:2015-1-6 18:24:02
stephenking 发表于 2013-9-11 20:26
可以选择使用DMA来控制发送的脉冲数,最大可以65535个。如果你的脉冲宽度一致,则DMA地址不增加的方式传输 ...

谢谢~,请问实现过吗?
阿飞** 回答时间:2015-1-7 23:03:30
关注中!!!
翱翔云端的鸟 回答时间:2015-1-23 15:59:42
王建 发表于 2014-12-17 13:07
我测试用STM32F103C8发出两路PWM,一路200KHz,另外一路150KHz,这两路频率都是固定的,同时以位置控制的模 ...

你是怎么实现控制PWM个数的呢?
wyxy163@126.com 回答时间:2015-1-23 17:48:18
提示: 作者被禁止或删除 内容自动屏蔽
hanmcustm 回答时间:2015-1-24 00:03:31
楼主有可实现的方法么
123下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版