尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
STM32输出比较与输入捕获配置详解
一、问题解构与概念辨析STM32 定时器中最重要的一对功能便是输出比较和输入捕获。二者共用一套硬件通道捕获/比较通道但作用互为反向输出比较是定时器主动向外输出特定波形最常见是 PWM输入捕获是定时器被动测量外部输入的信号波形测频率、脉宽、占空比。功能方向核心目的典型应用输出比较定时器 → 外部引脚产生精确时序波形、PWM电机调速、舵机控制、LED 调光输入捕获外部信号 → 定时器测量信号频率、脉宽、周期红外遥控解码、PWM 输入测量、超声波测距回波测量两者在硬件上共用TIMx_CCRx捕获/比较寄存器由TIMx_CCMRx寄存器的模式位决定该通道工作在捕获模式还是输出比较模式 。二、输出比较配置详解1. 工作原理输出比较模式下定时器将计数器CNT与预设的CCR值进行比较。当两者相等时根据配置的输出模式PWM1、PWM2、强制输出、翻转等改变输出引脚的电平状态 。产生 PWM 最常用的是PWM 模式 1CNT CCR 时输出有效电平CNT ≥ CCR 时输出无效电平由此形成占空比可调的方波 。PWM 的频率由预分频器 PSC 和自动重装载值 ARR 共同决定占空比则由 CCR 与 ARR 的比值决定 。以 STM32F103 为例时基时钟为 72MHz配置公式如下PWM频率 72MHz / ((PSC1) * (ARR1)) PWM占空比 CCR / (ARR1) × 100%2. 配置步骤标准外设库以使用 TIM3 的 CH2PA1输出 20kHz、50% 占空比 PWM 为例使能 TIM3 和 GPIOA 时钟配置 PA1 为复用推挽输出配置 TIM3 时基PSC、ARR配置 TIM3 的 CH2 为 PWM1 模式设置 CCR2使能 TIM3 的 CH2 输出启动 TIM3。3. 代码示例// TIM3_CH2 (PA1) 输出 PWM20kHz50% 占空比 void TIM3_PWM_Init(uint16_t arr, uint16_t psc, uint16_t ccr) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 1. 使能时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 2. 配置 PA1 为复用推挽输出TIM3_CH2 GPIO_InitStructure.GPIO_Pin GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); // 3. 时基配置PSC3ARR899 → 72MHz/(4*900)20kHz TIM_TimeBaseStructure.TIM_Prescaler psc; // 预分频例如 4-13 TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period arr; // 自动重装载值例如 900-1899 TIM_TimeBaseStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure); // 4. 配置 CH2 为 PWM1 模式 TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; // PWM 模式1 TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse ccr; // CCR 值例如 450 TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; // 有效电平为高 TIM_OC2Init(TIM3, TIM_OCInitStructure); // 生效 CCR2 预装载值防止更新瞬间跳变 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); // 5. 启动定时器 TIM_Cmd(TIM3, ENABLE); } // 调用示例输出 20kHz占空比 50% 的 PWM // TIM3_PWM_Init(900-1, 4-1, 450);要点说明预装载保护默认情况下修改 CCR 会立即生效可能导致输出波形在运行中产生瞬间跳变。开启预装载后CCR 的新值会在下一次计数周期更新时生效确保波形平滑 。高级定时器TIM1、TIM8还需要调用TIM_CtrlPWMOutputs()使能 MOE 主输出否则 PWM 引脚无输出 。三、输入捕获配置详解1. 工作原理输入捕获模式下定时器监测指定通道的输入引脚当检测到设定的边沿上升沿/下降沿时将当前计数器的值锁存到 CCRx 寄存器并触发捕获中断 。通过连续两次捕获的计数器差值结合定时器计数频率即可计算信号的周期和脉宽 。频率测量有两种常用方法 测频法在固定时间内统计信号上升沿个数适合高频信号测周法测量一个周期的时长适合低频信号。输入捕获天然适合测周法。若使用 PWM 输入模式从模式选择复位还可以自动测量频率和占空比而无需中断频繁干预 。2. 配置步骤以使用 TIM4_CH1PB6输入捕获测量信号频率为例采用上升沿捕获并且利用定时器更新中断配合溢出计数来测量长周期信号使能 TIM4 与 GPIOB 时钟配置 PB6 为浮空输入若有外部上拉/下拉可配置上拉/下拉输入配置 TIM4 时基设置合适的 PSC 以获得所需分辨率配置 TIM4_CH1 为上升沿捕获使能捕获中断和更新中断配置 NVIC编写中断服务函数在捕获中断中读取 CCR 值在更新中断中统计溢出次数。3. 代码示例volatile uint16_t captured_value 0; // 当前捕获值 volatile uint16_t capture_count 0; // 捕获次数 volatile uint32_t overflow_count 0; // 溢出次数 // TIM4_CH1 (PB6) 输入捕获初始化测量信号周期单位时钟计数 void TIM4_Capture_Init(uint16_t psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 1. 时钟使能 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 2. GPIO 配置为浮空输入输入捕获引脚必须是输入模式 GPIO_InitStructure.GPIO_Pin GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, GPIO_InitStructure); // 3. 时基配置设置 PSC 以调整计数分辨率 TIM_TimeBaseStructure.TIM_Prescaler psc; // 例72-1计数频率 1MHz TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period 0xFFFF; // 16位定时器最大计数值 TIM_TimeBaseStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInit(TIM4, TIM_TimeBaseStructure); // 4. 配置 CH1 输入捕获上升沿直接映射到 TI1 TIM_ICInitStructure.TIM_Channel TIM_Channel_1; TIM_ICInitStructure.TIM_ICPolarity TIM_ICPolarity_Rising; // 上升沿捕获 TIM_ICInitStructure.TIM_ICSelection TIM_ICSelection_DirectTI; // 直接映射 TIM_ICInitStructure.TIM_ICPrescaler TIM_ICPSC_DIV1; // 不分频每个边沿都捕获 TIM_ICInitStructure.TIM_ICFilter 0x00; // 不滤波 TIM_ICInit(TIM4, TIM_ICInitStructure); // 5. 使能捕获中断和更新中断 TIM_ITConfig(TIM4, TIM_IT_CC1 | TIM_IT_Update, ENABLE); // 6. NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel TIM4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority 0; NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; NVIC_Init(NVIC_InitStructure); // 7. 启动定时器 TIM_Cmd(TIM4, ENABLE); } // 中断服务函数 void TIM4_IRQHandler(void) { // 处理更新事件计数器溢出 if (TIM_GetITStatus(TIM4, TIM_IT_Update) ! RESET) { TIM_ClearITPendingBit(TIM4, TIM_IT_Update); overflow_count; // 溢出次数加一 } // 处理捕获事件检测到上升沿 if (TIM_GetITStatus(TIM4, TIM_IT_CC1) ! RESET) { TIM_ClearITPendingBit(TIM4, TIM_IT_CC1); captured_value TIM_GetCapture1(TIM4); // 读取 CCR1 中的锁存值 capture_count; // 用户代码此时可结合 overflow_count 和 captured_value 计算周期 // 例如总计数 captured_value (uint32_t)overflow_count * 0x10000 // 信号周期 总计数 / 计数频率 } }计算说明假设 PSC 72-1即计数频率为72MHz / 72 1MHz一个计数周期为 1μs若捕获后captured_value 500且期间overflow_count 2则信号周期T (2 × 65536 500) μs ≈ 131.572ms频率约为 7.6Hz 。PWM 输入模式PWMI若想自动同时测量周期和占空比可配置为 PWM 输入模式。此时同一通道的另一个输入会被映射到另一捕获通道两个通道分别捕获周期和脉宽代码配置更复杂但效率更高 。四、输出比较与输入捕获配置要点对比对比项输出比较PWM 输出输入捕获GPIO 模式GPIO_Mode_AF_PP复用推挽输出GPIO_Mode_IN_FLOATING或上拉/下拉输入核心寄存器TIMx_CCR写入比较值TIMx_CCR读出锁存值模式配置寄存器TIMx_CCMR_OCxM输出比较模式TIMx_CCMR_ICxS与ICxF输入捕获选择与滤波触发事件计数到 CCR 产生电平翻转外部边沿触发锁存计数中断来源无专门捕获中断一般由更新中断控制周期TIM_IT_CCx捕获中断 TIM_IT_Update溢出中断预装载功能可开启预装载平滑更新无需预装载锁存即用五、综合应用实例PWM 输出驱动舵机 输入捕获反馈实际项目中输出比较与输入捕获常组合构成闭环系统。例如使用 TIM1 输出 PWM 驱动舵机同时用 TIM2 输入捕获测量舵机角度传感器电位计输出的脉宽信号以实现角度闭环控制 。系统框图STM32 PWM输出TIM1_CH1→ 舵机控制信号 舵机角度反馈信号脉宽 0.5~2.5ms→ TIM2_CH1 输入捕获代码框架// 1. 输出比较TIM1_CH1 输出 50Hz 舵机 PWM周期 20ms void Servo_PWM_Init(void) { // PSC72-1ARR20000-1 → PWM频率 50Hz // CCR 范围 500~2500 对应 0.5ms~2.5ms 脉宽 } // 2. 输入捕获TIM2_CH1 测量反馈脉宽 void Feedback_Capture_Init(void) { // 配置上升沿和下降沿交替捕获或使用 PWM 输入模式 // 捕获到上升沿记录时间 t1下降沿记录 t2脉宽 t2 - t1 } // 3. 主循环中根据反馈调节 PWM 占空比 void servo_control_loop(void) { uint16_t target_pwm 1500; // 期望角度对应脉宽 uint16_t current_pulse get_captured_pulse(); // 实测脉宽 // 简单比例控制 if (current_pulse target_pwm) { CCR1 1; // 增大脉宽 } else if (current_pulse target_pwm) { CCR1 - 1; // 减小脉宽 } }六、常见注意事项输出比较通道与引脚映射TIM3_CH2 默认在 PA1但重映射后可在 PB5 输出。不同型号引脚映射不同必须先查数据手册 。输入捕获滤波对于含噪声的信号可在TIM_ICFilter中设置滤波值0~15滤波值越大越抗干扰但会引入延迟 。捕获溢出处理测量低频信号时计数器可能溢出多次必须通过更新中断统计溢出次数才能正确恢复周期 。PWM 预装载与 CCR 更新建议始终开启预装载功能防止运行中修改 CCR 导致输出波形异常 。高级定时器 PWM 输出TIM1/TIM8 使用 PWM 输出时必须额外使能主输出TIM_CtrlPWMOutputs(TIM1, ENABLE)。通过上述配置方法与代码示例即可独立实现 PWM 输出和频率/脉宽测量的功能并可根据实际工程需求组合运用。参考来源STM32之六TIM通用定时器进阶应用输入捕获与PWM实战STM32学习——输出比较和输入捕获STM32-一文搞懂通用定时器捕获/比较通道STM32 TIM输入捕获stm32的定时器输入捕获与输出比较STM32实现PWM输出与PWM输入捕获HAL库
RELATED

相关推荐

01序列间隔检查:一次遍历解决力扣1437边界问题

01序列间隔检查:一次遍历解决力扣1437边界问题

前几天有读者在后台问我一道看起来很简短的题:给你一个01序列,以及一个整数k,要判断是不是所有1都至少间隔k个元素。这不光是力扣1437的原题(英文名 Check If All 1s are at Least Length K Places Away),也…

📅 2026/10/11 7:15:46
代码智能体从零上手:实操配置与开发效率提升指南

代码智能体从零上手:实操配置与开发效率提升指南

1. 从零上手代码智能体:为什么我决定认真折腾这套工具第一次听说“代码智能体”这个词,是在一个开发者社群里。当时有人丢了一张截图,说自己在编辑器里敲了一行注释,几秒钟之后一整段带异常处理的函数就自动补全了,连单…

📅 2026/10/11 7:15:46
工程视角下的Transformer:训练策略、推理优化与全流程避坑指南

工程视角下的Transformer:训练策略、推理优化与全流程避坑指南

2. 为什么这场分享要从“工程”切入Transformer最近整理笔记时,重新翻出某位资深AI工程师在一所高校做的技术分享录音,主题是AI工程实践与Transformer架构。说来也巧,市面上讲Transformer的教程不少,但大多停留在“看懂注意力公式…

📅 2026/10/11 7:15:46
MORE NEWS

更多资讯

📰

一文看懂 9 大 AI 模型:原理、落地与适用企业

如今人工智能已经不再只是会聊天的大语言模型,而是由向量模型、重排模型、语音模型、视觉模型、文生图、文生视频、图生视频等一系列专业模型共同组成的能力矩阵。不同模型各司其职,组合起来才能实现图文音视频的理解、检索、生成,下面逐一拆…

📰

中药学论文从文献到答辩:我会这样搭配 AI 助手 [特殊字符][特殊字符]‍[特殊字符][特殊字符]

先把场景说具体:假设你是医学 / 中药学类 / 中药学专业学生,正在做毕业论文,题目类似 “黄芪—丹参药对干预糖尿病心肌病的作用机制研究”,可能结合网络药理学、动物实验或文献研究。 这类题目很典型,也确实容易让人头…

📰

起重司索信号工考试新题库 常考题型 + 答案解析助力一次过

干起重司索信号工这行,不少师傅技术过硬,一上考场却发怵。原因不复杂:平时靠经验干活,真到做题时,法规条文、安全距离、指挥信号这些细节记不准,加上工作忙、复习时间碎,翻书又抓不住重点。我们…

📰

REA模型实战指南:从业务建模到数据库设计与会计自动化

做企业架构和会计信息化相关系统的人,对REA这个词肯定不陌生。我最早接触REA是接手一套老旧的进销存平台改造,当时的业务痛点很直白:传统数据库表结构总是围绕“凭证”和“科目”在转,业务部门提的需求——比如“查某张订单到底对…

📰

【计算机毕业设计单片机案例】基于STM32的室内空气品质多指标监测与联动调节系统设计 基于WIFI的室内环境监测系统设计与远程控制实现(030125)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

📰

从模糊标题到落地项目:技能管理系统的数据模型、存储选型与可视化实践

1. 当“skills”成为一个项目名:先搞清楚它到底指什么第一次看到“skills”这个词被当作项目标题,我脑子里蹦出来的第一个念头是:这到底是一个技能管理工具,还是一个技能树可视化项目,又或者是一个面向招聘场景的能力标…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬