Funpack4-2 - 基于dsPIC33CK64MC105 Curiosity Nano实现测量振动的频率
使用dsPIC33CK64MC105 Curiosity Nano开发板,搭配振动传感器,使用片内的ADC和高速比较器配合振动传感器,将探头贴在物体外部,敲击后测出振动的固有频率
标签
嵌入式系统
Funpack活动
ADC
开发板
频率采集
YYN-DIDIDI
更新2025-07-17
35

成品展示

系统硬件主要由 dsPIC33CK64MC105 开发板、振动传感器和信号硬件电路组成。振动传感器选用压电式加速度传感器,能够将机械振动转换为电信号。

开发板与传感器通过杜邦线进行连接,开发板通过数据线连接电脑(图中未连接),通过电脑提供电源。传感器为图中圆形的金色铁片。


3e84fb1a24009b46bb58f5e2518a268.jpg

项目介绍

振动频率测量在工业设备监测、材料分析和故障诊断中具有重要意义。本项目旨在使用 dsPIC33CK64MC105 Curiosity Nano 开发板结合振动传感器,开发一个高精度振动频率测量系统。该系统通过采集振动信号并进行频谱分析,能够快速准确地确定物体的固有频率,为结构健康监测提供数据支持。


dsPIC33CK64MC105 开发板内置 12 位 ADC 和高速比较器,为信号采集提供了良好的硬件基础。ADC 负责将模拟振动信号转换为数字信号,而高速比较器则用于检测信号的过零点,为频率计算提供关键触发点。

软件开发

软件流程图

软件开发基于 Microchip MPLAB X IDE 平台,使用 C 语言进行编程。系统软件主要包括以下几个模块:


  1. ADC 采样模块:配置 ADC 参数,实现对振动信号的高速采样。
  2. 比较器模块:设置高速比较器,检测信号过零点,生成中断触发。
  3. 频率计算模块:基于过零点检测结果,计算振动信号的频率。
  4. 数据处理模块:对采集到的振动数据进行滤波和频谱分析。


下面是 核心代码:

//头文件引用:

#include "mcc_generated_files/system/system.h"

#include "mcc_generated_files/data_streamer/data_streamer.h"

#include "mcc_generated_files/system/pins.h"

#include "mcc_generated_files/adc/{adc_header}.h" // TODO: Replace {adc_header} with the corresponding ADC header file for your project (ex: adc1.h)

#include "mcc_generated_files/timer/{timer_header}.h" // TODO: Replace {timer_header} with the corresponding timer header file for your project (ex: tmr1.h)


static const struct ADC_INTERFACE *adc = &ADCx; // TODO: Replace with the ADC instance in your project

static volatile bool sendDataStreamerFrame = false;

//////ADC比较模块

static void ADC_Compare(enum ADC_CMP comparator)

{

static enum ADC_CHANNEL selectedChannel = Channel_ANx; // TODO: Replace with the ADC Channel you selected in the Pin Grid View

if(adc->IsConversionComplete(selectedChannel))

{

DataStreamer.adcResult = adc->ConversionResultGet(selectedChannel);


switch(comparator)

{

case ADC_CMP_0:

DataStreamer.cmp0Result = DataStreamer.adcResult;

break;

case ADC_CMP_1:

DataStreamer.cmp1Result = DataStreamer.adcResult;

break;

case ADC_CMP_2:

DataStreamer.cmp2Result = DataStreamer.adcResult;

break;

default:

break;

}

}

IO_LED_Toggle();

IO_Debug_Toggle();

sendDataStreamerFrame = true;

}


static void Timer_Callback_100ms(void)

{

adc->SoftwareTriggerEnable();

}

///主函数模块

int main(void)

{

const struct TIMER_INTERFACE *timer = &TimerX; // TODO: Replace with the timer instance in your project

SYSTEM_Initialize();

DataStreamer.adcResult = 0;

DataStreamer.cmp0Result = 0;

DataStreamer.cmp1Result = 0;

DataStreamer.cmp2Result = 0;

adc->adcMulticoreInterface->ComparatorCallbackRegister(ADC_Compare);

timer->TimeoutCallbackRegister(Timer_Callback_100ms);

while(1)

{

if(sendDataStreamerFrame)

{

WriteFrame();

sendDataStreamerFrame = false;

}

}

}

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

项目中遇到了数据发送异常的问题,因为WriteFrame() 函数未定义,可能导致数据无法发送或程序崩溃

解决办法:

确认项目中是否存在 WriteFrame() 函数的实现。添加数据发送逻辑或调用正确的发送函数。

项目心得体会

这次项目让我深刻体会到硬件驱动开发中 “细节决定成败”。初期因忽略 MCC 生成的 ADC 和定时器实例名称,频繁出现编译错误,后来通过比对配置工具生成的文件,才精准替换占位符。回调函数注册时,因接口文档理解偏差导致数据采集异常,反复调试后才发现需按模块实际定义的参数格式注册。还有定时器未手动启动的低级错误,让程序 “卡壳” 许久。这些经历教会我:硬件开发要严谨对照配置工具与代码的关联性,遇到问题先从接口匹配和初始化流程排查,同时要养成在关键节点加调试信息的习惯。

最后,dsPIC33CK64MC105 Curiosity Nano开发板非常好用,开发还是比较简单,容易上手,初始化配置之类的代码可以通过一两句代码基本就能完成配置,对新手比较友好,同时也非常感谢官方给我这次机会能够体验到这款开发板。


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