理论知识
脉宽调制(Pulse Width Modulation,PWM)
- 对脉冲信号的宽度改变并输出出来
- 高频的PWM波可以让设备进行频繁开关、通断
PWM波形的参数
- 周期(T):完整脉冲循环时间(单位:秒)
- 频率(f):f = 1/T(常见范围:100Hz-1MHz)
- 占空比(Duty Cycle):高电平时间/周期 × 100%
- 振幅:高电平与低电平之间的电压差
PWM波形在TIM定时器中的形成方式
- 现将输入频率根据PSC进行分频为定时器主频
- 以向上计数为例,CNT从0增加到ARR
- 引入比较值(Capture Compare Register,CCR),需要再代码中设定
- CNT<CCR,输出一种电平
- CNT>=CCR,输出另一种电平
定时器形成PWM波的模块
- 预分频器(PSC):对输入时钟进行分频
- 分频系数 = PSC + 1
- 例:72MHz时钟,PSC=71 → 输出频率1MHz
- 计数器(CNT):核心计时单元
- 工作模式:向上计数/向下计数/中央对齐
- 计数范围:0 ~ ARR值
- 自动重装载寄存器(ARR):决定PWM周期
- 周期 = (ARR + 1) * 时钟周期
- 捕获比较寄存器(CCR):决定PWM占空比
- 有效电平时间 = (CCR + 1) * 时钟周期
呼吸灯
- 一般人的眼睛对观测物体的刷新频率是60Hz(16.67ms)左右
- 低于这个频率的灯光会观察到闪烁或产生晕眩感。
- 高于这个频率的灯光不会观察到闪烁,而产生视觉暂留效应
- 如果用高频的PWM波(几us)输出到LED灯,占空比则直接作用于灯的亮度。 eg:0%占空比灯灭、50%占空比比灯亮一点、100%占空比灯完全亮
- 如果PWM波占空比也在变化,即CRR值变化,则占空比也会跟着变化,当变化的时间间隔足够小(几ms到几十ms),便产生了视觉暂留效应,我们看到的灯就是连续亮暗变化的
硬件电路连接
- 如果单片机上自带连接LED灯且可输出PWM波形通道的引脚,直接用该LED灯对应的TIM定时器Channel通道即可
- 没有自带的需要外部连接。f103c8t6的TIM3对应的Channel1对应引脚为PA6
- 一般情况下单片机输出最高电压是3.3V,LED正常发光压降1.5V以上,电流约为5mA,与具体型号有关
- 二极管若正常发光,电阻两端电压约为1.8V
- 电阻在360Ω左右,一般情况下在180~1800都可行
工程配置
CubeMX中
- 选择MCU
- 配置RCC的HSE为外部晶振
- 配置时钟树HSE输出主频
- Debug选项选择serial wire
- 工程管理中修改工程与路径,注意不要有中文等字符
- 代码生成到单独头文件
TIM的PWM配置
- 根据硬件电路连接,找到PA6引脚,使能TIM3-CH1功能
- 配置定时器TIM3
- 将TIM3设置为内部时钟模式,配置Channel1
Counter Settings:
- Prescaler(PSC -16 bits value):0
- Counter Period(ARR):499
- Counter Mode:向上计数0到499
- Internal Clock Division(CKD,内部时钟分频):No Division
- auto-reload preload(自动装载刷新):随意,如果使能 则新的ARR配置后会延迟到当次溢出中断发生后再改为新值
- PWM Generation Channel 1
- Mode:PWM模式mode1表示CNT小于CCR输出有效电平。mode2表示CNT小于CCR输出无效电平
- Pulse(16 bits value):脉冲数为0表示一直输出脉冲;如果脉冲数非0,则输出指定数量脉冲
- Output compare preload: 自动比较刷新随意,如果使能 则新的CRR配置后会延迟到当次溢出中断发生后再改为新值
- Fast Mode:快速模式无需使能,使能会让波形驱动能力强,相应快速,但耗电高
- CH Polarity: 通道极性高电平表示高电平为输出有效电平,低电平为无效电平
#代码
uint16_t pwmVal=0; //声明比较寄存器变量CRR
HAL_TIM_PWMS_Start(&htim3,TIM_CHANNEL_1); //使能定时器PWM输出通道
//主程序函数
while (1)
{
while(pwmVal<500)
{
pwmVal++;
__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,pwmVal);
HAL_Delay(1);
}
while(pwmVal>0)
{
pwmVal--;
__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,pwmVal);
HAL_Delay(1);
}
HAL_Delay(200);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
做选择是需要练习的,选择是一种培养出来的能力。做选择的次数越多,你就越会选择。 —罗伯特·弗里茨