4. 静态阈值法:固定阈值检测原理,实现方法(比较器+计数器),优缺点分析

静态阈值法,说白了就是给信号画一条「生死线」。信号超过这条线,我就认为它「来了」;低于这条线,我就认为它「走了」。这是阈值检测里最朴素、最直接的方法,也是我入行时接触的第一个检测算法。

你想想看,在很多嵌入式场景下——比如测个脉冲宽度、检测个过零事件——我们其实不需要多复杂的自适应算法。一个比较器加一个计数器,往往就能搞定。我当年做电机转速测量时,用的就是这套方案,稳定跑了三年没出过问题。

4.1 固定阈值检测原理

原理其实就一句话:设定一个固定的电压参考值 Vth,输入信号 Vin 与它比较,输出高低电平。

数学表达也很简单:

V_in > V_th  → 输出高电平(逻辑1)
V_in < V_th  → 输出低电平(逻辑0)

这个输出信号,就是后续时间测量的「开关信号」。脉冲的上升沿代表信号到达,下降沿代表信号结束。我们用计数器去数这两个沿之间的时钟周期数,就能算出时间。

核心要点:静态阈值法的本质是把模拟问题转化为数字问题。一旦信号变成了高低电平,剩下的就是纯数字逻辑的事了。

4.2 实现方法:比较器 + 计数器

实现起来非常直接。我习惯把它拆成三个模块:

  1. 模拟前端:信号调理(放大、滤波、偏置调整)
  2. 比较器:将模拟信号与固定阈值比较,输出数字脉冲
  3. 计数器:测量脉冲宽度或周期

下面这张图展示了整个信号链路的流程:

静态阈值法信号链路 输入信号 V_in (模拟) 信号调理 放大/滤波/偏置 比较器 V_in vs V_th 计数器 脉冲宽度/周期 V_th 设定 数字脉冲 关键说明: 1. 比较器输出是数字信号,只有0和1两种状态 2. 计数器通常使用MCU内部定时器或外部计数器芯片 3. V_th的精度直接影响测量误差,建议使用精密参考源

4.2.1 比较器选型要点

比较器是这套方案的核心器件。我踩过不少坑,这里列几个关键参数:

参数 要求 我的经验
响应时间 小于信号最小脉宽的1/10 测1μs脉冲时,必须选ns级比较器
输入失调电压 小于阈值精度的1/5 LM393失调约±5mV,够用但不算好
滞回电压 根据噪声幅度设定 我一般设10~50mV,防抖动
共模输入范围 覆盖信号摆幅 轨到轨输入最省心

我的习惯:如果信号频率不高(<1MHz),我优先用带内置滞回的比较器,比如MAX9015。省掉外部正反馈电阻,PCB面积能小一圈。

4.2.2 计数器实现方式

计数器这块,我通常有三种选择:

  • MCU内部定时器:最常用,STM32的TIM、AVR的TC都支持输入捕获。我一般用16位定时器,配合预分频器,能覆盖从μs到s的量程。
  • 外部计数器芯片:比如74HC4040,适合超高频场景。我之前做超声波测距时用过,能跑到50MHz。
  • FPGA内部计数器:精度最高,但成本也高。只在需要皮秒级分辨率时才用。

下面是一个简单的STM32输入捕获配置示例:

// STM32 TIM2 输入捕获配置(CH1)
void TIM2_InputCapture_Init(void) {
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;   // 使能TIM2时钟
    TIM2->PSC = 72 - 1;                    // 预分频72MHz→1MHz(1μs分辨率)
    TIM2->ARR = 0xFFFF;                    // 16位自动重装
    TIM2->CCMR1 |= TIM_CCMR1_CC1S_0;       // CH1配置为输入,映射到TI1
    TIM2->CCER |= TIM_CCER_CC1E;           // 使能捕获
    TIM2->CR1 |= TIM_CR1_CEN;              // 启动定时器
}

// 读取捕获值(上升沿触发)
uint16_t GetCaptureValue(void) {
    return TIM2->CCR1;                     // 返回捕获寄存器值
}

4.3 优缺点分析

静态阈值法用了这么多年,它的优缺点我太清楚了。咱们客观说说:

4.3.1 优点

  • 实现简单:一个比较器芯片加几行代码,半小时就能搭起来。我当年在面包板上验证方案,从焊接到出数据不到一小时。
  • 成本极低:LM393比较器几分钱一个,加上电阻电容,总成本不超过两毛钱。量产时这个优势很明显。
  • 实时性好:比较器是纯硬件响应,延迟固定且可预测。计数器也是硬件计数,没有软件抖动。
  • 功耗低:静态电流通常只有几十μA,适合电池供电设备。

4.3.2 缺点

  • 对信号幅度敏感:信号幅度变化时,过阈值点会偏移。我记得有次做激光测距,温度变化导致光功率漂移,测量结果直接偏了5%。
  • 无法处理噪声:噪声尖峰可能误触发。我曾经被这个坑过——电机启动时的EMI让比较器乱跳,计数器数出一堆假脉冲。
  • 阈值固定不灵活:一旦设定好V_th,就不能动态调整。如果信号特性变了,你得手动改硬件。
  • 存在时间游走误差:信号斜率变化时,过阈值点的时间会漂移。这个在后续章节会详细讲。

避坑指南:我曾经在一个项目中直接用比较器输出驱动MCU中断引脚,没加任何滤波。结果现场有强电磁干扰,MCU每秒被误中断上千次,系统直接死机。后来我在比较器输出端加了一个RC低通滤波(10kΩ+100pF),问题立刻解决。

4.4 适用场景与选型建议

静态阈值法不是万能的,但在以下场景中它是最优解:

场景 推荐使用 不推荐使用
信号幅度稳定 ✅ 静态阈值法 ❌ 自适应法(浪费资源)
信噪比高(>20dB) ✅ 静态阈值法 ❌ 复杂滤波(没必要)
成本敏感 ✅ 静态阈值法 ❌ FPGA方案(太贵)
信号幅度变化大 ❌ 静态阈值法 ✅ 自适应阈值或峰值检测
强噪声环境 ❌ 静态阈值法 ✅ 相关检测或匹配滤波

嗯,这里要注意:静态阈值法虽然简单,但它的局限性也很明显。如果你遇到信号幅度不稳定或者噪声大的情况,别硬扛。后面我们会讲动态阈值法和自适应阈值法,那些才是对付复杂信号的利器。

我个人建议,初学者先用静态阈值法把整个信号链路跑通,理解比较器和计数器的工作原理。等基础打牢了,再往更高级的方法过渡。毕竟,连固定阈值都搞不定的人,去做自适应阈值只会更懵。