适用场景:步进电机加减速和位置控制
实验效果:输出指定数量的连续变频脉冲
STM32F4系列拥有两个高级定时器(TIM1和TIM8),其中高级定时器除了具备互补PWM输出、死区控制以及刹车保护可用于无刷电机驱动器控制外,还具备重复计数寄存器(RCR),可用于控制输出PWM脉冲数量。
通过STM32CubeMX生成HAL库文件,在软件中配置外部晶振频率为8Mhz(视实际情况而定),系统主频设定为168Mhz,APB1总线下的定时器时钟频率为84Mhz,APB2总线下的定时器时钟频率为168Mhz。
配置定时器1的通道1输出PWM,对应引脚为PE9。
配置定时器2周期为1ms并使能中断。
int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM1_Init(); MX_TIM2_Init(); __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1, 0); HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); SET_BIT(htim1.Instance->CR1, TIM_CR1_OPM); HAL_TIM_Base_Start_IT(&htim2); while(1) { } }void TIM2_IRQHandler(void) { HAL_TIM_IRQHandler(&htim2); Pulse_Test(); }void Pulse_Set_RCR(long freq,long count) { uint16_t psc, ccr; uint32_t arr; if (count <= 0 ||count > 256) return; psc = 0; arr = (timer_clock / ((psc + 1) * freq)) - 1; if (arr > 65535) { psc = (timer_clock / freq / 65536) + 1; arr = (timer_clock / ((psc + 1) * freq)) - 1; } ccr = (uint32_t)((arr + 1)>>1); htim1.Instance->CR1 &= ~TIM_CR1_CEN; __HAL_TIM_SET_PRESCALER(&htim1, psc); __HAL_TIM_SET_AUTORELOAD(&htim1, arr); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, ccr); htim1.Instance->RCR=count-1; HAL_TIM_GenerateEvent(&htim1,TIM_EVENTSOURCE_UPDATE); htim1.Instance->CR1 |= TIM_CR1_CEN; return; }编写测试用例,实现效果为PE9引脚输出从第一毫秒1khz1个脉冲直至第200毫秒200khz200个脉冲的连续变频脉冲。
void Pulse_Test() { static bool state=1; static long pulse=1; static int freq=1000; if(state) { Pulse_Set_RCR(freq,pulse); } pulse++; if(pulse>200) { pulse=1; state=!state; } freq=1000*pulse; }通过逻辑分析仪测量PE9引脚结果如下:
共输出20100个脉冲,频率由1khz连续变化至200khz。