4. 静态阈值法:固定阈值检测原理,实现方法(比较器+计数器),优缺点分析
静态阈值法,说白了就是给信号画一条「生死线」。信号超过这条线,我就认为它「来了」;低于这条线,我就认为它「走了」。这是阈值检测里最朴素、最直接的方法,也是我入行时接触的第一个检测算法。
你想想看,在很多嵌入式场景下——比如测个脉冲宽度、检测个过零事件——我们其实不需要多复杂的自适应算法。一个比较器加一个计数器,往往就能搞定。我当年做电机转速测量时,用的就是这套方案,稳定跑了三年没出过问题。
4.1 固定阈值检测原理
原理其实就一句话:设定一个固定的电压参考值 Vth,输入信号 Vin 与它比较,输出高低电平。
数学表达也很简单:
V_in > V_th → 输出高电平(逻辑1)
V_in < V_th → 输出低电平(逻辑0)
这个输出信号,就是后续时间测量的「开关信号」。脉冲的上升沿代表信号到达,下降沿代表信号结束。我们用计数器去数这两个沿之间的时钟周期数,就能算出时间。
核心要点:静态阈值法的本质是把模拟问题转化为数字问题。一旦信号变成了高低电平,剩下的就是纯数字逻辑的事了。
4.2 实现方法:比较器 + 计数器
实现起来非常直接。我习惯把它拆成三个模块:
- 模拟前端:信号调理(放大、滤波、偏置调整)
- 比较器:将模拟信号与固定阈值比较,输出数字脉冲
- 计数器:测量脉冲宽度或周期
下面这张图展示了整个信号链路的流程:
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方案(太贵) |
| 信号幅度变化大 | ❌ 静态阈值法 | ✅ 自适应阈值或峰值检测 |
| 强噪声环境 | ❌ 静态阈值法 | ✅ 相关检测或匹配滤波 |
嗯,这里要注意:静态阈值法虽然简单,但它的局限性也很明显。如果你遇到信号幅度不稳定或者噪声大的情况,别硬扛。后面我们会讲动态阈值法和自适应阈值法,那些才是对付复杂信号的利器。
我个人建议,初学者先用静态阈值法把整个信号链路跑通,理解比较器和计数器的工作原理。等基础打牢了,再往更高级的方法过渡。毕竟,连固定阈值都搞不定的人,去做自适应阈值只会更懵。