☰
STM32基于高级定时器的变频脉冲输出
2026/10/31 2:16:12 网站建设 项目流程

适用场景:步进电机加减速和位置控制

实验效果:输出指定数量的连续变频脉冲

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。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询