当前位置: 首页 > news >正文

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


文章目录

  • 前言
  • 一、PWM通道与定时器的关系
    • 1.简介
    • 2.定时器作为PWM的时基发生器
    • 3.通道作为PWM的输出接口
    • 4.协同工作流程
    • 5.关键公式
  • 二、输出PWM的设置步骤(通用流程)
    • 1. 选择定时器与通道
    • 2. 配置时钟源
    • 3. 初始化定时器参数
      • 预分频器
      • 自动重装载
    • 4. 配置PWM模式
    • 5. 配置GPIO为复用功能
    • 6. 启动定时器与通道
    • 7. 动态调整占空比
    • 8.关键注意事项
      • 频率与分辨率的权衡
      • 中央对齐模式
      • 死区电压
    • 9.示例应用:呼吸灯


前言

本文简单介绍了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. 配置时钟源

// 使能定时器时钟(以STM32为例)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

3. 初始化定时器参数

预分频器

预分频器(PSC):降低定时器时钟频率。

自动重装载

自动重装载值(ARR):设定计数周期,与PSC共同决定PWM频率。

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模式

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为复用功能

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. 启动定时器与通道

TIM_Cmd(TIM3, ENABLE);          // 启动定时器
TIM_CtrlPWMOutputs(TIM3, ENABLE); // 若为高级定时器(如TIM1),需额外使能主输出

7. 动态调整占空比

TIM_SetCompare1(TIM3, new_CCR);  // 修改通道1的CCR值以改变占空比

8.关键注意事项

频率与分辨率的权衡

频率与分辨率权衡:ARR值越大,PWM分辨率越高,但最大频率降低。

中央对齐模式

中央对齐模式:计数器先递增后递减PWM频率减半,适合某些电机控制场景。

死区电压

死区时间:H桥驱动中**,高级定时器可插入死区**,防止上下管直通。

9.示例应用:呼吸灯

// 在循环中逐渐改变CCR值
for(uint16_t i=0; i<=1000; i+=10) {
    TIM_SetCompare1(TIM3, i);
    Delay_ms(10);
}

通过以上步骤,定时器与PWM通道协同工作,实现了灵活的信号输出控制。实际开发中需参考具体芯片的数据手册,确保寄存器和库函数正确配置。


相关文章:

  • JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
  • FreeRTOS移植并实现一个多任务程序
  • mysql中查询没有主键的表
  • 《Python深度学习》第五讲:文本处理中的深度学习
  • 一学就会:A*算法详细介绍(Python)
  • springcloud, nacos使用rabbitMq
  • 前端面试项目拷打
  • Django:内置和自定义中间件
  • Java集合的底层原理
  • 深入解析ES6+新语法:复杂的迭代器与生成器
  • 【css酷炫效果】纯CSS实现手风琴折叠效果
  • navicat导出文件密码解密
  • vue3二次封装tooltip实现el-table中的show-overflow-tooltip效果
  • 003 SpringCloud整合-LogStash安装及ELK日志收集
  • Spring Boot集成JWT:打造安全的RESTful API
  • Linux上离线安装PyTorch教程:No module named ‘_bz2:No module named ‘_lzma‘
  • 单元测试mock
  • 蓝桥杯备考:特殊01背包问题——》集合subset
  • 两款软件助力图片视频去水印及图像编辑
  • PHP转GO Go语言环境搭建(Day1) 常见问题及解决方案指南
  • 外交部回应中美经贸高层会谈:这次会谈是应美方请求举行的
  • 刘诚宇、杨皓宇进球背后,是申花本土球员带着外援踢的无奈
  • 人民日报评论:莫让“胖东来们”陷入“棒杀”“捧杀”泥潭
  • 山东滕州一车辆撞向公交站台撞倒多人,肇事者被控制,案件已移交刑警
  • “穿越看洪武”,明太祖及其皇后像台北故宫博物院南院展出
  • “穿越看洪武”,明太祖及其皇后像台北故宫博物院南园展出