【ADXL357Z高精度3轴加速度传感器模块】LabVIEW 数据采集

【ADXL357Z高精度3轴加速度传感器模块】LabVIEW 数据采集

本文介绍了 DigiKey 和 EEWorld 共同举办的 你晒单我买单 活动的所选物料 —— ADXL357Z 高精度 3 轴加速度传感器模块 通过 Arduino Library 库函数调用,实现三轴加速度数据的精确获取,并生成实时动态演化曲线,进一步通过 LabVIEW 上位机采集加速度数据的项目设计。

LabVIEW 数据采集

在实现 Arduino 库函数使用并实现串口数据获取的基础上,进一步结合 LabVIEW 上位机以及中断功能,实现三轴加速度数据的采集、演化曲线、数据保存等。

流程图

Arduino 代码执行流程

代码

新建 Arduino 工程,并添加如下代码

#include "Seeed_adxl357b.h"

#define CALI_BUF_LEN           15
#define CALI_INTERVAL_TIME     250
int32_t cali_buf[3][CALI_BUF_LEN];
int32_t cali_data[3];

float factory;

Adxl357b  adxl357b;

// Command detection variables
enum CommandState {
    WAIT_FOR_55,
    WAIT_FOR_AA,
    WAIT_FOR_CMD
};
CommandState cmdState = WAIT_FOR_55;
bool sendData = false;
char axisToSend = ' '; // 'X', 'Y', or 'Z'

int32_t deal_cali_buf(int32_t* buf) {
    int32_t cali_val = 0;
    for (int i = 0; i < CALI_BUF_LEN; i++) {
        cali_val += buf[i];
    }
    cali_val = cali_val / CALI_BUF_LEN;
    return (int32_t)cali_val;
}

void calibration(void) {
    int32_t x;
    SERIAL.println("Please Place the module horizontally!");
    delay(1000);
    SERIAL.println("Start calibration........");

    for (int i = 0; i < CALI_BUF_LEN; i++) {
        if (adxl357b.checkDataReady()) {
            if (adxl357b.readXYZAxisResultData(cali_buf[0][i], cali_buf[1][i], cali_buf[2][i])) {
            }
        }
        delay(CALI_INTERVAL_TIME);
    }
    for (int i = 0; i < 3; i++) {
        cali_data[i] =  deal_cali_buf(cali_buf[i]);
    }
    x = (((cali_data[2] - cali_data[0]) + (cali_data[2] - cali_data[1])) / 2);
    factory = 1.0 / (float)x;
    SERIAL.println("Calibration OK!!");
}

void setup(void) {
    uint8_t value = 0;
    float t;

    SERIAL.begin(115200);
    if (adxl357b.begin()) {
        SERIAL.println("Can't detect ADXL357B device .");
        while (1);
    }
    SERIAL.println("Init OK!");
    adxl357b.setAdxlRange(FOURTY_G);
    adxl357b.setPowerCtr(0);
    delay(100);
    adxl357b.readTemperature(t);

    SERIAL.print("Uncalibration temp = ");
    SERIAL.println(t);
    calibration();

    adxl357b.setActThreshold(0.5, factory);
    adxl357b.setIntPinMap(0x08);
    adxl357b.setActEnable(false, false, true);
}

void loop(void) {
    // Check for incoming serial data
    while (SERIAL.available() > 0) {
        uint8_t incomingByte = SERIAL.read();
        
        switch (cmdState) {
            case WAIT_FOR_55:
                if (incomingByte == 0x55) {
                    cmdState = WAIT_FOR_AA;
                }
                break;
                
            case WAIT_FOR_AA:
                if (incomingByte == 0xAA) {
                    cmdState = WAIT_FOR_CMD;
                } else {
                    cmdState = WAIT_FOR_55;
                }
                break;
                
            case WAIT_FOR_CMD:
                if (incomingByte == 0x10) {
                    axisToSend = 'X';
                    sendData = true;
                } else if (incomingByte == 0x11) {
                    axisToSend = 'Y';
                    sendData = true;
                } else if (incomingByte == 0xFF) {
                    axisToSend = 'Z';
                    sendData = true;
                }
                cmdState = WAIT_FOR_55;
                break;
        }
    }

    if (sendData) {
        int32_t x, y, z;
        if (adxl357b.checkDataReady()) {
            if (adxl357b.readXYZAxisResultData(x, y, z)) {
                SERIAL.println("Get data failed!");
            } else {
                switch (axisToSend) {
                    case 'X':
                        SERIAL.println(x * factory, 6);
                        break;
                    case 'Y':
                        SERIAL.println(y * factory, 6);
                        break;
                    case 'Z':
                        SERIAL.println(z * factory, 6);
                        break;
                }
            }
        }
        sendData = false;
    }

    delay(10); // Small delay to prevent CPU overload
}

保存代码,编译和上传至开发板,复位运行程序。

串口测试

  • 打开串口调试助手,配置串口参数,连接目标设备,打开串口;
  • 水平放置传感器模块,待提示校准完成;
  • 以十六进制发送 55 AA 1055 AA 1155 AA FF 分别获取 X、Y、Z 轴的加速度数据。

uart_test_labview

总结

本文介绍了 DigiKey 和 EEWorld 共同举办的 你晒单我买单 活动的所选物料 —— ADXL357Z 高精度 3 轴加速度传感器模块 通过 Arduino Library 库函数调用,实现三轴加速度数据的精确获取,并生成实时动态演化曲线,进一步通过 LabVIEW 上位机采集加速度数据的项目设计,为相关精密设备研发和高精度传感器的应用提供了参考。