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

news/2025/3/19 8:44:52/
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="markdown_views prism-atom-one-dark">cap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

class="toc">

文章目录

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


前言

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


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

1.简介

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

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

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

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

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

4.协同工作流程

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

5.关键公式

ckquote>
  1. PWM频率 = 定时器时钟源频率 / [(PSC + 1) * (ARR + 1)]
  2. 占空比 = CCR / (ARR + 1) * 100%
ckquote>

PWM_37">二、输出PWM的设置步骤(通用流程)

以下步骤以STM32为例࿰c;但原理适用于多数微控制器:

1. 选择定时器与通道

根据硬件设计࿰c;选择支持PWM输出的定时器对应通道(如TIM3_CH1对应PB4引脚)。

2. 配置时钟源

<code class="prism language-c">class="token comment">// 使能定时器时钟(以STM32为例)
class="token function">RCC_APB1PeriphClockCmdclass="token punctuation">(RCC_APB1Periph_TIM3class="token punctuation">, ENABLEclass="token punctuation">)class="token punctuation">;
code>

3. 初始化定时器参数

预分频器

ckquote>

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

ckquote>

自动重装载

ckquote>

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

ckquote>
<code class="prism language-c">TIM_TimeBaseInitTypeDef TIM_TimeBaseStructclass="token punctuation">;
TIM_TimeBaseStructclass="token punctuation">.TIM_Prescaler class="token operator">= class="token number">71class="token punctuation">;          class="token comment">// 72MHz/(71+1)=1MHz
TIM_TimeBaseStructclass="token punctuation">.TIM_CounterMode class="token operator">= TIM_CounterMode_Upclass="token punctuation">;
TIM_TimeBaseStructclass="token punctuation">.TIM_Period class="token operator">= class="token number">999class="token punctuation">;            class="token comment">// PWM频率=1MHz/(999+1)=1kHz
class="token function">TIM_TimeBaseInitclass="token punctuation">(TIM3class="token punctuation">, class="token operator">&TIM_TimeBaseStructclass="token punctuation">)class="token punctuation">;
code>

PWM_64">4. 配置PWM模式

<code class="prism language-c">TIM_OCInitTypeDef TIM_OCStructclass="token punctuation">;
TIM_OCStructclass="token punctuation">.TIM_OCMode class="token operator">= TIM_OCMode_PWM1class="token punctuation">;      class="token comment">// PWM模式1(CNT < CCR时输出有效电平)
TIM_OCStructclass="token punctuation">.TIM_OutputState class="token operator">= TIM_OutputState_Enableclass="token punctuation">;
TIM_OCStructclass="token punctuation">.TIM_Pulse class="token operator">= class="token number">500class="token punctuation">;                   class="token comment">// 初始占空比50%(CCR=500)
TIM_OCStructclass="token punctuation">.TIM_OCPolarity class="token operator">= TIM_OCPolarity_Highclass="token punctuation">; class="token comment">// 高电平有效
class="token function">TIM_OC1Initclass="token punctuation">(TIM3class="token punctuation">, class="token operator">&TIM_OCStructclass="token punctuation">)class="token punctuation">;               class="token comment">// 初始化通道1
code>

5. 配置GPIO为复用功能

<code class="prism language-c">GPIO_InitTypeDef GPIO_InitStructclass="token punctuation">;
GPIO_InitStructclass="token punctuation">.GPIO_Pin class="token operator">= GPIO_Pin_4class="token punctuation">;
GPIO_InitStructclass="token punctuation">.GPIO_Mode class="token operator">= GPIO_Mode_AF_PPclass="token punctuation">;    class="token comment">// 复用推挽输出
GPIO_InitStructclass="token punctuation">.GPIO_Speed class="token operator">= GPIO_Speed_50MHzclass="token punctuation">;
class="token function">GPIO_Initclass="token punctuation">(GPIOBclass="token punctuation">, class="token operator">&GPIO_InitStructclass="token punctuation">)class="token punctuation">;
code>

6. 启动定时器与通道

<code class="prism language-c">class="token function">TIM_Cmdclass="token punctuation">(TIM3class="token punctuation">, ENABLEclass="token punctuation">)class="token punctuation">;          class="token comment">// 启动定时器
class="token function">TIM_CtrlPWMOutputsclass="token punctuation">(TIM3class="token punctuation">, ENABLEclass="token punctuation">)class="token punctuation">; class="token comment">// 若为高级定时器(如TIM1)࿰c;需额外使能主输出
code>

7. 动态调整占空比

<code class="prism language-c">class="token function">TIM_SetCompare1class="token punctuation">(TIM3class="token punctuation">, new_CCRclass="token punctuation">)class="token punctuation">;  class="token comment">// 修改通道1的CCR值以改变占空比
code>

8.关键注意事项

频率与分辨率的权衡

ckquote>

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

ckquote>

中央对齐模式

ckquote>

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

ckquote>

死区电压

ckquote>

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

ckquote>

9.示例应用:呼吸灯

<code class="prism language-c">class="token comment">// 在循环中逐渐改变CCR值
class="token keyword">forclass="token punctuation">(class="token class-name">uint16_t iclass="token operator">=class="token number">0class="token punctuation">; iclass="token operator"><=class="token number">1000class="token punctuation">; iclass="token operator">+=class="token number">10class="token punctuation">) class="token punctuation">{class="token function">TIM_SetCompare1class="token punctuation">(TIM3class="token punctuation">, iclass="token punctuation">)class="token punctuation">;class="token function">Delay_msclass="token punctuation">(class="token number">10class="token punctuation">)class="token punctuation">;
class="token punctuation">}
code>

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



http://www.ppmy.cn/news/1580272.html

相关文章

使用OBS进行webRTC推流参考

参考腾讯云官方文档&#xff1a; 云直播 OBS WebRTC 推流_腾讯云 说明非常详细&#xff0c;分为通过WHIP和OBS插件的形式进行推流。 注意&#xff1a;通过OBS插件的形式进行推流需要使用较低的版本&#xff0c;文档里有说明&#xff0c;需要仔细阅读。

centos 7误删/bash 拯救方法

进入救援模式 1. 插入CentOS 7安装光盘&#xff0c;重启系统。在开机时按BIOS设置对应的按键&#xff08;通常是F2等&#xff09;&#xff0c;将启动顺序调整为CD - ROM优先。 2. 系统从光盘启动后&#xff0c;选择“Troubleshooting”&#xff0c;然后选择“Rescue a Cent…

蓝桥杯 修剪灌木

问题描述 爱丽丝要完成一项修剪灌木的工作。 有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌 木, 让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始, 每天向右修剪一棵灌木。当修剪了最右侧的灌木后, 她会调转方向, 下一天开 始向左修…

leecode1254.统计封闭岛屿的数目

这道题咋一看很难&#xff0c;但是可以转换&#xff0c;将所有靠近边界的非封闭岛屿都变成海洋后&#xff0c;那么剩下的岛屿就是封闭岛屿&#xff0c;最后的问题其实就是求解连通分量个数 class Solution { private:void closedIsland(vector<vector<int>>&…

leetcode每日一题:对角线上的质数

题目 给你一个下标从 0 开始的二维整数数组 nums 。 返回位于 nums 至少一条 对角线 上的最大 质数 。如果任一对角线上均不存在质数&#xff0c;返回 0 。 注意&#xff1a; 如果某个整数大于 1 &#xff0c;且不存在除 1 和自身之外的正整数因子&#xff0c;则认为该整数是…

UNI-APP uts插件 支持ANDROID 监听手机状态

插件地址 https://ext.dcloud.net.cn/plugin?id22646 模块 import {startPhoneListener,stopPhoneListener,checkIsAutoRecord,toCallAutoRecorderPage,navigateToCallRecordingSettings,jumpToPermissionPage,makePhoneCall,allRecorderFilesAction,registerSmsReceiver,} f…

【实战ES】实战 Elasticsearch:快速上手与深度实践-附录-3-从ES 7.x到8.x的平滑迁移策略

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 附录-版本升级指南 3-Elasticsearch 7.x 到 8.x 平滑迁移策略指南1. 升级必要性分析1.1 版本特性对比1.2 兼容性评估矩阵 2. 预升级准备清单2.1 环境检查表2.2 数据备份策略 3. 分阶段…

3.18学习总结 JAVA方法

流程跳转语句&#xff1a;break,continue break&#xff1a;在switch中结束case条件判断&#xff0c;在循环体中结束循环continue&#xff1a;作用在循环体中&#xff0c;结束循环体的本次循环&#xff0c;而进入下次循环 方法&#xff1a; 类似于c语言的函数 注意&#xff…