1. 项目概述
频率计作为电子测量领域的基础工具,在科研实验、工业检测和电子维修中扮演着重要角色。传统商用频率计往往价格昂贵且功能固定,而基于STM32的方案能以1/10的成本实现同等测量精度。我在最近完成的智能温室项目中,就遇到了需要实时监测风机转速信号的需求,这促使我开发了这套可定制化的频率测量方案。
这个设计最核心的优势在于:利用STM32内置的高精度定时器配合智能算法,既能测量0.1Hz-50MHz的宽范围信号,又可以通过修改软件适配不同场景的特殊需求。比如在测量电机转速时,可以增加滑动平均滤波;而在射频信号检测时,则能启用脉冲宽度鉴别功能。
2. 硬件设计解析
2.1 核心器件选型
经过对比STM32F1/F4/H7三个系列,最终选用STM32F407VGT6作为主控,主要基于三点考量:
- 内置的TIM2/TIM5定时器支持32位计数,在测量低频信号时不会产生溢出误差
- 168MHz主频配合硬件除法器,能实时处理高频信号计算
- 相比H7系列更低的功耗和成本
信号调理电路采用两级设计:
- 前级使用LM311比较器将正弦波/三角波转换为方波
- 后级通过74HC14施密特触发器进行波形整形
实测表明,这种组合对10mVpp以上的信号都能可靠识别。
2.2 关键电路设计要点
输入保护电路需要特别注意:
- TVS二极管选用SMBJ5.0CA进行过压保护
- 串联100Ω电阻限制输入电流
- 在比较器前端加入RC低通滤波(fc=60MHz)
PCB布局时,将定时器输入引脚(PA0/PA1)直接连接至信号调理输出端,避免长走线引入干扰。在首批样机测试中,曾因信号走线过长导致100MHz以上测量值波动达±5%,优化布局后误差降至0.1%以内。
3. 软件实现方案
3.1 测量模式选择
根据信号特性提供三种测量模式:
c复制typedef enum {
MODE_PERIOD = 0, // 周期法(适合低频<1MHz)
MODE_PULSE, // 脉冲计数法(适合高频)
MODE_MIXED // 自动切换模式
} FreqMeasureMode;
在混合模式下,系统会动态选择最优方法:
- 当输入频率>2MHz时启用脉冲计数法
- 频率<100kHz时切换为周期法
- 中间频段采用周期法多次测量取平均
3.2 关键代码实现
定时器配置示例(使用TIM2捕获模式):
c复制void TIM2_Config(void) {
TIM_ICInitTypeDef ic;
ic.TIM_Channel = TIM_Channel_1;
ic.TIM_ICPolarity = TIM_ICPolarity_Rising;
ic.TIM_ICSelection = TIM_ICSelection_DirectTI;
ic.TIM_ICPrescaler = TIM_ICPSC_DIV1;
ic.TIM_ICFilter = 0x0F; // 设置输入滤波
TIM_ICInit(TIM2, &ic);
TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
}
频率计算算法采用改进的倒数法:
c复制float Calc_Frequency(uint32_t clk, uint32_t counts) {
static float last_freq = 0.0f;
float current = (float)clk / counts;
// 动态加权平滑处理
if(last_freq > 0) {
float ratio = fabs(current - last_freq)/last_freq;
float weight = (ratio > 0.2) ? 0.7 : 0.3;
current = weight*current + (1-weight)*last_freq;
}
return current;
}
4. 性能优化技巧
4.1 抗干扰措施
在工业现场测试时发现,电机启停会导致测量值出现毛刺。通过以下改进显著提升稳定性:
- 在软件中增加数字滤波:
c复制#define FILTER_DEPTH 5
float moving_avg_filter(float new_val) {
static float buf[FILTER_DEPTH] = {0};
static uint8_t idx = 0;
buf[idx++] = new_val;
if(idx >= FILTER_DEPTH) idx = 0;
float sum = 0;
for(uint8_t i=0; i<FILTER_DEPTH; i++) {
sum += buf[i];
}
return sum/FILTER_DEPTH;
}
- 硬件上在信号输入端增加磁珠(BLM18PG121SN1)抑制高频噪声
4.2 精度提升方案
对于1MHz以下信号,采用多周期同步测量法:
- 使用TIM2捕获边沿时刻
- 同时开启TIM6进行精确时间基准
- 测量N个完整周期的时间T
- 频率f = N/T
实测表明,当N=100时,10kHz信号测量精度可达±0.001%
5. 实测数据对比
使用安捷伦53230A频率计作为基准,对比测试结果:
| 输入频率 | 本设计测量值 | 相对误差 |
|---|---|---|
| 10Hz | 10.001Hz | +0.01% |
| 1kHz | 999.97Hz | -0.003% |
| 1MHz | 0.99982MHz | -0.018% |
| 10MHz | 9.9967MHz | -0.033% |
| 30MHz | 29.978MHz | -0.073% |
在长时间稳定性测试中,连续工作24小时的频率漂移小于5ppm。功耗方面,全速运行时整机电流仅28mA(3.3V供电)。
6. 扩展应用方向
这套方案经过简单修改即可实现更多功能:
- 转速测量模式:通过设置闸门时间为1秒,直接显示RPM值
- 占空比测量:利用定时器的PWM输入模式捕获高/低电平时间
- 频率信号生成:配合DAC输出,实现可编程信号源
在最近参与的智能农业项目中,我们将其扩展为四通道频率监测模块,同时采集多个环境传感器的输出信号。通过修改软件算法,还能识别特定频率模式,比如检测水泵是否发生空转。