成品展示
系统硬件主要由 dsPIC33CK64MC105 开发板、振动传感器和信号硬件电路组成。振动传感器选用压电式加速度传感器,能够将机械振动转换为电信号。
开发板与传感器通过杜邦线进行连接,开发板通过数据线连接电脑(图中未连接),通过电脑提供电源。传感器为图中圆形的金色铁片。
项目介绍
振动频率测量在工业设备监测、材料分析和故障诊断中具有重要意义。本项目旨在使用 dsPIC33CK64MC105 Curiosity Nano 开发板结合振动传感器,开发一个高精度振动频率测量系统。该系统通过采集振动信号并进行频谱分析,能够快速准确地确定物体的固有频率,为结构健康监测提供数据支持。
dsPIC33CK64MC105 开发板内置 12 位 ADC 和高速比较器,为信号采集提供了良好的硬件基础。ADC 负责将模拟振动信号转换为数字信号,而高速比较器则用于检测信号的过零点,为频率计算提供关键触发点。
软件开发
软件流程图
软件开发基于 Microchip MPLAB X IDE 平台,使用 C 语言进行编程。系统软件主要包括以下几个模块:
- ADC 采样模块:配置 ADC 参数,实现对振动信号的高速采样。
- 比较器模块:设置高速比较器,检测信号过零点,生成中断触发。
- 频率计算模块:基于过零点检测结果,计算振动信号的频率。
- 数据处理模块:对采集到的振动数据进行滤波和频谱分析。
下面是 核心代码:
//头文件引用:
#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开发板非常好用,开发还是比较简单,容易上手,初始化配置之类的代码可以通过一两句代码基本就能完成配置,对新手比较友好,同时也非常感谢官方给我这次机会能够体验到这款开发板。