嵌入式硬件篇---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通道 协同工作,实现了灵活的信号输出控制。实际开发中需参考具体芯片的数据手册,确保寄存器和库函数正确配置。


相关推荐
szxinmai主板定制专家5 分钟前
基于FPGA的3U机箱轨道交通网络通讯板,对内和主控板、各类IO板通信,对外可进行RS485、CAN或MVB组网通信
大数据·人工智能·嵌入式硬件·fpga开发·边缘计算
Do vis8241 小时前
stm32第六天继电器
单片机·嵌入式硬件
charlie1145141911 小时前
单片机开发资源分析的实战——以STM32F103C8T6为例子的单片机资源分析
stm32·单片机·嵌入式硬件·学习·教程
不不不丶1 小时前
STM32——WWDG(窗口看门狗)
笔记·stm32·单片机·嵌入式硬件
Electron-er3 小时前
STM32 DAC详解:从原理到实战输出正弦波
stm32·单片机·嵌入式硬件
Ronin-Lotus3 小时前
嵌入式硬件篇---龙芯UART通信
嵌入式硬件·c·uart·pwm·龙芯·2k1000
阿巴~阿巴~4 小时前
STM32 —— 嵌入式系统、通用计算机系统、物联网三层架构
stm32·单片机·嵌入式硬件·物联网·架构
不知真不只4 小时前
单片机之STC8951学习
单片机·嵌入式硬件
霖005 小时前
FPGA中级项目4——DDS实现
大数据·经验分享·嵌入式硬件·学习·fpga开发·fpga