1. PWM波形介绍
PWM(Pulse Width Modulation,脉冲宽度调制)是一种通过调节方波信号的 占空比(Duty Cycle) 来控制能量输出的技术。它的基本特性包括:
- 占空比(Duty Cycle):高电平时间占整个周期的比例,决定了平均输出功率,计算公式: $D=\frac{T_{\text{high}}}{T_{\text{total}}} \times 100%$
- 其中 $T_{\text{high}}$是高电平持续时间,$T_{\text{total}}$ 是PWM周期。
- 频率(Frequency):PWM波形的周期倒数,决定了PWM的切换速度。
PWM广泛用于:
- 模拟信号模拟(例如调光、调速)
- 数字信号传输(例如红外遥控)
- 功率控制(例如电机调速、LED亮度调节)
2. PWM是否是数字信号模拟模拟信号?
PWM 是 数字信号的模拟输出,但它本身仍是 数字信号,因为它只有高低两个电平(0和1)。当PWM波形作用在负载(如LED或电机)上,负载的 响应(如电机的转速、LED的亮度)会与占空比成正比,表现出类似于模拟信号的效果。例如:
- LED调光:人眼对光的响应是滞后的,高速PWM(>1kHz)调节LED亮度时,人眼感受到的是平滑的亮度变化。
- 电机调速:PWM控制电机时,电机由于惯性无法瞬时响应脉冲变化,而是根据占空比调整平均电压,从而改变转速。
因此,PWM本质上是数字信号,但可以用于模拟信号的控制和仿真。
3. STM32使用定时器生成PWM
STM32的PWM通常由通用定时器(TIMx) 或 高级定时器(TIM1/TIM8) 生成,基本步骤如下:
3.1. 选择一个定时器(如TIM2)
不同的STM32型号有不同的定时器,可以查看数据手册选择合适的定时器和通道。
3.2. 计算PWM参数
设定:
- PWM频率: $f_{\text{PWM}} = \frac{f_{\text{timer\_clock}}}{(PSC+1) \times (ARR+1)}$ 其中:
- $f_{\text{timer\_clock}}$ 是定时器时钟频率(通常是 APB1/APB2 时钟)
- PSC(预分频器)降低定时器计数频率
- ARR(自动重装值)决定PWM周期
- 占空比: $CCR=D×ARR$ 其中 CCR(比较值)决定高电平持续时间。
3.3. 配置STM32定时器
使用STM32 HAL库或寄存器编程:
- 初始化定时器
- 配置PWM模式
- 设置占空比
- 启动PWM输出
示例代码(基于 STM32 HAL库)
假设我们使用 TIM2 通道1(PA0引脚) 生成 1kHz 的 PWM,50
TIM_HandleTypeDef htim2;
void PWM_Init(void) {
__HAL_RCC_TIM2_CLK_ENABLE(); // 使能TIM2时钟
htim2.Instance = TIM2;
htim2.Init.Prescaler = 71; // 预分频,假设时钟 72MHz,分频后 1MHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 999; // ARR = 999,对应 1kHz PWM
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&htim2);
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500; // CCR = 500,占空比 50
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); // 启动PWM
}
4. 使用CubeMX配置PWM
4.1. 使能 TIMx 定时器
- 在 “Pinout & Configuration” 选项卡中:
- 找到 TIM2(或其他可用的定时器)。
- 展开 TIM2,勾选 PWM Generation CH1(或其他通道)。
- STM32CubeMX 会自动将对应的 GPIO(如 PA0)设置为 Alternate Function 模式。
4.2. 配置 PWM 参数
- 进入 “Configuration” 选项卡,找到 TIM2:
- 在 “Parameter Settings” 里设置:
- Prescaler(预分频器):计算方法:$\text{PSC} = \frac{f_{\text{APB1}}}{\text{计数时钟}} – 1$如果 APB1 时钟是 72MHz,想让计数时钟为 1MHz,则 PSC = 71。
- Counter Mode 设为 Up(向上计数)。
- Auto-Reload Register (ARR):
- 计算 PWM 频率$f_{\text{PWM}} = \frac{f_{\text{计数时钟}}}{\text{ARR} + 1}$例如设定 ARR = 999,则 PWM 频率:$f_{\text{PWM}} = \frac{1\,000\,000}{1000} = 1kHz$
- 选择 Channel1,设置:
- Pulse(CCR值) 设为
500
(占空比 50 - Mode 选择 PWM Mode 1。
- Polarity 选择 High(高电平有效)。
- Pulse(CCR值) 设为
- 点击 OK 退出配置。
- 在 “Parameter Settings” 里设置:
总结
- PWM是一种用数字信号模拟模拟信号的方法,但它本质上仍是数字信号。
- PWM的核心参数是频率和占空比,它们决定了输出信号的特性。
- STM32使用定时器(TIMx)生成PWM,可用于LED调光、电机控制、信号输出等应用。
如果想更深入地研究STM32的PWM控制,比如高级定时器、死区控制、相位同步等,可以参考STM32官方参考手册。