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);
实际效果展示
工程压缩包链接:
https://download.youkuaiyun.com/download/Nothing_To_Say_/80947402