文章目录
前言
本文简单介绍了PWM定时器生成与通道输出的关系。
一、PWM通道与定时器的关系
1.简介
PWM(脉宽调制) 通过周期性的高低电平切换产生可变占空比的信号,广泛应用于电机控制、LED调光等领域。其核心依赖**定时器(Timer)**模块生成精确的时间基准,具体关系如下:
2.定时器作为PWM的时基发生器
定时器通过内部计数器周期性递增/递减 ,生成固定频率 的时钟信号。计数器的溢出频率决定了PWM信号的频率。
3.通道作为PWM的输出接口
每个定时器通常有多个通道 (如STM32的TIM1有4个通道),每个通道可独立输出PWM信号 。通过配置通道的比较寄存器(CCR),可调整占空比。
4.协同工作流程
- 定时器计数器(CNT)按配置的频率累加。
- 当CNT值小于通道的CCR值时,PWM输出高电平(或低电平,取决于极性配置)。
- 当CNT超过CCR但**未达到自动重装载值(ARR)**时,电平翻转。
- CNT达到ARR时,复位并触发更新事件,开始新周期。
5.关键公式
- PWM频率 = 定时器时钟源频率 / [(PSC + 1) * (ARR + 1)]
- 占空比 = CCR / (ARR + 1) * 100%
二、输出PWM的设置步骤(通用流程)
以下步骤以STM32为例,但原理适用于多数微控制器:
1. 选择定时器与通道
根据硬件设计,选择支持PWM输出的定时器 及对应通道(如TIM3_CH1对应PB4引脚)。
2. 配置时钟源
c
// 使能定时器时钟(以STM32为例)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
3. 初始化定时器参数
预分频器
预分频器(PSC):降低定时器时钟频率。
自动重装载
自动重装载值(ARR):设定计数周期,与PSC共同决定PWM频率。
c
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_TimeBaseStruct.TIM_Prescaler = 71; // 72MHz/(71+1)=1MHz
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStruct.TIM_Period = 999; // PWM频率=1MHz/(999+1)=1kHz
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStruct);
4. 配置PWM模式
c
TIM_OCInitTypeDef TIM_OCStruct;
TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1(CNT < CCR时输出有效电平)
TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCStruct.TIM_Pulse = 500; // 初始占空比50%(CCR=500)
TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_High; // 高电平有效
TIM_OC1Init(TIM3, &TIM_OCStruct); // 初始化通道1
5. 配置GPIO为复用功能
c
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
6. 启动定时器与通道
c
TIM_Cmd(TIM3, ENABLE); // 启动定时器
TIM_CtrlPWMOutputs(TIM3, ENABLE); // 若为高级定时器(如TIM1),需额外使能主输出
7. 动态调整占空比
c
TIM_SetCompare1(TIM3, new_CCR); // 修改通道1的CCR值以改变占空比
8.关键注意事项
频率与分辨率的权衡
频率与分辨率权衡:ARR值越大,PWM分辨率越高,但最大频率降低。
中央对齐模式
中央对齐模式:计数器先递增后递减 ,PWM频率减半,适合某些电机控制场景。
死区电压
死区时间:H桥驱动中**,高级定时器可插入死区**,防止上下管直通。
9.示例应用:呼吸灯
c
// 在循环中逐渐改变CCR值
for(uint16_t i=0; i<=1000; i+=10) {
TIM_SetCompare1(TIM3, i);
Delay_ms(10);
}
通过以上步骤,定时器与PWM通道 协同工作,实现了灵活的信号输出控制。实际开发中需参考具体芯片的数据手册,确保寄存器和库函数正确配置。