PWM(脉冲宽度调制),利用数字信号的输出来实现模拟模拟信号的技术。通过调节脉冲信号的占空比实现模拟量的控制。占空比就是在一个固定周期内改变高电平所占时间的比例。
PWM模式(模式1和模式2):
PWM模式1和模式2是STM32定时器在输出比较通道中的两种工作行为的约定,它们决定了计数器CNT与比较寄存器CCR之间的关系,也就是当CNT < CCR时,输出有效电平还是无效电平。模式1:CNT < CCR,输出有效电平;CNT≥CCR,输出无效电平。模式2:CNT < CCR,输出无效电平;CNT≥CCR,输出有效电平。
占空比计算公式:

占空比配置:示例选择通用定时器TIM3通道1,对应I/O资源GPIOA6。
cpp
void PWM_Init(void)
{
//使能时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//配置GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//配置时基(ARR, PSC)
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_Period = 1000 - 1; //ARR: 0~999 → 1000步
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; //PSC: 72MHz / 72 = 1MHz
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //重复计数器
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
//配置 PWM 通道 (CCR,模式,极性)
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM 模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; // 初始 CCR = 0
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
//使能预装载(ARR/CCR影子)
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM3, ENABLE);
//启动定时器
TIM_Cmd(TIM3, ENABLE);
}
/*
主函数调用"TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)"可改变占空比
例:设置占空比为50%,那么根据公式反推当CCR=500时占空比为50%
调用"TIM_SetCompare1(TIM3, 500)"即可
*/
注:以上内容仅个人理解,不具备唯一性和绝对正确性,仅供参考。