完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
在驱动伺服或步进电机的时候,都需要用精确的PWM脉冲数。并且PWM的频率都还挺高,一般100kHz,还可能是多路同时工作,比如驱动4个伺服。
大体看到有两种做法可以实现精确的脉冲数:1,外部再弄个IO口接到PWM脚上,用外部中断的办法,单独来计数。此办法可行,但非常不科学,并且浪费资源。 2,使用定时器,使用一个和PWM频率一致的定时器,使用定时器中断来计数。此方法比第一种办法好了很多,但是仍然感觉比较笨。 STM32的定时器寄存器中有一个重复次数寄存器RCR。 这个寄存器在定时器中可以使用,个人想,若这个重复次数能做到PWM的重复次数计数该多好? 请问大伙,这个能实现吗?或者有不用每个脉冲中断一次的办法实现PWM的精确计数吗? |
|
相关推荐
37个回答
|
|
|
|
|
|
|
|
|
本帖最后由 王建 于 2014-12-17 13:13 编辑
我测试用STM32F103C8发出两路PWM,一路200KHz,另外一路150KHz,这两路频率都是固定的,同时以位置控制的模式(精确个数脉冲)驱动两个伺服电机,还带有USB通讯,没有什么问题。要搞六路的话,还得看资料,换资源多的芯片,六路有点多。DMA方式输出,控制机器人最少8路PWM输出,至少需要8路DMA传输完毕中断。不如上CAN open。 |
|
|
|
|
|
RCR是重复次数计数器,如果你想要用这个你必须这样设置,
假设你想要测量的是100PWM周期为一次计数,需要重复计数10次的话: 1、选择TIM1的时钟源为“外部时钟源模式1”; 2、TIM1向上计数,且计数周期为100; 3、重复计数RCR设为10; 4、设置产生UDE更新时中断,你已经测量到100x10=1000个脉冲了。 以前用过STM32的PWM计数,测量发动机转速,都是基于比较捕获引脚的定时器计数或是中断计数,转速快的时候就用计数方式,转速慢的时候就测量周期,也挺好用的,就是中断进的次数多,不过我的项目中处理速度跟转速有关,所以必须进中断。 |
|
|
|
|
|
|
|
|
|
|
|
可以选择使用DMA来控制发送的脉冲数,最大可以65535个。如果你的脉冲宽度一致,则DMA地址不增加的方式传输;如果你想使用不同频率,可以设置不同的装载值,PWM使用单次触发。如果你发送的脉冲数超过65535个,则可以使用DMA传输完成中断中切换DMA传输的数据起始地址及发送数量,继续发送。这个方法即方便,又减轻CPU的负担,可以同时驱动多个电机工作,还可以根据电机的启动-运行-停止使用不同的频率。不知道这个方法符不符合你的要求呢。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
我也遇到了上述问题求教
|
|
|
|
|
雨小了111 发表于 2019-3-13 19:40 谢谢~,请问实现过吗? |
|
|
|
|
|
关注中!!!
|
|
|
|
|
lanziji 发表于 2019-3-13 19:02 你是怎么实现控制PWM个数的呢? |
|
|
|
|
|
学习学习,不太懂
|
|
|
|
|
|
楼主有可实现的方法么
|
|
|
|
|
|
理论上是可行的,实际上的代码需要花费时间调试,精确控制脉冲个数的代码也都是公开的,但不在这个网站。
|
|
|
|
|
|
理论上是可行的,实际上的代码需要花费时间调试
|
|
|
|
|
|
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; |
|
|
|
|
|
请问STM32F4的PWM输出是和F103一样给定了时钟通道挂接的GPIO端口,还是可以自己随便设呢?
|
|
|
|
|
|
没想到好方法,所以精确控制一般没用PWM
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1328 浏览 1 评论
1070 浏览 0 评论
936 浏览 0 评论
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
5174 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
3974 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-14 07:47 , Processed in 1.307807 second(s), Total 112, Slave 94 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
16490