在Digikey上看到ADI的ADXL357加速度计评估板,低噪声、最高4000Hz采样率、
20位分辨率,非常适合做电机振动监测,果断下单。
一、项目目标:
用STM32F407通过SPI采集ADXL357数据,后续配合CMSIS-DSP做FFT频域分析,最终用NanoEdgeAI实现电机堵转识别。本文先打通驱动层。
二、硬件连线与避坑:
SPI接线很简洁:PA4作软件片选、PA5-SCK、PA6-MISO、PA7-MOSI,再加3.3V和GND。CubeMX中SPI1配置为:Full-Duplex-Master、CPOL=0/CPHA=0、MSB First、8bit帧格式,时钟2.6Mbps左右即可。
有一个容易踩的坑:评估板P2排针上的V1p8ana和V1p8dig是芯片内部LDO输出的1.8V,千万不要外接电源。只需给VDD和VDDIO供3.3V,这两个脚悬空就好。接反了可能烧芯片。
三、驱动ADXL357
ADXL357每轴数据为20位二进制补码、左对齐,分3个字节存放。读取时连续拉9字节(X/Y/Z各3字节),拼出真实加速度值。
最早我采用“采集1024点->printf打印”方案,发现波形突变不顺滑。分析后找到根因:1024行ASCII浮点数约32KB,串口发送需要356ms,而ADXL357内部FIFO只够缓冲128ms的数据,所以每次printf期间FIFO溢出2-3次,过渡数据全部丢失。
所以我的解决方案是------Ping-Pong DMA架构:
1.放弃ASCII的printf,改用VOFA+的JustFloat协议------每个浮点数直接发4字节原始二进制,一帧仅16KB,传输量减少一半 。
2.每4个float后插入0x7F800000作为帧分隔符,VOFA+自动识别帧边 界。
3.开辟两份1024×4浮点的Ping-Pong缓冲区,CPU填充Buffer A时,DMA在后台发送Buffer B。
4. DMA发送16KB仅需178ms,采集1024点需256ms。DMA总在下一帧满之前完成发送------实现了真正的4000Hz连续无丢帧采集。
关键代码:
四、上位机查看波形:
用VOFA+上位机查看波形。将传感器在桌面90度翻转,能看到X/Y/Z轴交替跳变到1g附近的波形,在平放传感器的时候数据无波动:
五、开发心得:
这次驱动开发最大的收获是:高速传感器不能按“来一个数据、处理一个数据”的模式写代码。串口打印、格式化字符串这些看似无害的操作,在毫秒级采样面前都会成为瓶颈。所以更要关注数据的整体吞吐能力。

