2.6 PWM 呼吸灯
理论知识
何为 PWM
PWM (Pulse Width Modulation) 即 脉宽调制,改变脉冲信号的宽度并输出。
高频 PWM 波可以让设备进行频繁开关通断。
PWM 波的参数
- 周期:PWM 波形中相邻的高低电平持续时间总和
- 频率:略
- 占空比:高电平持续时间占总时间的比值
- 电平:高低电平之间电压差
PWM 波在 TIM 定时器中的形成方式
- 先将输入频率依据 PSC 进行分频得定时器主频
- 以向上计数为例,即 CNT:0->ARR
- 引入新比较值 CCR (Capture Compare Register),需在代码中设定
- CNT<CCR 输出一种电平
- CNT>=CRR 输出另外一种电平
工程配置
MCU HSE 等配置过程略去。
下面以正点原子 F103ZET6 精英板为例。
该开发板使用通用定时器 TIM3 产生 PWM 控制 DS0 的亮度。
- 按照原理图,找到 DS0 对应的引脚,使能 TIM3_CH2 功能
- 配置 TIM3 并将其设置为内部时钟模式
- Clock Sourse: Internal Clock
- PSC=0
- ARR=499
- Counter Mode: Up
- 内部时钟不分频
- auto-reload preload: Disable(此项是否使能无影响,如使能则新的 ARR 配置后会延迟到当次溢出中断发生后再改为新值
- 通道极性 (CH Polarity) 设置成有效电平(一般高电平为有效电平)
- PWM mode, mode 1 表示 CNT 小于 CCR 则输出有效电平,即 CCR 为多少则有多少个计数器时间为有效电平。mode2 反之
- Pulse(脉冲
为 0 表示一直输出脉冲,若非 0,则输出指定数量脉冲) , - Fast Mode: Disable, 若使能会让波形驱动能力强、响应快速,但耗电高
具体实现
声明比较寄存器变量
uint16_t pwmVal=0;
(在此实验中可设为全局变量)使能 PWM 输出通道
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
(配置为 TIM3 的 CH2 通道)呼吸灯具体实现
Cwhile (pwmVal < 500) { pwmVal++; __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, pwmVal); HAL_Delay(1); } while (pwmVal > 0) { pwmVal--; __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, pwmVal); HAL_Delay(1); }