嵌入式硬件篇---PWM输出通道&定时器


文章目录


前言

本文简单介绍了PWM定时器生成与通道输出的关系。


一、PWM通道与定时器的关系

1.简介

PWM(脉宽调制) 通过周期性的高低电平切换产生可变占空比的信号,广泛应用于电机控制、LED调光等领域。其核心依赖**定时器(Timer)**模块生成精确的时间基准,具体关系如下:

2.定时器作为PWM的时基发生器

定时器通过内部计数器周期性递增/递减 ,生成固定频率 的时钟信号。计数器的溢出频率决定了PWM信号的频率

3.通道作为PWM的输出接口

每个定时器通常有多个通道 (如STM32的TIM1有4个通道),每个通道可独立输出PWM信号 。通过配置通道的比较寄存器(CCR),可调整占空比。

4.协同工作流程

  1. 定时器计数器(CNT)按配置的频率累加。
  2. 当CNT值小于通道的CCR值时,PWM输出高电平(或低电平,取决于极性配置)。
  3. 当CNT超过CCR但**未达到自动重装载值(ARR)**时,电平翻转。
  4. CNT达到ARR时,复位并触发更新事件,开始新周期。

5.关键公式

  1. PWM频率 = 定时器时钟源频率 / [(PSC + 1) * (ARR + 1)]
  2. 占空比 = 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通道 协同工作,实现了灵活的信号输出控制。实际开发中需参考具体芯片的数据手册,确保寄存器和库函数正确配置。


相关推荐
Ronin-Lotus1 小时前
嵌入式硬件篇---加法&减法&积分&微分器
嵌入式硬件·模拟电子技术·加法器·减法器·积分器·微分器
田甲2 小时前
【STM32】ST7789屏幕驱动
stm32·单片机·嵌入式硬件
六六六六六66662 小时前
TIM 编码接口
stm32·编码器
南泽兆9 小时前
MCU选型的五大维度--助力嵌入式产品设计
单片机·嵌入式硬件
SuperW11 小时前
蓝桥杯嵌入式十五届模拟二(串口DMA,占空比的另一种测量方式)
单片机·职场和发展·蓝桥杯
LS_learner12 小时前
ESP32S3 链接到 WiFi
嵌入式硬件
kyle~13 小时前
嵌入式---电机分类
嵌入式硬件
cccc卌14 小时前
MCU如何查看系统有没有卡死
单片机·嵌入式硬件
xMathematics15 小时前
STM32嵌入式开发从入门到实战:全面指南与项目实践
stm32·单片机·嵌入式硬件
SundayBear15 小时前
嵌入式MCU常用模块
单片机·嵌入式硬件·常用模块