去年帮电子设计竞赛的学生调试作品时,发现很多队伍在信号频率测量环节频繁出错。于是萌生了设计一款教学级测频装置的想法——既要保证基础功能的可靠性,又要便于初学者理解底层原理。这个基于STM32F103C8T6的测频计,就是在这种背景下诞生的实验性项目。
核心功能上,它能准确捕获10Hz-1MHz范围内的正弦波、方波信号频率,通过0.96寸OLED实时显示测量结果。硬件设计采用最小系统板+信号调理电路的组合,软件层面则充分利用了STM32的输入捕获和定时器中断特性。特别值得一提的是,所有功能都在Proteus 8.9环境下完成了仿真验证,这对硬件条件有限的学习者来说非常友好。
主控芯片选用STM32F103C8T6并非偶然。这款Cortex-M3内核的MCU拥有:
信号调理电路由两级运放构成:
在Proteus中搭建模型时,这几个细节需要特别注意:
避坑提示:Proteus中的STM32模型默认时钟频率是8MHz,需在"Edit Component"里手动修改为72MHz以匹配实际硬件。
测量频率的核心在于TIM2的输入捕获模式配置:
c复制void TIM2_Config(void) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
// 时基单元配置(1us计数)
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_TimeBaseStructure.TIM_Prescaler = 72-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 输入捕获配置(上升沿触发)
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 = 0x0;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_Cmd(TIM2, ENABLE);
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
}
采用周期法测量频率,通过捕获连续两个上升沿的时间差计算周期:
c复制void TIM2_IRQHandler(void) {
if(TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) {
static uint16_t lastCapture = 0;
uint16_t currentCapture = TIM_GetCapture1(TIM2);
if(lastCapture != 0) {
uint32_t period = (currentCapture > lastCapture) ?
(currentCapture - lastCapture) :
(0xFFFF - lastCapture + currentCapture);
frequency = 1000000.0 / period; // 单位Hz
}
lastCapture = currentCapture;
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
}
}
当信号频率超过100kHz时,建议改用测频法(单位时间内计数脉冲数):
实测中发现环境噪声会导致误触发,可通过以下方式改善:
| 输入信号 | 标称值 | 测量值 | 误差 |
|---|---|---|---|
| 10kHz方波 | 10,000Hz | 9,998Hz | -0.02% |
| 100kHz正弦波 | 100,000Hz | 99,974Hz | -0.026% |
| 500kHz方波 | 500,000Hz | 499,563Hz | -0.087% |
测试环境:信号源采用RIGOL DG1022,供电电压3.3V,环境温度25℃
检查顺序:
可能原因及对策:
这个基础框架还可以进一步开发:
我在实际调试中发现,当测量1MHz方波时,若将TIM2的预分频器改为36-1(计数周期0.5us),可将误差控制在0.05%以内。这提醒我们,针对特定频段优化定时器参数,往往能获得意想不到的精度提升。