AIS3624DQ為一款通過AEQ-100驗證的車用G Sensor,特色是具有高達±24g的量測範圍,12-bit解析度和高達1000Hz的更新率,工作溫度範圍為-40°C ~ 105°C。
以下是利用STM32 HAL library撰寫的AIS3624DQ範例程式碼,原則上可通用在STM32全系列的MCU。
大大购相关商品 STEVAL-MKI158V1 >>查询存货及售价
先定義一組G Sensor structure
typedef struct
{
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;
以下是利用STM32 HAL library撰寫的AIS3624DQ範例程式碼,原則上可通用在STM32全系列的MCU。
大大购相关商品 STEVAL-MKI158V1 >>查询存货及售价
先定義一組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的驅動和工作所需的程式碼。
評論