基于stm32芯片仿真的简易测频计 有报告 源文件 .ioc文件 使用 Proteus 仿真32单片机,实现了可以测量正弦波、方波、正弦波和锯齿波等波形频率的 频率计,测量误差在1%以内

最近在玩Proteus仿真时捣鼓了个挺有意思的东西——用STM32F103做个简易数字频率计。实测能测方波、正弦波、锯齿波,误差控制在1%以内,这对仿真环境来说已经够用了。直接上干货,说说实现思路。

硬件部分在Proteus里搭得挺简单:STM32F103C8核心板,加个1602液晶显示,信号输入接PA0脚。关键点在于定时器配置,这里用TIM2的输入捕获功能抓信号边沿。

先看关键代码段,CubeMX生成的定时器初始化部分:

// TIM2输入捕获配置
htim2.Instance = TIM2;
htim2.Init.Prescaler = 71; // 72Mhz/(71+1)=1MHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 0xFFFFFFFF;
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);

这个预分频把计数频率降到1MHz,每个计数代表1us。输入捕获设置成上升沿触发,用来捕捉两次上升沿之间的时间差。

核心的中断处理函数才是真家伙:

uint32_t first_capture = 0;
uint32_t period = 0;

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
    static uint32_t prev_capture = 0;
    
    if (htim->Instance == TIM2) {
        uint32_t curr_capture = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
        
        if (prev_capture != 0) {
            period = (curr_capture > prev_capture) ? 
                    (curr_capture - prev_capture) : 
                    (0xFFFFFFFF - prev_capture + curr_capture);
            first_capture = 1; // 有效数据标志
        }
        prev_capture = curr_capture;
    }
}

这里处理两次捕获值的关系,考虑定时器溢出的情况。当测得时间差period后,频率计算就简单了:f = 1000000 / period(Hz)。

不过实际使用中发现直接取单次测量值波动较大,于是加了滑动平均滤波:

#define SAMPLE_SIZE 10
uint32_t freq_buffer[SAMPLE_SIZE];
uint8_t buf_index = 0;

// 在显示刷新部分加入:
if(first_capture) {
    freq_buffer[buf_index++] = 1000000 / period;
    buf_index %= SAMPLE_SIZE;
    
    uint32_t avg_freq = 0;
    for(uint8_t i=0; i<SAMPLE_SIZE; i++) {
        avg_freq += freq_buffer[i];
    }
    avg_freq /= SAMPLE_SIZE;
    
    lcd_show_freq(avg_freq); // 自定义显示函数
}

取10次测量平均值后,液晶显示稳定多了。实测在10Hz-50kHz范围内误差基本在1%以内,高频时误差会稍微大点,不过作为简易测量够用了。

几个调试时踩过的坑:

  1. 信号幅度必须满足STM32的IO电平要求,低于1.7V会检测不到
  2. 输入信号最好先经过斯密特触发器整形,实测直接测正弦波时偶尔会丢边沿
  3. 测量低频时(<100Hz)需要适当增加采样次数,否则刷新率太低看着难受

Proteus里仿真时记得打开示波器视图观察输入信号,有时候仿真模型的信号源和实际硬件差异挺大。项目文件里.ioc配置重点关注了TIM2和GPIO的输入模式,其他外设基本保持默认。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐