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

【STM32】定时器输出比较模式

STM32 定时器 - 输出比较模式(Output Compare)


🧭 输出比较模式概述

STM32 的定时器支持输出比较(Output Compare, OC)功能,用于在定时器计数达到指定值时触发某种动作(如设置电平、翻转电平、输出PWM等)。

输出比较模式的本质是:当 CNT(计数器)计数值与 CCRx(比较寄存器)相等时,输出控制器根据配置执行相应动作

常用的输出比较模式包括:

模式名称描述
冻结(Frozen)不做任何操作(默认)
主动电平设置设置输出为高电平
主动电平清除设置输出为低电平
电平翻转翻转输出引脚电平
强制高电平强制输出高电平
强制低电平强制输出低电平
PWM模式1CNT < CCRx时输出有效电平,反之无效电平
PWM模式2CNT < CCRx时输出无效电平,反之有效电平

⚠️ 注意:"有效/无效电平"取决于 CCxP(输出极性)设置。


🔧 PWM 模式详解(PWM Mode 1 / 2)

✅ 工作原理

以 PWM 模式 1 为例:

  • CNT 从 0 增加计数,当 CNT < CCRx 时输出有效电平;
  • CNT >= CCRx 时输出为无效电平;
  • 到达自动重装载值 ARR 后 CNT 重置为 0,重新开始周期。

📐 占空比计算

占空比(%) = CCRx / ARR × 100%

例如 ARR=999,CCRx=499,PWM频率=定时器更新频率,输出占空比为 50%。

📥 相关寄存器

寄存器说明
TIMx->ARR自动重装载寄存器,控制 PWM 周期
TIMx->CCR1~4比较寄存器,控制 PWM 占空比
TIMx->CCMRx设置输出比较模式(PWM模式等)
TIMx->CCER控制输出使能与极性
TIMx->CR1启动计数器(CEN位)

🧠 影子寄存器机制

  • ARR、CCR 寄存器都有影子寄存器;
  • 修改这些寄存器的值不会立即生效,只有在一次更新事件(UEV)之后才会从影子寄存器更新到真实寄存器
  • 这样可以防止在运行时突然改变输出;
  • 可以通过设置 ARPE(自动重载预装载使能)控制 ARR 是否使用影子寄存器。

可以通过软件触发一次更新事件使寄存器值立即生效:TIMx->EGR |= TIM_EGR_UG;

🧰 CUBEMX 配置方法

  1. 打开定时器,选择 PWM Generation CHx 模式;

  2. Configuration 中:

    • 设置 Prescaler(预分频器)和 Counter Period(ARR值)决定 PWM 频率;
    • 设置 Pulse 值(即 CCRx)决定占空比;
  3. 使能通道输出(TIMx->CCER 的 CCxE 位);

  4. 启用自动重载缓冲(ARPE);

  5. 生成代码后使用以下代码启用:

HAL_TIM_PWM_Start(&htimx, TIM_CHANNEL_x);
  1. 更改占空比:
__HAL_TIM_SET_COMPARE(&htimx, TIM_CHANNEL_x, new_ccr);

📝 简略介绍其他输出比较模式

模式名称使用场景 / 原理
Frozen默认无操作,用于禁用通道
ActiveCNT == CCRx 时输出引脚置为高电平
InactiveCNT == CCRx 时输出引脚置为低电平
ToggleCNT == CCRx 时翻转输出电平(适用于输出方波)
Force High不受 CNT 控制,直接将引脚设置为高电平
Force Low不受 CNT 控制,直接将引脚设置为低电平

可通过设置 TIMx->CCMRx 寄存器中的 OCxM 位字段选择这些模式。


📚 示例代码片段(PWM模式)

// 初始化 PWM 通道
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);// 修改占空比
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 750); // 设置占空比为 75%

✅ 总结

  • 输出比较模式用于定时器触发特定输出行为;
  • PWM 模式是输出比较中最常用的子模式;
  • PWM 波形的占空比和频率由 CCRx 和 ARR 控制;
  • 输出比较寄存器和自动重装载寄存器均有影子寄存器,提高了运行时稳定性;
  • 推荐使用 STM32CubeMX 配合 HAL 库快速实现 PWM。

相关文章:

  • 数字化转型进阶:26页华为数字化转型实践分享【附全文阅读】
  • 中国 AIGC 确权革命:“AI 创意・中国” 平台上线,存证成本降至 0.1 元 / 件
  • Git从入门到精通-第三章-获取Git仓库
  • GPU平台-优云智算
  • Elasticsearch:RAG 和 grounding 的价值
  • 2001-2021年各城市平均风速数据(可作工具变量)
  • 【AI论文】交互式生成视频综述
  • Python----卷积神经网络(LeNet-5的手写体识别)
  • 合成复用原则(CRP)
  • 洛谷 P1850 [NOIP 2016 提高组] 换教室
  • matlab学习之旅
  • HTTPcookie与session实现
  • QT6 源(70):阅读与注释按钮类 QPushButton,及各种属性验证,
  • 3D人物关系图开发实战:Three.js实现自动旋转可视化图谱(附完整代码)
  • C++ - 数据容器之 forward_list(创建与初始化、元素访问、容量判断、元素遍历、添加元素、删除元素)
  • 方案解读:华为-智慧园区数字平台技术方案【附全文阅读】
  • systemd-notify(linux服务状态通知消息)
  • 如何基于HAL库进行STM32开发
  • 模拟SIP终端向Freeswitch注册用户
  • 一键部署自己的私域直播
  • 旧宫新语|瑞琦:再探《古玩图》——清宫艺术品的前世与今生
  • “五一”假期客流增加,多地提升铁路运力并强化服务
  • 看着不爽就滚蛋!郑州大学第一附属医院一科室公众号被曝运营人员辱骂他人
  • 多地景区发公告称售票达接待峰值,有景区暂停网络和线下售票
  • 武汉大学新闻与传播学院已由“80后”副院长吴世文主持工作
  • 视频丨中国海警位中国黄岩岛领海及周边区域执法巡查