Skip to content

PWM信号输出

本PWM信号输出的原理是: 通过定时器TIM1产生PWM信号,然后通过GPIO输出. STM32F1xx的定时器本身支持PWM输出. 只要在 stm32cubemx 中配置好定时器,然后通过代码调用即可.

一.PWM信号的产生原理

  • 定时器TIM1通过信号源产生定时信号.并开始计数.
  • 当计数器的值等于比较寄存器的值时,输出电平翻转.
  • 当计数器的值等于自动重装载寄存器的值时,计数器清零.

二.PWM信号输出原理图

PWM信号输出原理图

三.使用STM32CUBEMX配置定时器TIM1

PWM信号输出原理图PWM信号输出原理图

数据计算方法:

  • 根据系统时钟计算分频值,假如系统时钟是 72MHz,要得到合适的方波频率,需要设置为分频后的时钟
  • 分频后时钟 = 72MHz / (PSC+1)
  • 如果分频后的时钟为 1Mhz的话,那么 Counter Settings => PSC(Perscaler)应该设置为 71
  • 此时,TIM1会在每1us就会将计数增加1
  • 1Mhz的周期是 1/110001000 = 1us ,
  • 1khz的周期是 1/1000 = 1ms 所以需要999次才能产生1ms的值 . 也就是说每计数999次后,就会重新到0开始计数.
  • 所以: Counter Period(AutoReload Register) 为 999
  • 如果要生成50%的PWM信号的那就需要在 500时转换电平才行. 那么: Pulse 设置为 999 * 50% = 500 即可.

四.代码实现

通过STM32CUBEMX生成的代码已经完成了99%的工作了. 只需要在main函数中启用PWM即可.

c
int main(void)
{
    HAL_Init();
    SystemClock_Config();
    
    MX_GPIO_Init();
    MX_TIM1_Init();
    
    // 启动PWM
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
    
    while (1)
    {
    }
}

此时在 PA8 上已经输出了50%的PWM信号.