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


相关推荐
智商偏低5 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen6 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
森焱森8 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白8 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D8 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术11 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt12 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘12 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang12 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c
几个几个n15 小时前
STM32-第二节-GPIO输入(按键,传感器)
单片机·嵌入式硬件