Funpack4-2 - 基于dsPIC33CK64MC105 Curiosity Nano实现测出振动的固有频率的功能
该项目使用了dsPIC33CK64MC105 Curiosity Nano,实现了测出振动的固有频率的设计,它的主要功能为:使用片内的ADC和高速比较器配合振动传感器,将探头贴在物体外部,敲击后测出振动的固有频率。。
标签
嵌入式系统
Funpack活动
开发板
magmadimsum
更新2025-07-02
北京邮电大学
7

项目描述(包含项目介绍、设计思路)

本项目旨在利用dsPIC33CK64MC105开发板搭配DFR0052压力传感器,实现对扬声器振动的检测与分析。项目通过将压力传感器贴附于扬声器表面,将扬声器的振动信号转换为电信号,并由dsPIC33CK64MC105开发板上的ADC模块采集这些信号。采集到的振动数据通过串口传输至电脑,使用Rust语言编写的上位机程序进行解析,判断扬声器是否在振动并提取其振动的基频。为优化数据质量,项目设计了一个50Hz陷波滤波器,以消除电源频率干扰。

设计思路分为硬件和软件两部分。硬件方面,DFR0052压力传感器通过其压电特性捕捉扬声器振动,输出模拟电压信号,该信号接入dsPIC33CK64MC105开发板的ADC引脚进行数字化转换。软件方面,ADC模块配置为连续采样模式,定时器用于控制采样频率,串口模块实现数据传输。上位机程序接收数据后,应用50Hz陷波滤波器进行处理,并通过快速傅里叶变换(FFT)分析提取振动基频。


简短的硬件介绍

  • dsPIC33CK64MC105开发板:搭载Microchip的dsPIC33CK64MC105数字信号控制器(DSC),采用16位RISC架构,工作频率可达100MHz,配备64KB闪存和8KB RAM。其12位ADC模块支持多通道采样,丰富的定时器和串口资源使其非常适合信号处理和数据采集应用。
  • DFR0052压力传感器:一种压电振动传感器,能够将机械振动转换为电压信号,输出与振动强度成正比的模拟信号,适用于振动检测场景。

软件流程图

image.png



主要代码片段:

单片机:

int main(void)
{
    SYSTEM_Initialize();
    DELAY_milliseconds(2000);

    adc->adcMulticoreInterface->ChannelCallbackRegister(ADC_ConversionDone);
    timer->TimeoutCallbackRegister(ADC_StartConversionOnChannel);

    while (1)
    {
        if (adcOk)
        {
            timer->Stop();
            for (int i = 0; i < ADC_BUFFER_SIZE; i++) //打印3200个采样点
            {
                sprintf(buffer, "%u\n", adcBuffer[i]);
                printf("%s", buffer);
            }
            adcOk = false;
            g_adcBufferIndex = 0;
            timer->Start();
        }
    }
}

上位机:

    let mut reader = BufReader::new(port);
   
    loop {
        match collect_and_analyze(&mut reader) {
            Ok((frequency, amplitude)) => {
                if amplitude < 2800.0 {
                    print!("无     \r");
                } else {
                    print!("{}Hz\r", frequency);
                }
                std::io::Write::flush(&mut std::io::stdout()).unwrap();
            },
            Err(e) => {
                eprintln!("错误: {}", e);
                // 短暂等待后继续尝试
                std::thread::sleep(Duration::from_millis(500));
            }
        }
    }

......

    // 调整样本数量
    samples.truncate(fft_size);
   
    // 应用50Hz陷波滤波器
    apply_notch_filter(&mut samples);
   
    // 计算基频
    let (fundamental_freq, amplitude) = calculate_fundamental_frequency(&samples, fft_size)?;
 


功能展示图片
连接图:
image.png
上位机显示:
image.png


项目中遇到的难题和解决方法

难题:设计50Hz陷波滤波器以消除电源干扰。

解决方法:采用陷波滤波器,过滤50Hz成分。


对本活动的心得体会(包括意见或建议)

通过本项目,我深入理解了嵌入式系统与信号处理的结合。dsPIC33CK64MC105开发板的强大性能和DFR0052传感器的高灵敏度为项目提供了硬件支持,而C语言与Rust的协同开发提升了软件实现效率。解决技术难题的过程让我掌握了滤波器设计和频谱分析的技能,同时Rust的学习拓展了我的编程视野。

期待未来参与更多类似项目,继续探索嵌入式的潜力。

附件下载
mcu.X.zip
fft.zip
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号