AIS3624DQ为一款通过AEQ-100验证的车用G Sensor,特色是具有高达±24g的量测范围,12-bit解析度和高达1000Hz的更新率,工作温度范围为-40°C ~ 105°C。
以下是利用STM32 HAL library撰写的AIS3624DQ范例程式码,原则上可通用在STM32全系列的MCU。
先定义一组G Sensor structure
typedef struct{
uint8_t id;
uint16_t odr;
int16_t raw_x;
int16_t raw_y;
int16_t raw_z;
} GSENSORSTATUS_t;GSENSORSTATUS_t gsensorstatus;
// GSENSOR
#define READBIT (1 << 7)
#define MULTIBYTE (1 << 6)
读取Sensor ID,并将结果放到ID栏位,可以从比对Sensor ID来确认sensor是否接线正常。
// Read ID
SPITxData[0] = 0x0F | READBIT;
HAL_GPIO_WritePin(GSENSOR_CS_GPIO_Port, GSENSOR_CS_Pin, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1, SPITxData, SPIRxData, 2, 5000);
HAL_GPIO_WritePin(GSENSOR_CS_GPIO_Port, GSENSOR_CS_Pin, GPIO_PIN_SET);
gsensorstatus.id = SPIRxData[1];
设定Sensor,启动X, Y, Z三轴量测,100Hz更新率,并且开始工作。
// Power ON @ 100Hz ODR, XYZ axis enable
SPITxData[0] = 0x20;
SPITxData[1] = 0x2F;
HAL_GPIO_WritePin(GSENSOR_CS_GPIO_Port, GSENSOR_CS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, SPITxData, 2, 5000);
HAL_GPIO_WritePin(GSENSOR_CS_GPIO_Port, GSENSOR_CS_Pin, GPIO_PIN_SET);
gsensorstatus.odr = 100;
设定Sensor从INT1 pin脚输出DATA READY触发讯号,非必需。
// Set INT1 output DATA READY, Active Low Push-Pull
SPITxData[0] = 0x22;
SPITxData[1] = 0x82;
HAL_GPIO_WritePin(GSENSOR_CS_GPIO_Port, GSENSOR_CS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, SPITxData, 2, 5000);
HAL_GPIO_WritePin(GSENSOR_CS_GPIO_Port, GSENSOR_CS_Pin, GPIO_PIN_SET);
设定Sensor量测范围和工作模式,并且採用4线SPI和MCU沟通。
// Set full scale @ +-24G, continous update, 4-Wire
SPITxData[0] = 0x23;
SPITxData[1] = 0x30;
HAL_GPIO_WritePin(GSENSOR_CS_GPIO_Port, GSENSOR_CS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, SPITxData, 2, 5000);
HAL_GPIO_WritePin(GSENSOR_CS_GPIO_Port, GSENSOR_CS_Pin, GPIO_PIN_SET);
取得三轴量测值,并且换算为g值
// Get Data
GSENSOR_SPITxData[0] = 0x28 | READBIT | MULTIBYTE;
HAL_GPIO_WritePin(GSENSOR_CS_GPIO_Port, GSENSOR_CS_Pin, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1, GSENSOR_SPITxData, GSENSOR_SPIRxData, 7, 1000);
HAL_GPIO_WritePin(GSENSOR_CS_GPIO_Port, GSENSOR_CS_Pin, GPIO_PIN_SET);
gsensorstatus.raw_x = (int16_t)((GSENSOR_SPIRxData[2] << 8) | GSENSOR_SPIRxData[1]) / 16;
gsensorstatus.raw_y = (int16_t)((GSENSOR_SPIRxData[4] << 8) | GSENSOR_SPIRxData[3]) / 16;
gsensorstatus.raw_z = (int16_t)((GSENSOR_SPIRxData[6] << 8) | GSENSOR_SPIRxData[5]) / 16;
runtime_data.GX = gsensorstatus.raw_x * 11.7f;
runtime_data.GY = gsensorstatus.raw_y * 11.7f;
runtime_data.GZ = gsensorstatus.raw_z * 11.7f;
其中换算参数根据datasheet,得知在设定为±24g时,读取得到数字,需要再乘上11.7,才是mg值,故上面的程式码将得到的三轴RAW data乘上11.7转为mg
以上既完成了AIS3624DQ的驱动和工作所需的程式码。