Post Go back to editing

ADXL355的XYZ轴输出不正确

您好,我在使用ADXL355,出现了以下情况,在静止状态下,Z轴出现了满量程的情况,无法正确显示波形,X轴处于竖直方向,Y轴的数据却比X轴大,是为什么呢?图中的纵坐标是转换后的电压值。

Parents
  • 使能一下自检,看功能正常不。

    当然也很有可能是数据通讯接口的问题,多次读一下固定ID寄存器,能读到正确值再说。

  • 您好!感谢您的解答,我对您提出的问题做了测试。

    1. 我已经使能自检,但我怎么判断功能是否正常呢?

    2. 我多次读取ID寄存器,结果都与datasheet中相同。

    其中Z轴我无论摆在什么方向,结果都是如图所示。请问还有什么别的什么测试手段。

  • 数据手册明确说明了自检的输出,看对不对的上。

    先确认下这一点吧,自检如果不正确,重新上电能否恢复,否则有可能损坏了,有没有什么大冲击或过应力事件?

  • 这个问题已经解决,目前还有一个问题,就是我想把DRDY信号映射到INT1上,我已经通过写寄存器,配置成这种模式,但是INT1引脚上并没有相应的中断信号,DRDY引脚上有中断信号,这是为什么呢?感谢您的回答。

  • 确认写进去了吗,写完读一下确认下。

    自己对照数据手册的描述仔细检查一下吧,您的大部分问题通过检查数据手册都能得到答案

  • 您好,我确定写进去了,我写进去之后,然后再吧相应寄存器的值读出来,是我预设的值,我也按照手册要求读取数据之后读取状态寄存器,以清除中断。但INT1上还是没生成中断信号

  • 我看您写了哪几个寄存器,另外注意DRDY上的这个信号是一直存在的,和您配置其他的中断无关。

  • #include "mems.h"
    #include "stdint.h"
    #include "eq206.h"
    #include "stdint.h"
    #include "stdio.h"
    #include "stm32f4xx_hal.h"


    /*读单个寄存器的函数*/
    uint8_t ReadOneRegister(uint8_t regAddress)
    {
    // 选择芯片
    HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_RESET);

    // 发送读取命令
    uint8_t command = 0x01 | (regAddress << 1); // 根据芯片SPI协议设置
    HAL_SPI_Transmit(&hspi1, &command, 1, HAL_MAX_DELAY);

    // 读取寄存器值
    uint8_t regValue;
    HAL_SPI_Receive(&hspi1, &regValue, 1, HAL_MAX_DELAY);

    // 取消芯片选择 (拉高CS引脚)
    HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_SET);

    return regValue;
    }


    /*写函数*/
    void WriteOneRegister(uint8_t regAddress, uint8_t data) {
    // 选择从设备
    HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_RESET); // 根据具体情况配置 CS 引脚

    // 发送写寄存器的命令,根据具体芯片的协议进行调整
    uint8_t command = 0x00 | (regAddress << 1); // 示例命令,具体根据芯片手册修改
    HAL_SPI_Transmit(&hspi1, &command, 1, HAL_MAX_DELAY);

    // 发送要写入的数据
    HAL_SPI_Transmit(&hspi1, &data, 1, HAL_MAX_DELAY);

    // 取消从设备选择
    HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_SET);
    }


    /*设置采样率ODR*/
    void MEMS_ODRMode(void)
    {
    uint8_t ctrl1;
    uint8_t temp;
    ctrl1 = (uint8_t)ReadOneRegister(ADXL355_FILTER); //读取CTRL1的原数据
    printf("CTRL1 is %d\n",ctrl1);
    temp = (ctrl1) | (0x04);

    WriteOneRegister(ADXL355_FILTER, temp);
    uint8_t ctrl11 = (uint8_t)ReadOneRegister(ADXL355_FILTER); //读取CTRL1的原数据
    printf("CTRL1 now is %d\n",ctrl11);
    }


    /*电源控制配置*/
    void MEMS_Startup(void){
    WriteOneRegister(ADXL355_POWER_CTL, 0x00);
    }

    /*量程配置*/
    void MEMS_Range(void){
    uint8_t ctrl2;
    uint8_t temp;
    ctrl2 = (uint8_t)ReadOneRegister(ADXL355_RANGE); //读取CTRL1的原数据
    printf("CTRL2 is %d\n",ctrl2);
    temp = (ctrl2) | (0x03);

    WriteOneRegister(ADXL355_RANGE, temp);
    uint8_t ctrl21 = (uint8_t)ReadOneRegister(ADXL355_RANGE); //读取CTRL1的原数据
    printf("CTRL2 now is %d\n",ctrl21);
    }

    /*配置自检功能*/
    void self_test(void){
    WriteOneRegister(ADXL355_SELF_TEST, 0x03);
    }

    /*将DRDY映射到INT1功能*/
    void DRDY_INT1(void){
    uint8_t temp;
    uint8_t ctrl3 = (uint8_t)ReadOneRegister(ADXL355_INT_MAP);
    printf("CTRL3 is %d\n",ctrl3);
    temp = (ctrl3) | (0x01);
    WriteOneRegister(ADXL355_INT_MAP, temp);
    uint8_t ctrl31 = (uint8_t)ReadOneRegister(ADXL355_INT_MAP); //读取CTRL1的原数据
    printf("CTRL3 now is %d\n",ctrl31);
    }


    //读取状态寄存器
    void Read_Status(void){
    ReadOneRegister(ADXL355_STATUS);
    }

    void SYNC(void){
    WriteOneRegister(ADXL355_SYNC, 0x02);
    }

    void MEMS_Init(void)
    {
    for(int i=0; i < 10; i++){
    MEMS_ODRMode();
    MEMS_Range();
    //self_test();
    //SYNC();
    DRDY_INT1();
    MEMS_Startup();

    }
    for(int j=0; j<100; j++){
    int deviceid = ReadOneRegister(ADXL355_DEVID_AD);
    printf("DEVID now is %d\n",deviceid);
    }
    }

    您好,这是我的完整配置代码。控制了采样率,量程,以及INT控制寄存器

  • 确认0x2a寄存器配置了就好。现在INT1一直是低电平?尝试更改下配置,其他的中断和INT2的表现是否正常。

  • 您好!INT1一直是低电平。我把DRDY信号映射到INT2上也是只有低电平。其他的中断我不太方便验证,但我粗略地验证了一下,也是没有产生中断。我还有一个问题,直接从DRDY引脚中得到的中断信号,和通过INT1映射得到的data ready中断信号是,是否会不一样?

  • 一样的,DRDY也是数据输出中断。

Reply Children
No Data