您好,我在使用ADXL355,出现了以下情况,在静止状态下,Z轴出现了满量程的情况,无法正确显示波形,X轴处于竖直方向,Y轴的数据却比X轴大,是为什么呢?图中的纵坐标是转换后的电压值。
您好,我在使用ADXL355,出现了以下情况,在静止状态下,Z轴出现了满量程的情况,无法正确显示波形,X轴处于竖直方向,Y轴的数据却比X轴大,是为什么呢?图中的纵坐标是转换后的电压值。
使能一下自检,看功能正常不。
当然也很有可能是数据通讯接口的问题,多次读一下固定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, ®Value, 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中断信号是,是否会不一样?