介紹
本文檔是使用博世傳感器技術公司的BMA400加速度計設計的參考指南。
共同特性
特性概覽見下表:
關鍵特性
- LGA封裝(12引腳),尺寸2mm x 2mm x 0.95mm
- 超低功耗:正常模式下3.5μA@800Hz至14μA@800Hz(可配置)
- 低功耗模式下0.8μA@25Hz至1.2μA@25Hz(可配置)
- 抗混疊:正常模式下連續採樣(無工作周期)
- 可配置的加速度範圍 ±2g/±4g/±8g/±16g
- 可配置的輸出數據率:12.5Hz至800Hz(正常模式)
- 1KB FIFO
- 自動低功耗/自動喚醒
- 活動/非活動檢測
- 計步器(整體設備電流消耗4μA)
- 活動識別(步行、跑步、靜止站立)
- 方向檢測
- 輕敲/雙擊
- 自由落體檢測
- 可穿戴設備、定位
產品差異
BMA400是博世傳感器技術中唯一具有超低功耗特性的產品。關鍵參數列在下表中。
參考設計
見下圖,典型用例的完整原理圖:
- 強烈推薦使用SPI,因為其低電流消耗。如果應用I2C接口,上拉電阻將消耗比BMA400超低功耗更多的電流。
- MCU的VDDIO和BMA400應該連接到相同的電源。
- 如果MCU的GPIO1和GPIO2連接到BMA400的INT1/INT2,則應配置為輸入。
- 如果使用I2C接口(即使不推薦),將CSB連接到VDDIO以防止CSB引腳上的不必要電平跳變,這可能會在ESD測試期間使BMA400從I2C模式切換到SPI模式。

布局建議
由於BMA400傳感器家族包含封裝內微小的機械結構,在布局階段必須小心,以確保最佳性能。完整的處理和焊接指南可以在博世傳感器技術公司的網站上找到。
以下是BMA400加速度計的典型PCB Layout:

- 傳感器下方無通孔。
- 在頂層,傳感器安裝的位置下方無銅;而在雙層PCB的第二層(底層),歡迎使用地線銅以防止電磁干擾。
- 走線應向外扇出,不在傳感器內部。
- 在傳感器區域,第二層(雙層PCB的底層)上沒有走線;當第二層有地線銅時,走線可以在第三層(和第四/五層...)上;但要將高頻或大電流信號遠離傳感器區域,從上到下。
製造注意事項


首次上電
首次為傳感器供電後,初始規格將測試與設備的通信。這可以通過簡單地讀取寄存器0x00中的Chip_id來完成,預期讀值為0X90。為了正確初始化設備,用戶必須在硬體設計期間決定使用哪種接口(I2C或SPI)。上電後,BMA400默認為I2C模式,直到在CSB引腳上檢測到上升沿,然後BMA400將切換到SPI模式,直到下次軟復位或上電復位。因此,一旦BMA400連接到SPI接口的主機,首先應在CSB引腳上觸發上升沿,這可以通過讀取CHIPID寄存器來實現。對於I2C連接,將CSB引腳直接或通過電阻拉到VDDIO將防止BMA400在運行或ESD期間切換到SPI模式。對於SPI讀取,從BMA400接收到的第一個字節始終是一個虛擬字節,應該跳過。有價值信息從第二字節開始。以下是使用COINES軟體作為主機執行CHIPID讀取的一些示例代碼。
* @brief This internal API is used to initializes the bma400 sensor with default* settings like power mode and OSRS settings
*
* @param[in] void
*
* @return void
*
*/
static void init_bma400(void)
{
int8_t rslt;
rslt = bma400_init(&bma400dev);
if (rslt == BMA400_OK)
{
printf("BMA400 Initialization Success!\n");
printf("Chip ID 0x%x\n", bma400dev.chip_id);
}
else
{
print_rslt(rslt);
exit(COINES_E_FAILURE);
}
coines_delay_msec(100);
}
/********************** Global function definitions ************************/
/*!
* @brief This API is the entry point, Call this API before using other APIs.
* This API reads the chip-id of the sensor which is the first step to
* verify the sensor and updates the trim parameters of the sensor.
*/
int8_t bma400_init(struct bma400_dev *dev)
{
int8_t rslt;
uint8_t chip_id = 0;
/* Check for null pointer in the device structure*/
rslt = null_ptr_check(dev);
/* Proceed if null check is fine */
if (rslt == BMA400_OK) {
/* Initial power-up time */
dev->delay_ms(5);
/* Assigning dummy byte value */
if (dev->intf == BMA400_SPI_INTF) {
/* Dummy Byte availability */
dev->dummy_byte = 1;
/* Dummy read of Chip-ID in SPI mode */
rslt = bma400_get_regs(BMA400_CHIP_ID_ADDR, &chip_id, 1, dev);
} else {
dev->dummy_byte = 0;
}
if (rslt == BMA400_OK) {
/* Chip ID of the sensor is read */
rslt = bma400_get_regs(BMA400_CHIP_ID_ADDR, &chip_id, 1, dev);
/* Proceed if everything is fine until now */
if (rslt == BMA400_OK) {
/* Check for chip id validity */
if (chip_id == BMA400_CHIP_ID) {
/* Store the chip ID in dev structure */
dev->chip_id = chip_id;
} else {
rslt = BMA400_E_DEV_NOT_FOUND;
}
}
}
}
return rslt;
}
評論