【Digikey得捷好物畅享】ADI EVAL-ADXL362Z STM32驱动移植与滤波实现
目的
将 ADXL362 三轴加速度传感器驱动从 STM32F1 移植到 STM32F411,通过 SPI 通信读取传感器数据,添加滑动平均滤波,并以浮点数格式通过串口输出。
硬件连接
使用 STM32F411 Nucleo 开发板与 EVAL-ADXL362Z 评估板连接:
- SPI1:PA5(SCK)、PA6(MISO)、PA7(MOSI)
- CS:PB6
- INT1/INT2:PC6/PC7
STM32CubeMX 配置
使用 STM32CubeMX 配置 SPI1,设置为 8 位数据宽度、极性低、第一边沿采样。
核心驱动代码
void ADXL362_Init(void)
{
ADXL362_CS_HIGH();
}
void ADXL362_Write_Byte(uint8_t reg, uint8_t data)
{
ADXL362_CS_LOW();
ADXL362_SPI_ReadWriteByte(ADXL362_WRITE_REG);
ADXL362_SPI_ReadWriteByte(reg);
ADXL362_SPI_ReadWriteByte(data);
ADXL362_CS_HIGH();
}
uint8_t ADXL362_Read_Byte(uint8_t reg)
{
uint8_t data;
ADXL362_CS_LOW();
ADXL362_SPI_ReadWriteByte(ADXL362_READ_REG);
ADXL362_SPI_ReadWriteByte(reg);
data = ADXL362_SPI_ReadWriteByte(0x00);
ADXL362_CS_HIGH();
return data;
}
滑动平均滤波实现
#define FILTER_WINDOW_SIZE 10
float Xg_buffer[FILTER_WINDOW_SIZE] = {0};
float Yg_buffer[FILTER_WINDOW_SIZE] = {0};
float Zg_buffer[FILTER_WINDOW_SIZE] = {0};
uint8_t filter_index = 0;
uint8_t filter_initialized = 0;
void MovingAverageFilter(float *buffer, float new_value)
{
buffer[filter_index] = new_value;
}
float GetFilteredValue(float *buffer)
{
float sum = 0.0f;
uint8_t i;
for (i = 0; i < FILTER_WINDOW_SIZE; i++)
{
sum += buffer[i];
}
return sum / FILTER_WINDOW_SIZE;
}
数据转换与输出
Xg = Xdata / 1000.0f;
Yg = Ydata / 1000.0f;
Zg = Zdata / 1000.0f;
MovingAverageFilter(Xg_buffer, Xg);
MovingAverageFilter(Yg_buffer, Yg);
MovingAverageFilter(Zg_buffer, Zg);
filter_index++;
if (filter_index >= FILTER_WINDOW_SIZE)
{
filter_index = 0;
filter_initialized = 1;
}
if (filter_initialized)
{
Xg_filtered = GetFilteredValue(Xg_buffer);
Yg_filtered = GetFilteredValue(Yg_buffer);
Zg_filtered = GetFilteredValue(Zg_buffer);
Avg = (Xg_filtered + Yg_filtered + Zg_filtered) / 3.0f;
UART_Printf("X:%.3fg\r\t\t", Xg_filtered);
UART_Printf("Y:%.3fg\r\t\t", Yg_filtered);
UART_Printf("Z:%.3fg\r\t\t", Zg_filtered);
}
结果展示

总结
本次移植过程顺利,ADXL362 功耗低、精度高,非常适合穿戴设备和物联网应用。添加的滑动平均滤波有效抑制了高频噪声,使数据更稳定可靠。滤波窗口大小可根据需要调整,平衡滤波效果和响应速度。感谢 Digikey 得捷提供的优质物料和活动支持!

