【Digikey得捷好物畅享】ADI EVAL-ADXL362Z STM32驱动移植与滤波实现

【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);
}

结果展示

5月13日

总结

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