本文轉載自:http://www.jianshu.com/p/d471958189a0?nomobile=yesG
本文對G-sensor進行整理,先介紹G-sensor的一些基本概念,再具體講解BOSCH、ST、ADI三家的G-sensor,其中BOSCH的G-sensor重點講BMA222E,ST的G-sensor重點講LIS2DH12,ADI的G-sensor具體講ADXL362。
一、G-sensor概述
什么是MEMS
MEME(Micro-Electro-Mechanical System),微型電子機械系統,也叫微機電系統,是指可批量制作的,將微型機構、微型傳感器、微型執行器以及信號處理和控制電路、直至接口、通信和電源等於一體的微型器件或系統。可以把它理解為利用傳統的半導體工藝和材料,用微米技術在芯片上制造微型機械,並將其與對應電路集成為一個整體的技術。
MEMS傳感器的種類繁多,G-sensor是MEMS傳感器的一種。
什么是G-sensor
G-sensor(Gravity sensor),重力傳感器,又名加速度傳感器(accelerometer),是能感知加速度大小的MEMS傳感器。
G-sensor工作原理
如圖中的模型, 一個質量塊兩端通過彈簧進行固定。在沒有加速度的情況下,彈簧不會發生形變,質量塊靜止。當產生加速度時,彈簧發生形變,質量塊的位置會發生變化。 彈簧的形變量隨着加速度的增大而增大。在彈簧的勁度系統 k 和質量塊的質量 m已知的情況下,只要測量出彈簧的形變量,就可以求出系統的加速度。
G-sensor內部有 finger sets, 用來測量產生加速度讀時質量塊的位移。 每一個finger set 相當兩個電容極板, 當有加速度時質量塊會產生相對運動,而位移的變化會導致差分電容的變化。
當然,具體的差分電容檢測和計算加速度過程由G-sensor內部完成,我們只需要直接讀取其轉化后的值即可。G-sensor輸出值也不是直接的加速度值,它的計量單位是通常用g表示,1g代表一個重力加速度,即9.8m/s^2。1g=1000mg。
這里用一個例子再次強調一下G-sensor的輸出值是根據其內部質量塊的位移計算得出的:
將G-sensor的Z軸垂直向地,靜止放置在水平桌面上,此時G-sensor芯片是靜止的,雖然芯片整體加速度為0g,但是讀取其輸出值,X/Y軸輸出為0g,Z軸輸出為1g。因為內部質量塊在重力加速度的作用下,產生了位移。
G-sensor重要參數
-
測量范圍 Measurement Rang
測量范圍是傳感器可以支持的輸出加速度范圍,通常用±g 表示。這就是G-sensor可以測量並准確輸出的最大加速度。例如,一個測量范圍是±8g G-sensor,它的輸出一直到加速度達到±8g 時是線性的。 -
靈敏度 Sensitivity
靈敏度表示傳感器輸出隨加速度(輸入)變化的比例,它定義理想情況下加速度和傳感器輸出的直線關系。數字輸出的傳感器的靈敏度通常使用 LSB/g 或mg/LSB 表示。例如,一個靈敏度為4mg/LSB的G-sensor,若其Z軸輸出為100,則可計算出Z軸加速度為400mg。 -
0g偏移 0g-offset
0g 偏置表示在沒有加速度(零輸入)時輸出的測量值。模擬輸出的傳感器通常使用伏特或毫伏表示,數字輸出的傳感器使用碼字表示。
不同型號的G-sensor的 0g-offset 不同,同一型號的不同芯片的 0g-offset 也不同,甚至同一顆芯片中不同軸的 0g-offset 也不同,是否需要校正要視具體應用而定。如果應用中只關心加速度的相對變化,而不關心加速度的具體數值,則不需要校正。如果是關心加速度的具體數值,而所選器件的 0g-offset 又比較大,則必須要校正。
某些G-sensor本身有 offset 寄存器,這是只需要把待校准的軸沿水平方向靜止放置,測量其 0g 時的輸出,並把這個值乘以-1 寫入 offset 寄存器即可。如果G-sensor本身沒有 offset 寄存器,則需要用戶在自己的處理器中記錄這個數值,並在實際的測量結果中減去這個 offset。 -
輸出速率 ODR
ODR(Output Data Rate),表示G-sensor的輸出數據的刷新頻率。ODR越高,輸出數據更新越快,功耗越高。G-sensor的ODR往往都是可以配置的。
二、BOSCH的BMA222E
三、ST的LIS2DH12
LIS2DH12的功能和特色如下:
- I2C/SPI兩種通信接口
- 1Hz~5.3kHz的ODR可配置
- high-resolution/normal/low-power三種運行模式
high-resolution模式時輸出為12bits
normal模式時輸出為10bits
low-power模式時輸出為8bits; - 測量范圍 ±2g/±4g/±8g/±16g可選
- 兩個可配置的中斷資源INT1和INT2
- 內置溫度傳感器
- 內置FIFO
- 兩個中斷輸出引腳
- 6D/4D方向檢測 6D/4D orientation detection
- 自由落體檢測 Free-fall detection
- 動作檢測 Motion detection
- 單擊/雙擊識別 Click/double-click recognition
- 自動休眠/喚醒 Sleep-to-wake and return-to-sleep
其中6D/4D方向檢測、自由落體檢測和動作檢測並不是由獨立的單元實現的,這三種功能的實現都是通過對可配置中斷資源INT1和INT2進行設置后實現的。
單擊/雙擊識別和自動休眠/喚醒都是由獨立的單元實現的,其中單擊/雙擊識別有相應的中斷標志位,自動休眠/喚醒沒有標志位。
可配置中斷資源INT1和INT2
LIS2DH12提供了兩個可配置中斷資源INT1和INT2,這里針對INT1進行說明,INT2與INT1是相似的。
注意區分中斷資源的INT1/INT2和中斷輸出引腳的INT1/INT2,前者是G-sensor的內部中斷資源,后者是G-sensor的實際物理輸出引腳。
INT相關寄存器
INT1的寄存器包括配置寄存器INT1_CFG,狀態寄存器INT1_SRC,門限寄存器INT1_THS,持續時長寄存器INT1_DURATION。
- INT1_CFG
- INT1_SRC
INT1_SRC是只讀寄存器,讀取該寄存器將會清除IA位中斷。
- INT1_THS
根據所配置的測量范圍,1LSB代表不同的門限值。
- INT1_DURATION
INT中斷模式
INT1_CFG中AOI位和6D位決定了INT1的四種中斷模式:OR combination、AND combination、6-direction movement、6-direction position
OR combination和AND combinationOR combination和AND combination模式下,是將三軸數據的絕對值與threshold值進行比較。大於threshold時,將狀態寄存器INT1_SRC中XH(YH, ZH)置1,XL(YL, ZL)置0;小於threshold時,XH(YH, ZH)置0,XL(YL, ZL)置1。
OR combination模式時,任一使能了的事件發生,都將觸發INT1中斷。其應用場景之一就是wake-up檢測。AND combination模式時,所有使能的事件都發生,才能觸發INT1中斷。其應用場景之一就是free-fall檢測。6-direction movement和6-direction position6-direction movement和6-direction position模式下,是將三軸數據直接與threshold值進行比較。XH、YH、 ZH、XL、YL、 ZL的值反應了三軸數據與threshold的大小關系和其正負。
當三軸數據為正,且大於threshold時,XH(YH, ZH)將置為1;當三軸數據為負,且大於threshold時,XL(YL, ZL)將置為1。
6-direction movement模式下,器件從某個方向移向不同的已知方向時將觸發INT1中斷,中斷持續1/ODR。其應用場景是movement recognition。6-direction position模式下,器件穩定在已知的方向時將觸發INT1中斷,中斷持續直到方向改變。其應用場景是positions recognition。
wake-up檢測
wake-up事件,反映到加速度上,就是選定軸的任一軸的加速度值超過threshold。屬於OR combination事件。
參考配置如下:
1. Write A7h into CTRL_REG1 // Turn on the sensor and enable XYZ, ODR = 100 Hz 2. Write 00h into CTRL_REG2 // High-pass filter disabled 3. Write 40h into CTRL_REG3 // Interrupt driven to INT1 pad 4. Write 00h into CTRL_REG4 // FS = 2 g 5. Write 08h into CTRL_REG5 // Interrupt latched 6. Write 10h into INT1_THS // Threshold = 250 mg 7. Write 00h into INT1_DURATION // Duration = 0 8. Write 0Ah into INT1_CFG // Enable XH and YH interrupt generation 9. Poll INT1 pad; if INT1=0 then go to 8 // Poll RDY/INT pin waiting for the wake-up event 10 Read INT1_SRC // Return the event that has triggered the interrupt 11 (Wake-up event has occurred; insert your code here) // Event handling 12 Go to 8
自由落體檢測
free-fall事件,反映到加速度上,就是三軸加速度都都接近於0g。屬於AND combination事件。
參考配置如下:
1 Write A7h into CTRL_REG1 // Turn on the sensor, enable XYZ, ODR = 100 Hz 2 Write 00h into CTRL_REG2 // High-pass filter disabled 3 Write 40h into CTRL_REG3 // Interrupt driven to INT1 pad 4 Write 00h into CTRL_REG4 // FS = 2 g 5 Write 08h into CTRL_REG5 // Interrupt latched 6 Write 16h into INT1_THS // Set free-fall threshold = 350 mg 7 Write 03h into INT1_DURATION // Set minimum event duration 8 Write 95h into INT1_CFG // Configure free-fall recognition 9 Poll INT1 pad; if INT1 = 0 then go to 10 // Poll INT1 pin waiting for the free-fall event 10 (Free-fall event has occurred; insert your code here) // Event handling 11 Read INT1_SRC register // Clear interrupt request 12 Go to 9
單擊/雙擊識別
LIS2DH12可同時使能單擊檢測和雙擊檢測,但要注意,如果這樣設置,發生單擊事件時,SClick位會置為1,但是IA位不會置為1,也就不能觸發CLICK中斷;只有發生雙擊事件時,才能使IA位置1,觸發中斷,並且由於雙擊事件是滿足一定時序關系的兩個單擊事件,所以雙擊事件的第一擊會使得SClick置為1,這樣就還需要加上邏輯判斷才能確定沒有發生單擊事件。
綜上,單擊、雙擊檢測最好只使能一種。如果兩種都使能,當SClick置為1時,就還是需要加入額外的邏輯判斷來區別到底是一次單擊事件還是雙擊事件中的一擊。
單擊/雙擊識別的寄存器包括:配置寄存器CLICK_CFG,狀態寄存器CLICK_SRC,門限寄存器CLICK_THS,時序相關寄存器CLICK_LIMIT、CLICK_LATENCY和CLICK_TIMELIMIT。
- CLICK_CFG
- CLICK_SRC
- CLICK_THS
- TIME_LIMIT
- TIME_LATENCY
- TIME_WINDOW
自動休眠/喚醒
通過中斷資源INT1和INT2,可實現wake-up檢測,但是需要加入額外的邏輯處理。LIS2DH12直接提供了自動休眠、喚醒的功能。
當加速度小於設置的activation threshold時,器件自動切換到low-power模式。一旦加速度大於threshold,器件馬上自動切換到由CTRL_REG1的LPen位和CTRL_REG3的HR位配置的工作狀態。
自動休眠/喚醒功能的寄存器包括門限寄存器Act_THS和時長寄存器Act_DUR。
- Act_THS
- Act_DUR
