PWM 原理:
脉冲宽度调制,通过调节占空比 (高电平时间 / 周期) 控制输出信号平均功率
频率:1/(ARR+1) × (PSC+1)/ 时钟频率
占空比:(CCR/ARR) × 100% (CCR 为比较值)
PWM 配置步骤:
配置 GPIO 为复用功能 (如 PA1 复用为 TIM2_CH2)
配置定时器时基 (PSC、ARR)
配置 PWM 模式 (向上计数 / 中央对齐)
配置输出比较参数 (CCR)
启动 PWM 输出
PWM 模式选择:
边沿对齐: 计数器向上 / 向下计数,适用于一般应用
中央对齐: 计数器先向上再向下,生成对称 PWM 波
LED 呼吸灯 (亮度渐变):
// 定时器初始化
TIM_HandleTypeDef htim2;
void TIM2_PWM_Init(void){
GPIO_InitTypeDef GPIO_InitStruct;
// 使能GPIOA和定时器2时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_TIM2_CLK_ENABLE();
// 配置PA1为复用功能
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; // 复用为TIM2
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置定时器参数(1KHz PWM)
htim2.Instance = TIM2;
htim2.Init.Prescaler = 71; // 72MHz/(71+1)=1MHz
htim2.Init.Period = 999; // 周期1ms
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_PWM_Init(&htim2);
// 配置PWM通道(CH2)
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1; // PWM模式1
sConfigOC.Pulse = 0; // 初始占空比0%
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 高电平有效
HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); // 启动PWM输出
}
// 主函数
int main(){
TIM2_PWM_Init();
int duty = 0;
int dir = 1;
while(1){
duty += dir;
if(duty >= 1000 || duty <= 0) dir *= -1; // 达到边界改变方向
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, duty); // 更新占空比
HAL_Delay(10); // 调整渐变速度
}
}








642

被折叠的 条评论
为什么被折叠?



