STM32,CubeMX输出pwm波,实现呼吸灯。

stm32 定时器 输出PWM波 呼吸灯

使用工具:stm32f103c6tx, stlink, cubemx, keil5

PWM简介

PWM一般指脉冲宽度调制,PWM波指脉冲宽度可调的方波。

描述pwm波特征的主要参数:

    占空比 Duty : 方波高电平时间与周期的比值 (即图中的) D u t y = d y n T s T s Duty = { d_{yn}Ts over T_s } Duty=TsdynTs 周期 T : 方波的周期。 频率 f :方波周期的倒数,1s内能完成几个周期。

STM32定时器输出pwm的主要参数

利用stm32定时器可以输出pwm波。下面简要介绍要用到的几个参数。

    预分频系数 PSC :对计数时钟进行预分频,可以调配出任意的计数周期。 自动重载值 ARR : 计数模式 为UP时 :当计数值CNT中达到ARR后,自动归零,重新开始新一周期的计数。 计数模式 为DOWN时:计数值CNT由ARR开始递减,一直减到零。 捕获比较值 CCR: 模式1:当计数值CNT小于CCR时 ,引脚输出高电平; 当 计数值CNT大于CCR时,引脚输出低电平。 模式2: 当计数值CNT小于CCR时 ,引脚输出低电平; 当 计数值CNT大于CCR时,引脚输出高电平。

输出PWM波的大概工作原理(感性理解)

计数时钟TIM_CLK经过PSC预分频,计数时钟每经过一周期,计数值CNT就增加一。假设当前处于模式1,CNT小于CCR,,引脚输出高电平,构成方波的高电平时间;CNT大于CCR时,引脚输出低电平,构成方波的低电平时间。

通过修改PSC与ARR,可以修改PWM波的周期T和频率f;修改CCR,可以调整pwm波的占空比。 T = ( A R R + 1 ) ( P S C + 1 ) T I M C L K T = {(ARR+1) (PSC+1) over TIM_{CLK}} T=TIMCLK(ARR+1)(PSC+1)

f = 1 T f = {1 over T} f=T1

D u t y = C C R A R R Duty = {CCR over ARR} Duty=ARRCCR

应用:实现双向呼吸灯

配置pwm参数

控制小灯快速亮灭,通过增大占空比,逐渐增加小灯点亮的时间,实现视觉上的小灯逐渐变亮。达到亮度峰值后,再逐渐减少占空比,制造出小灯逐渐变暗的效果。

1.定时器配置

内部时钟->选择一个通道设为PWM Generation CHx (由于通道四恰好对应开发板上的小灯,我选择了通道4)->配置PSC,ARR。

pulse/ ARR 即为占空比,此处可以不修改。

想要达到欺骗人眼的效果,小灯闪烁的频率必须足够高,我们设置pwm频率为2000hz。

此时计数时钟TIM_CLK为72Mhz.

当设置PSC 为(72-1) ARR为(500-1)时: f = 72000000 72 ∗ 500 = 2000 h z f = {72000000 over 72 ast 500 } = 2000hz f=72∗50072000000=2000hz 故取PSC=71, ARR = 499.

代码部分

/* USER CODE BEGIN 2 */
	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);  // 使能PWM输出
  /* USER CODE END 2 */

while循环中的部分:

for(uint16_t i=1;i<500;i++)    // 通过循环逐渐改变CCR,进而改变占空比。
 {
          
   
	htim3.Instance->CCR4 = i; 
	HAL_Delay(1);
 }
for(uint16_t i=499;i>=1;i--)
{
          
   
	htim3.Instance->CCR4 = i;   // 通过htim3.Instance->CCRx直接修改CCR的值  与cubemx中pulse指的相同。
	HAL_Delay(1);
}
HAL_Delay(10);

实际效果展示

工程压缩包链接:

经验分享 程序员 微信小程序 职场和发展