STM32F103单片机的PWM :频率 与 定时器中断问题

测试用的单片机是STM32F103C8T6 @72MHz,使用TIM1的通道1输出PWM。

示波器200MHz带宽(原120MHz软升级)。

TIM1配置:

预分频值:Prescaler(PSC) = 0;

自动装载值:Counter Period(ARR) = 1;

捕获比较寄存器值(设置脉宽):Capture Compare Register(CCR) = 1;

 

如此设置PWM频率可达72/2=36MHz。

TIM1_CH1引脚悬空波形(采样率不足,波形变形)

 

注意:想要提高PWM频率就不要开启对应定时器的中断:  

//HAL_TIM_Base_Start_IT(&htim1);    //该函数用于开启定时器中断,此时应该屏蔽掉

若开启了定时器中断,预分频值要设置到35以上才能工作,算下来PWM频率就只能输出1MHz或更低,也意味着定时器中断最短周期约0.5μs;

若在定时器中断回调函数里改变IO电平观察周期,会发现即便设置了更高的定时器频率,IO电平改变周期在4μs以上而不是0.5μs;

在开启中断事件的定时器上设置周期低于4μs时,会产生很多奇怪问题:

(以下测试用TIM1产生PWM,用TIM2定时器中断事件翻转IO电平)

比如定时器中断开启函数在PWM开启函数之前,定时中断可以翻转电平(周期4μs),但PWM无波形输出:

STM32F103单片机的PWM :频率 与 定时器中断问题_第1张图片

反过来PWM在定时器中断之前开启,定时器中断可以翻转电平(周期4μs)、PWM可以正常输出波形:

STM32F103单片机的PWM :频率 与 定时器中断问题_第2张图片

我尝试在开启定时器中断之前用 __HAL_TIM_CLEAR_FLAG(&htim2, TIM_IT_UPDATE); 清除中断标志,问题没有解决。

 

 

总结:

(以下数据在 STM32F103 @72MHz 测试,仅供参考)

  1. 一个定时器只开启PWM功能时,PWM频率最高可达36MHz。
  2. 一个定时器既开启PWM又开启UpDate中断时,PWM频率最高可达1MHz。
  3. 一个定时器用于输出PWM、另一个定时器用于中断时还会出现几种情况:  

         ①用于中断的定时器设定周期处于4μs以上时,两个定时器互不冲突正常工作。

         ②用于中断的定时器设定周期处于4μs以下时:如果定时器中断比PWM先开启了,中断回调周期还是4us但PWM无法输出;如果PWM比定时器先开启,中断回调周期4μs,PWM可以正常输出(频率可达36MHz)。

你可能感兴趣的:(单片机开发)