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

别再死磕内部时钟了!用STM32F103C8T6的ETR外部时钟做个红外计数器(附完整代码)

STM32F103C8T6实战:用ETR外部时钟打造高精度红外计数器

在工业自动化、智能仓储和流水线管理中,物体计数是一个基础但关键的功能。传统方案往往依赖软件中断计数,但在高速或高精度场景下容易丢失脉冲。STM32的ETR(External Trigger)外部时钟模式为解决这一问题提供了硬件级方案——本文将带你从电路设计到代码实现,完成一个基于红外对射传感器的计数器系统。

1. 为什么ETR模式更适合计数场景?

1.1 内部时钟的局限性

当使用STM32内部时钟进行计数时,通常需要这样处理红外信号:

// 传统中断计数方式示例 void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { counter++; EXTI_ClearITPendingBit(EXTI_Line0); } }

这种方式存在三个明显缺陷:

  • CPU依赖性强:每个脉冲都需要触发中断
  • 高频响应差:超过1kHz的信号可能丢失
  • 功耗高:持续唤醒内核影响低功耗设计

1.2 ETR的硬件优势

ETR模式通过定时器硬件直接处理外部信号:

  • 零CPU干预:计数由定时器硬件自动完成
  • 超高响应:支持最高72MHz的输入信号(经分频后)
  • 灵活配置:支持上升沿/下降沿触发、数字滤波

实测对比:在1MHz方波输入时,中断方式丢失率>90%,而ETR模式可100%准确计数

2. 硬件设计关键要点

2.1 传感器选型与电路

推荐使用槽型光电传感器(如EE-SX670):

VCC(3.3V) | [R1] 10K | +-----> PA0(ETR输入) | [传感器] | GND

参数选择

  • 工作电压:3.3V兼容
  • 输出类型:数字输出(OC门)
  • 响应时间:<10μs

2.2 ETR引脚配置原则

STM32F103C8T6的ETR引脚对应关系:

定时器ETR引脚复用功能
TIM1PA12TIM1_ETR
TIM2PA0TIM2_ETR
TIM3PD2TIM3_ETR(仅大容量)
TIM4PE0TIM4_ETR(仅大容量)

注意:C8T6属于中等容量型号,实际可用ETR引脚为PA0和PA12

3. 软件配置全流程

3.1 初始化代码分解

void TIM_ETR_Init(void) { // 1. 时钟使能 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 2. GPIO配置(浮空输入模式) GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); // 3. ETR模式配置 TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F); // 4. 时基单元配置 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_TimeBaseInitStruct.TIM_Period = 0xFFFF; // 最大计数值 TIM_TimeBaseInitStruct.TIM_Prescaler = 0; // 无分频 TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct); // 5. 使能计数器 TIM_Cmd(TIM2, ENABLE); }

3.2 关键参数解析

  • TIM_ExtTRGPolarity
    TIM_ExtTRGPolarity_NonInverted表示上升沿计数
    TIM_ExtTRGPolarity_Inverted表示下降沿计数

  • ExtTRGFilter
    值0x0F表示最大滤波时间(约240ns @72MHz)

  • Period设置技巧
    当需要统计超过65535的计数时,可结合溢出中断:

    void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { overflow_count++; TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } }

4. 高级应用技巧

4.1 脉冲频率测量

通过ETR模式可轻松实现频率计:

float Measure_Frequency(void) { uint32_t cnt1 = TIM_GetCounter(TIM2); Delay_ms(1000); // 精确延时1秒 uint32_t cnt2 = TIM_GetCounter(TIM2); return (cnt2 - cnt1) / 1.0; // 单位Hz }

4.2 抗干扰设计

工业环境中的噪声可能引发误计数,推荐以下防护措施:

  1. 硬件滤波

    • 在ETR引脚添加100nF电容到地
    • 使用施密特触发器整形信号
  2. 软件滤波

    TIM_ETRConfig(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F);

4.3 低功耗优化

ETR模式配合STM32的睡眠模式可实现超低功耗计数:

void Enter_LowPowerMode(void) { // 配置唤醒事件 TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_External1); TIM_SelectInputTrigger(TIM2, TIM_TS_ETRF); // 进入停止模式 PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); }

5. 实战:包装流水线计数器

某食品包装线需要统计每分钟的包装数量,系统要求:

  • 计数范围:0-9999
  • 显示更新频率:1Hz
  • 工作环境:强电磁干扰

实现方案

typedef struct { uint16_t current_count; uint16_t last_minute_count; uint8_t update_flag; } Counter_TypeDef; Counter_TypeDef counter; void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { counter.current_count += 65536; TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } void SysTick_Handler(void) { static uint32_t ticks = 0; if(++ticks >= 1000) { ticks = 0; counter.last_minute_count = counter.current_count; counter.current_count = 0; counter.update_flag = 1; } }

硬件连接注意事项:

  1. 传感器电源与MCU共地
  2. 信号线使用双绞线传输
  3. 在PA0与GND之间并联TVS二极管

调试中发现,当传送带空转时红外传感器可能产生抖动信号。最终通过以下配置解决:

TIM_ETRConfig(TIM2, TIM_ExtTRGPSC_DIV8, // 8分频 TIM_ExtTRGPolarity_NonInverted, 0x0F);
http://www.jsqmd.com/news/991492/

相关文章:

  • 办理香港身份容易踩哪些坑?2026年最全避坑要点整理 - 资讯快报
  • 智能冰箱控制系统(Qt C++)技术方案
  • Android 13 Launcher3 桌面大改造:手把手教你修改默认布局文件,替换预装应用
  • 基于PLC自动门控制系统设计(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_可以扫码或者私信
  • 微信投票怎么操作丨2026 微信投票完整操作步骤(海投票最新版) - 微信投票小程序
  • 别再为H桥驱动发愁了!用STM32F103的TIM1+TIM2主从模式生成带死区的互补PWM(附完整代码)
  • 三指拖拽:在Windows上解锁MacBook般流畅操作体验的完整指南
  • 2026高考志愿:大数据相关专业报考避坑指南
  • 从势垒到通路:深入解析肖特基与欧姆接触的物理机制与器件应用
  • 北方工业大学考研辅导班精选推荐:实力品牌解析与选班指南 - 推荐评测师
  • 轻规划鸿蒙开发实战3:AR Engine Kit 深度实践,基于面部追踪与骨骼捕捉的体感微笑打
  • UIA-v2终极指南:Windows桌面自动化从入门到精通
  • 用LabVIEW和X-Plane 11搭建你的私人飞行仪表盘(附完整UDP通信源码)
  • 微信小程序计算机毕设之基于Android的零食配送APP基于Android studio的零食商城app的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • TNT炸药参数下破片飞散仿真:如何用Python替代MATLAB快速验证战斗部设计?
  • 微服务慢调用与 SQL 慢查询:从表象直抵根因的工程实践
  • 测评|宁波亲子连锁店做GEO应该怎么选服务商?靠谱GEO服务商推荐 - 极义GEO
  • 心里藏了很久的秘密能对陌生人说吗?5平台实测 - 热点速览
  • 颗粒迸发口感出众,五款实力派爆珠酸奶实用测评推荐 - 热点速览
  • iTop开源ITSM平台:3步搭建你的企业级IT服务管理中心
  • 企业级工作流自动化引擎:ProcessMaker开源BPM平台深度解析
  • OEXN平台:从公开信息出发,归纳合规意识与运营连贯性
  • COMSOL内置数学函数与运算符:从入门到高阶建模的实战指南
  • 湖南大学考研辅导班精选推荐:实力品牌解析与选班指南 - 推荐评测师
  • ALNS算法入门实战:手把手教你用Java搞定旅行商问题(TSP)可视化
  • 淘宝大数据|电商行业大数据
  • ArcGIS Pro二次开发:别再手动记图层位置了,这个工具自动把路径和名称写进字段里
  • 2026上海黄金回收攻略,16区上门服务“速度王”和“价格王”揭晓 - 开心测评
  • 2026更换图片背景颜色怎么做?免费修图软件手把手详细教程 - 办公小帮手
  • 百度网盘高速下载终极指南:5分钟掌握真实链接解析技巧