请问STM32怎么输出精确PWM脉冲数?

2019-07-14 13:42发布

在驱动伺服或步进电机的时候,都需要用精确的PWM脉冲数。并且PWM的频率都还挺高,一般100kHz,还可能是多路同时工作,比如驱动4个伺服。
大体看到有两种做法可以实现精确的脉冲数:1,外部再弄个IO口接到PWM脚上,用外部中断的办法,单独来计数。此办法可行,但非常不科学,并且浪费资源。   2,使用定时器,使用一个和PWM频率一致的定时器,使用定时器中断来计数。此方法比第一种办法好了很多,但是仍然感觉比较笨。
STM32的定时器寄存器中有一个重复次数寄存器RCR。   这个寄存器在定时器中可以使用,个人想,若这个重复次数能做到PWM的重复次数计数该多好?
请问大伙,这个能实现吗?或者有不用每个脉冲中断一次的办法实现PWM的精确计数吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
18条回答
lanziji
2019-07-16 15:20
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;

一周热门 更多>