STM32應用:透過SPI連結STM AIS3624DQ G-Sensor檢測加速度

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
{
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的驅動和工作所需的程式碼。

技術文檔

類型標題檔案
硬件Datasheet

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論