日韩成人激情_欧美黑人xxx_国产一区二精品区在线_精品在线一区_97成人资源_久久久久久一区

產品分類

當前位置: 首頁 > 傳感測量產品 > 工業傳感器 > 加速度傳感器

類型分類:
科普知識
數據分類:
加速度傳感器

三軸加速度傳感器在跌倒檢測中的應用

發布日期:2022-10-09 點擊率:93

前言

人們在跌倒后會面臨雙重危險。顯而易見的是跌倒本身可能對人體產生傷害;另外,如果跌倒后不能得到及時的救助,可能會使結果更加惡化。例如,許多老年人由于其身體比較虛弱,自理能力和自我保護能力下降,常常會發生意外跌倒,如果得不到及時的救助,這種跌倒可能會導致非常嚴重的后果。有資料顯示,很多嚴重的后果并不是由于跌倒直接造成的,而是由于跌倒后,未得到及時的處理和救護。當出現跌倒情況時,如果能夠及時地通知到救助人員,將會大大地減輕由于跌倒而造成的危害。

不僅是對老人,在很多其他情況下,跌倒的報警也是非常有幫助的,尤其是從比較高的地方跌倒下來的時候。比如人們在登山,建筑,擦窗戶,刷油漆和修理屋頂的時候。

這促使人們越來越熱衷于對跌倒檢測以及跌倒預報儀器的研制。近年來,隨著iMEMS?加速度傳感器技術的發展,使得設計基于三軸加速度傳感器的跌倒檢測器成為可能。這種跌倒檢測器的基本原理是通過測量佩戴該儀器的個體在運動過程中的三個正交方向的加速度變化來感知其身體姿態的變化,并通過算法分析判斷該個體是否發生跌倒情況。當個體發生跌倒時,儀器能夠配合GPS模塊以及無線發送模塊對這一情況進行定位及報警,以便獲得相應的救助。而跌倒檢測器的核心部分就是判斷跌倒情況是否發生的檢測原理及算法。

ADXL3451是ADI公司的一款3軸、數字輸出的加速度傳感器。本文將在研究跌倒檢測原理的基礎上,提出一種基于ADXL345的新型跌倒檢測解決方案。

iMEMS加速度傳感器ADXL345

iMEMS 半導體技術把微型機械結構與電子電路集成在同一顆芯片上。iMEMS加速度傳感器就是利用這種技術,實現對單軸、雙軸甚至三軸加速度進行測量并產生模擬或數字輸出的傳感器。根據不同的應用,加速度傳感器的測量范圍從幾g到幾十g不等。數字輸出的加速度傳感器還會集成多種中斷模式。這些特性可以為用戶提供更加方便靈活的解決方案。

ADXL345是ADI公司最近推出的基于iMEMS技術的3軸、數字輸出加速度傳感器。ADXL345具有+/-2g,+/-4g,+/-8g,+/-16g可變的測量范圍;最高13bit分辨率;固定的4mg/LSB靈敏度;3mm*5mm*1mm超小封裝;40-145uA超低功耗;標準的I2C或SPI數字接口;32級FIFO存儲;以及內部多種運動狀態檢測和靈活的中斷方式等特性。所有這些特性,使得ADXL345有助于大大簡化跌倒檢測算法,使其成為一款非常適合用于跌倒檢測器應用的加速度傳感器。

本文給出的跌倒檢測解決方案,完全基于ADXL345內部的運動狀態檢測功能和中斷功能,甚至不需要對加速度的具體數值進行實時讀取和復雜的計算操作,可以使算法的復雜度降至最低。

中斷系統

圖1給出了ADXL345的系統框圖及管腳定義。


圖1 ADXL345系統框圖及管腳定義

ADXL345具有兩個可編程的中斷管腳:Int1和Int2。以及Data_Ready、Single_Tap、Double_Tap、Activity、Inactivity、Free_Fall、Watermark、Overrun,共計8個中斷源。每個中斷源可以獨立地使能或禁用,還可以靈活地選擇是否映射到Int1或Int2中斷管腳。所有的功能都可以同時使用,只是某些功能可能需要共用中斷管腳。中斷功能通過INT_ENABLE寄存器的相應位來選擇使能或禁用,通過INT_MAP寄存器的相應位來選擇映射到Int1管腳或Int2管腳。中斷功能的具體定義如下:

1. Data_Ready 當有新的數據產生時,Data_Ready中斷置位;當沒有新的數據時,Data_Ready中斷清除。

2. Single_Tap 當加速度值超過一定門限(THRESH_TAP)并且持續時間小于一定時間范圍(DUR)的時候,Single_Tap中斷置位。

3. Double_Tap 當第一次Single_Tap事件發生后,在一定時間(LATENT)之后,并在一定時間(WINDOW)之內,又發生第二次Single_Tap事件時,Double _Tap中斷置位。

圖2給出了有效的Single_Tap中斷和Double _Tap中斷的示意圖。


圖2 Single_Tap和Double _Tap中斷示意

4. Activity 當加速度值超過一定門限(THRESH_ACT)時,Activity中斷置位。

5. Inactivity 當加速度值低于一定門限(THRESH_INACT)并且持續超過一定時間(TIME_INACT)時,Inactivity中斷置位。TIME_INACT可以設定的最長時間為255s。

需要指出的是,對于Activity和Inactivity中斷,用戶可以針對X、Y、Z軸來分別進行使能或禁用。比如,可以只使能X軸的Activity中斷,而禁用Y軸和Z軸的Activity中斷。

另外,對于Activity和Inactivity中斷,用戶還可以自由選擇DC coupled工作方式或者AC coupled工作方式。其區別在于,DC coupled工作方式下,每個采樣點的加速度值將直接與門限(THRESH_ACT或THRESH_INACT)進行比較,來判斷是否發生中斷;而AC coupled工作方式下,新的采樣點將以之前的某個采樣點為參考,用兩個采樣點的差值與門限(THRESH_ACT或THRESH_INACT)進行比較,來判斷是否發生中斷。AC coupled工作方式下的Activity檢測,是選擇檢測開始時的那一個采樣點作為參考,以后每個采樣點的加速度值都與參考點進行比較。如果它們的差值超過門限(THRESH_ACT),則Activity中斷置位。AC coupled工作方式下的Inctivity檢測,同樣要選擇一個參考點。如果新采樣點與參考點的加速度差值超過門限(THRESH_INACT),參考點會被該采樣點更新。如果新采樣點與參考點的加速度差值小于門限(THRESH_INACT),并且持續超過一定時間(TIME_INACT),則Inctivity置位。

6. Free_Fall 當加速度值低于一定門限(THRESH_FF)并且持續超過一定時間(TIME_FF)時,Free_Fall中斷置位。與Inactivity中斷的區別在于,Free_Fall中斷主要用于對自由落體運動的檢測。因此, X、Y、Z軸總是同時被使能或禁用;其時間設定也比Inactivity中斷中要小很多,TIME_FF可以設定的最大值為1.28s;而且Free_Fall中斷只能是DC coupled工作方式。

7. Watermark 當FIFO里所存的采樣點超過一定點數(SAMPLES)時,Watermark中斷置位。當FIFO里的采樣點被讀取,使得其中保存的采樣點數小于該數值(SAMPLES)時,Watermark中斷自動清除。

需要指出的是,ADXL345的FIFO最多可以存儲32個采樣點(X、Y、Z三軸數值),且具有Bypass模式、普通FIFO模式、Stream模式和Trigger模式,一共4種工作模式。FIFO功能也是ADXL345的一個重要且十分有用的功能。但是本文后面給出的解決方案中,并沒有使用到FIFO功能,所以,在此不做詳細介紹。

8. Overrun 當有新采樣點更新了未被讀取得前次采樣點時,Overrun中斷置位。 Overrun功能與FIFO的工作模式有關,當FIFO工作在Bypass模式下,如果有新采樣點更新了DATAX、DATAY和DATAZ寄存器里的數值,則Overrun中斷置位。當FIFO工作在其他三種模式下,只有FIFO被存滿32點時,Overrun中斷才會置位。FIFO里的采樣點被讀取后,Overrun中斷自動清除。

跌倒過程中的加速度變化特征

對跌倒檢測原理的研究主要是找到人體在跌倒過程中的加速度變化特征。

圖3給出的是加速度在不同運動過程中的變化曲線,包括(a)步行上樓、(b)步行下樓、(c)坐下、(d)起立。假設跌倒檢測器被固定在被測的人體上。其中紅色的曲線是Y軸(垂直方向)的加速度曲線,其正常靜止狀態下應該為-1g;黑色和黃色的曲線分別是X軸(前后方向)和Z軸(左右方向)的加速度曲線,其正常靜止狀態下應該為0g;綠色的曲線是三軸加速度的矢量和,其正常靜止狀態下應該為+1g。


圖3 不同運動過程中的加速度變化曲線

由于老年人的運動相對比較慢,所以在普通的步行過程中,加速度變化不會很大。最明顯的加速度變化就是在坐下動作中Y軸加速度(和加速度矢量和)上有一個超過3g的尖峰,這個尖峰是由于身體與椅子接觸而產生的。

而跌倒過程中的加速度變化則完全不同。圖4給出的是意外跌倒過程中的加速度變化曲線。通過圖4和圖3的比較,可以發現跌倒過程中的加速度變化有4個主要特征,這可以作為跌倒檢測的準則。這4個特這在圖4中以紅色的方框標注,下面將對其逐一進行詳細介紹。


圖4 跌倒過程中的加速度變化曲線

1. 失重:在跌倒的開始都會發生一定的失重現象。在自由落體的下降過程,這個現象會更加明顯,加速度的矢量和會降低到接近0g,持續時間與自由落體的高度有關。對于一般的跌倒,失重現象雖然不會有像自由落體那么明顯,但也會發生合加速度小于1g的情況(通常情況下合加速度應大于1g)。因此,這可以作為跌倒狀態的第一個判斷依據。可以由ADXL345的Free_Fall中斷來檢測。

2. 撞擊:失重之后,人體發生跌倒的時候會與地面或其他物體發生撞擊,在加速度曲線中會產生一個很大的沖擊。這個沖擊可以通過ADXL345的Activity中斷來檢測。因此,Free_Fall中斷之后,緊接著產生Activity中斷是跌倒狀態的第二個判斷依據。

3. 靜止:通常,人體在跌倒后,也就是撞擊發生之后,不可能馬上起來,會有短暫的靜止狀態(如果人因為跌倒而導致昏迷,甚至可能是較長時間的靜止)。表現在加速度曲線上就是會有一段時間的平穩。這可以通過ADXL345的Inactivity中斷來檢測。因此,Activity中斷之后的Inactivity中斷是跌倒狀態的第三個判斷依據。

4. 與初始狀態比較:跌倒之后,人體會發生翻轉,因此人體的方向會與原先靜止站立的姿態(初始狀態)不同。這使得跌倒之后的靜止狀態下的三軸加速度數值與初始狀態下的三軸加速度不同(見圖4)。假設跌倒檢測器固定在被測人體上的某個部位,這樣初始狀態下的三軸加速度數值可以認為是已知的(本例中,初始狀態為:X軸0g,Y軸-1g,Z軸0g)。讀取Inactivity中斷之后的三軸加速度數據,并與初始狀態進行比較。如圖4所示,重力加速度方向由Y軸上的-1g變為了Z軸上的1g,這說明人體發生了側向跌倒。因此,跌倒檢測的第四個依據就是跌倒后的靜止狀態下加速度值與初始狀態發生變化,且矢量變化超過一定的門限值(比如0.7g)。

這四個判斷依據綜合在一起,構成了整個的跌倒檢測算法,可以對跌倒狀態給出報警。當然,還要注意各個中斷之間的時間間隔要在合理的范圍之內。比如,除非是從很高的樓頂掉下來,否則Free_Fall中斷(失重)和Activity中斷(撞擊)之間的時間間隔不會很長。同樣,通常情況下, Activity中斷(撞擊)和Inactivity中斷(靜止)之間的時間間隔也不會很長。本文接下來會通過一個具體實例給出一組合理的取值。當然,相關中斷的檢測門限以及時間參數也可以根據需要而靈活設置。

另外,如果跌倒造成了嚴重的后果,比如,導致了人的昏迷。那么人體會在更常的一段時間內都保持靜止。這個狀態仍然可以通過Inactivity中斷來檢測。也就是說,如果發現在跌倒之后的很長時間內都保持Inactivity狀態,可以再次給出一個嚴重報警。

典型電路連接

ADXL345和微控制器之間的電路連接非常簡單。本文中的測試平臺由ADXL345和微控制器ADuC70262組成。圖5給出了ADXL345和ADuC70262之間的典型電路連接。ADXL345的CS管腳接高電平,表示ADXL345工作在I2C模式。SDA和SCL是I2C總線的數據線和時鐘線,分別連接到ADuC7026相應的I2C總線管腳。ADuC7026的一個GPIO管腳連接到ADXL345的ALT管腳,用來選擇ADXL345的I2C地址。ADXL345的INT1管腳連接到ADuC7026的IRQ輸入用來產生中斷信號。

其他的單片機或者處理器都可以采用與圖5類似的電路與ADXL345進行連接。ADXL345還可以工作在SPI模式以獲得更高的數據傳輸速率。關于SPI工作模式的具體描述,請參考ADXL345數據手冊。


圖5 ADXL345與微控制器之間的典型電路連接

利用ADXL345簡化跌倒檢測算法

本節將給出以上解決方案的具體算法實現。表1中簡要說明了每個寄存器的作用以及在本算法中的設置值。對于各個寄存中每一位的具體含義,請參考ADXL345的數據手冊。

表1 ADXL345寄存器功能說明

地址
寄存器名稱
類型
默認值
說明
設置值
設置的功能
0DEVID只讀0xE5器件ID只讀-
1-1CReserved--保留,不要操作保留-
1DTHRESH_TAP讀/寫 0x00Tap的門限不使用-
1EOFSX讀/寫0x00X軸失調0x06補償X軸失調,通過初始化校正獲得
1FOFSY讀/寫0x00Y軸失調0xF9補償Y軸失調,通過初始化校正獲得
20OFSZ讀/寫0x00Z軸失調0xFC補償Z軸失調,通過初始化校正獲得
21DUR讀/寫0x00Tap的持續時間不使用-
22LATENT讀/寫0x00Tap的延遲時間不使用-
23WINDOW讀/寫0x00Tap的時間窗不使用-
24THRESH_ACT讀/寫0x00Activity的門限0x20/0x08設置Activity的門限為2g或0.5g
25THRESH_INACT讀/寫0x00Inactivity的門限0x03設置Inactivity的門限為0.1875g
26TIME_INACT讀/寫0x00Inactivity的時間0x02/0x0A設置Inactivity的時間為2s或10s
27ACT_INACT_CTL讀/寫0x00Activity/Inactivity使能控制0x7F/0xFF使能X、Y、Z三軸的Activity和Inactivity功能,其中Inactivity為AC coupled模式,Activity為DC coupled 或 AC coupled模式
28THRESH_FF讀/寫0x00Free-Fall的門限0x0C設置Free-Fall的門限為0.75g
29TIME_FF讀/寫0x00Free-Fall的時間0x06設置Free-Fall的時間為30ms
2ATAP_AXES讀/寫0x00Tap/Double Tap使能控制不使用-
2BACT_TAP_STATUS只讀0x00Activity/Tap中斷軸指示只讀-
2CBW_RATE讀/寫0x0A采樣率和功耗模式控制0x0A設置采樣率為100Hz
2DPOWER_CTL讀/寫0x00工作模式控制0x00設置為正常工作模式
2EINT_ENABLE讀/寫0x00中斷使能控制0x1C使能Activity、Inactivity、Free-Fall中斷
2FINT_MAP讀/寫0x00中斷影射控制0x00所有中斷影射到Int1管腳
30INT_SOURCE只讀0x00中斷源指示只讀-
31DATA_FORMAT讀/寫0x00數據格式控制0x0B設置為+/-16g測量范圍,13bit右對齊模式,中斷為高電平觸發,使用I2C數據接口
32DATAX0只讀0x00X軸數據只讀-
33DATAX1只讀0x00只讀-
34DATAY0只讀0x00Y軸數據只讀-
35DATAY1只讀0x00只讀-
36DATAZ0只讀0x00Z軸數據只讀-
37DATAZ1只讀0x00只讀-
38FIFO_CTL讀/寫0x00FIFO控制不使用-
39FIFO_STATUS只讀0x00FIFO狀態不使用-

需要指出的是,表1給出的設置值中,某些寄存器會給出兩個數值,這說明在算法中會切換使用這兩個數值,來達到不同的檢測目的。算法的流程圖如圖6所示。


圖6 算法流程圖

算法中,關于各種中斷的門限以及時間參數的設置如下所述。

1. 初始化后,系統等待Free_Fall中斷(失重),這里把THRESH_FF設為0.75g,把TIME_FF設為30ms。

2. Free_Fall中斷產生之后,系統開始等待Activity中斷(撞擊),這里把THRESH_ACT設為2g,Activity中斷為DC coupled工作模式。

3. Free_Fall中斷(失重)與Activity中斷(撞擊)之間的時間間隔設置為200ms。如果超過200ms,則認為無效。200ms計時需要通過MCU中的定時器來實現。

4. Activity中斷產生之后,系統開始等待Inactivity中斷(撞擊后的靜止),這里把THRESH_INACT設為0.1875g,把TIME_INACT設為2s,Inactivity中斷為AC coupled工作模式。

5. 在Activity中斷產(撞擊)生之后的3.5s時間之內,應該有Inactivity中斷(撞擊后的靜止)產生。如果超時,則認為無效。3.5s計時需要通過MCU中的定時器來實現。

6. 如果Inactivity中斷之后的加速度值與初始狀態(假設已知)下數值的矢量差超過0.7g,則說明檢測到一次有效的跌倒,系統會給出一個報警。

7. 當檢測到跌倒狀態之后,為了判斷是否在跌倒之后人體有長時間的靜止不動。需要繼續檢測Activity中斷和Inactivity中斷。這里把THRESH_ACT設為0.5g,Activity中斷為AC coupled工作模式。把THRESH_INACT設為0.1875g,把TIME_INACT設為10s,Inactivity中斷為AC coupled工作模式。也就是說,如果在10s之內,人體一直沒有任何動作,則會產生Inactivity中斷,使系統給出一個嚴重報警。而在此期間一旦人體有所動作,則會產生Activity中斷,從而結束整個判斷過程。

8. 本算法還可以檢測出人體從較高的地方跌落。如果Free_Fall中斷連續產生且之間的間隔小于100ms,可以認為,人體處于連續的跌落狀態。如果Free_Fall中斷(失重)連續發生300ms,則說明人體是從超過0.45m的高度跌落,系統會給出一個跌落的報警。

本算法已在ADuC7026微控制器中以C語言實現(見附錄)。本文設計了一個實驗方案對算法進行驗證。實驗對向前跌倒,向后跌倒,向左、右兩側跌倒等不同跌倒姿勢以及跌倒后是否有長時間靜止狀態的情況分別進行了10次測試,表2中給出的是相關測試結果。

表2 測試結果

跌倒姿勢跌倒后長時間靜止12345678910
向前跌倒PPPPPPPPPP
P*P*P*P*P*P*P*P*P*P*
向后跌倒PPPPPPPPPP
P*P*P*P*P*P*P*P*P*P*
向左側跌倒PPPPPPPPPP
P*P*P*P*P*P*P*P*P*P*
向右側跌倒PPPPPPPPPP
P*P*P*P*P*P*P*P*P*P*
注:符號√表示檢測到跌倒,符號*表示檢測到跌倒后的長時間靜止。

從這個實驗中可以看出基于ADXL345的解決方案能夠有效地對跌倒狀態進行檢測。當然,這里只是一個簡單的實驗方案,仍需要進行更加全面、有效和長期的實驗來驗證該解決方案的可靠性。

結論

ADXL345是ADI公司的一款功能強大的加速度傳感器產品。本文利用ADXL345內部的多種運動狀態檢測功能和靈活的中斷功能,提出一種新的跌倒檢測解決方案。經驗證,該解決方案具有算法復雜度低,檢測準確度高的優點。

附錄
本算法的基于ADXL345和ADuC7026的測試平臺實現。通過Keil UV3編譯,工程中共有4個頭文件和一個c文件。下面詳細給出了c文件中源代碼。

// Include header files

#include "FallDetection.h"

void IRQ_Handler() __irq // IRQ interrupt

{

unsigned char i;

if((IRQSTA & GP_TIMER_BIT)==GP_TIMER_BIT) //TIMER1 Interrupt, interval 20ms

{

T1CLRI = 0; // Clear Timer1 interrupt

if(DetectionStatus==0xF2) // Strike after weightlessness is detected, waiting for stable

{

TimerWaitForStable++;

if(TimerWaitForStable>=STABLE_WINDOW) // Time out, restart

{

IRQCLR = GP_TIMER_BIT; // Disable ADuC7026's Timer1 interrupt

DetectionStatus=0xF0;

putchar(DetectionStatus);

ADXL345Registers[XL345_THRESH_ACT]=STRIKE_THRESHOLD;

ADXL345Registers[XL345_THRESH_INACT]=NOMOVEMENT_THRESHOLD;

ADXL345Registers[XL345_TIME_INACT]=STABLE_TIME;

ADXL345Registers[XL345_ACT_INACT_CTL]=XL345_INACT_Z_ENABLE | XL345_INACT_Y_ENABLE

| XL345_INACT_X_ENABLE | XL345_INACT_AC

| XL345_ACT_Z_ENABLE | XL345_ACT_Y_ENABLE

| XL345_ACT_X_ENABLE | XL345_ACT_DC;

xl345Write(4, XL345_THRESH_ACT, &ADXL345Registers[XL345_THRESH_ACT]);

}

}

else if(DetectionStatus==0xF1) // Weightlessness is detected, waiting for strike

{

TimerWaitForStrike++;

if(TimerWaitForStrike>=STRIKE_WINDOW) // Time out, restart

{

IRQCLR = GP_TIMER_BIT; // Disable ADuC7026's Timer1 interrupt

DetectionStatus=0xF0;

putchar(DetectionStatus);

ADXL345Registers[XL345_THRESH_ACT]=STRIKE_THRESHOLD;

ADXL345Registers[XL345_THRESH_INACT]=NOMOVEMENT_THRESHOLD;

ADXL345Registers[XL345_TIME_INACT]=STABLE_TIME;

ADXL345Registers[XL345_ACT_INACT_CTL]=XL345_INACT_Z_ENABLE | XL345_INACT_Y_ENABLE

| XL345_INACT_X_ENABLE | XL345_INACT_AC

| XL345_ACT_Z_ENABLE | XL345_ACT_Y_ENABLE

| XL345_ACT_X_ENABLE | XL345_ACT_DC;

xl345Write(4, XL345_THRESH_ACT, &ADXL345Registers[XL345_THRESH_ACT]);

}

}

}

if((IRQSTA&SPM4_IO_BIT)==SPM4_IO_BIT) // External interrupt form ADXL345 INT0

{

IRQCLR = SPM4_IO_BIT; // Disable ADuC7026's external interrupt

xl345Read(1, XL345_INT_SOURCE, &ADXL345Registers[XL345_INT_SOURCE]);

if((ADXL345Registers[XL345_INT_SOURCE]&XL345_ACTIVITY)==XL345_ACTIVITY) // Activity interrupt asserted

{

if(DetectionStatus==0xF1) // Waiting for strike, and now strike is detected

{

DetectionStatus=0xF2; // Go to Status "F2"

putchar(DetectionStatus);

ADXL345Registers[XL345_THRESH_ACT]=STABLE_THRESHOLD;

ADXL345Registers[XL345_THRESH_INACT]=NOMOVEMENT_THRESHOLD;

ADXL345Registers[XL345_TIME_INACT =STABLE_TIME;

ADXL345Registers[XL345_ACT_INACT_CTL]=XL345_INACT_Z_ENABLE | XL345_INACT_Y_ENABLE

| XL345_INACT_X_ENABLE | XL345_INACT_AC

| XL345_ACT_Z_ENABLE | XL345_ACT_Y_ENABLE

| XL345_ACT_X_ENABLE | XL345_ACT_AC;

xl345Write(4, XL345_THRESH_ACT, &ADXL345Registers[XL345_THRESH_ACT]);

IRQEN|=GP_TIMER_BIT; // Enable ADuC7026's Timer1 interrupt

TimerWaitForStable=0;

}

else if(DetectionStatus==0xF4) // Waiting for long time motionless, but a movement is detected

{

DetectionStatus=0xF0; // Go to Status "F0", restart

putchar(DetectionStatus);

ADXL345Registers[XL345_THRESH_ACT]=STRIKE_THRESHOLD;

ADXL345Registers[XL345_THRESH_INACT]=NOMOVEMENT_THRESHOLD;

ADXL345Registers[XL345_TIME_INACT]=STABLE_TIME;

ADXL345Registers[XL345_ACT_INACT_CTL]=XL345_INACT_Z_ENABLE | XL345_INACT_Y_ENABLE

| XL345_INACT_X_ENABLE | XL345_INACT_AC

| XL345_ACT_Z_ENABLE | XL345_ACT_Y_ENABLE

| XL345_ACT_X_ENABLE | XL345_ACT_DC;

xl345Write(4, XL345_THRESH_ACT, &ADXL345Registers[XL345_THRESH_ACT]);

}

}

else if((ADXL345Registers[XL345_INT_SOURCE]&XL345_INACTIVITY)==XL345_INACTIVITY) // Inactivity interrupt asserted

{

if(DetectionStatus==0xF2) // Waiting for stable, and now stable is detected

{

DetectionStatus=0xF3; // Go to Status "F3"

IRQCLR = GP_TIMER_BIT;

putchar(DetectionStatus);

xl345Read(6, XL345_DATAX0, &ADXL345Registers[XL345_DATAX0]);

DeltaVectorSum=0;

for(i=0;i<3; i++)

{

Acceleration[i]=ADXL345Registers[XL345_DATAX1+i*2]&0x1F;

Acceleration[i]=(Acceleration[i]<<8)|ADXL345Registers[XL345_DATAX0+i*2];

if(Acceleration[i]<0x1000)

{

Acceleration[i]=Acceleration[i]+0x1000;

}

else //if(Acceleration[i]>=4096)

{

Acceleration[i]=Acceleration[i]-0x1000;

}

if(Acceleration[i]>InitialStatus[i])

{

DeltaAcceleration[i]=Acceleration[i]-InitialStatus[i];

}

else

{

DeltaAcceleration[i]=InitialStatus[i]-Acceleration[i];

}

DeltaVectorSum=DeltaVectorSum+DeltaAcceleration[i]*DeltaAcceleration[i];

}

if(DeltaVectorSum>DELTA_VECTOR_SUM_THRESHOLD // The stable status is different from the initial status

{

DetectionStatus=0xF4; // Valid fall detection

putchar(DetectionStatus);

ADXL345Registers[XL345_THRESH_ACT]=STABLE_THRESHOLD;

ADXL345Registers[XL345_THRESH_INACT]=NOMOVEMENT_THRESHOLD;

ADXL345Registers[XL345_TIME_INACT]=NOMOVEMENT_TIME;

ADXL345Registers[XL345_ACT_INACT_CTL]=XL345_INACT_Z_ENABLE | XL345_INACT_Y_ENABLE

| XL345_INACT_X_ENABLE | XL345_INACT_AC

| XL345_ACT_Z_ENABLE | XL345_ACT_Y_ENABLE

| XL345_ACT_X_ENABLE | XL345_ACT_AC;

xl345Write(4, XL345_THRESH_ACT, &ADXL345Registers[XL345_THRESH_ACT]);

}

else // Delta vector sum is not exceed the threshold

{

DetectionStatus=0xF0; // Go to Status "F0", restart

putchar(DetectionStatus);

ADXL345Registers[XL345_THRESH_ACT]=STRIKE_THRESHOLD;

ADXL345Registers[XL345_THRESH_INACT]=NOMOVEMENT_THRESHOLD;

ADXL345Registers[XL345_TIME_INACT]=STABLE_TIME;

ADXL345Registers[XL345_ACT_INACT_CTL]=XL345_INACT_Z_ENABLE | XL345_INACT_Y_ENABLE

| XL345_INACT_X_ENABLE | XL345_INACT_AC

| XL345_ACT_Z_ENABLE | XL345_ACT_Y_ENABLE

| XL345_ACT_X_ENABLE | XL345_ACT_DC;

xl345Write(4, XL345_THRESH_ACT, &ADXL345Registers[XL345_THRESH_ACT]);

}

}

else if(DetectionStatus==0xF4) // Wait for long time motionless and now it is detected

{

DetectionStatus=0xF5; // Valid critical fall detection

putchar(DetectionStatus);

ADXL345Registers[XL345_THRESH_ACT]=STRIKE_THRESHOLD;

ADXL345Registers[XL345_THRESH_INACT]=NOMOVEMENT_THRESHOLD;

ADXL345Registers[XL345_TIME_INACT]=STABLE_TIME;

下一篇: PLC、DCS、FCS三大控

上一篇: 索爾維全系列Solef?PV

推薦產品

更多
主站蜘蛛池模板: 精品一区二区三区在线观看国产 | 亚洲精品视 | 91在线影院 | 欧美综合久久 | 成人精品一区二区 | 日韩精品成人一区二区三区视频 | 精品欧美一区二区在线观看欧美熟 | 欧美日韩亚洲国产 | 成人精品视频 | 最新国产精品精品视频 | 欧美激情久久久 | 亚洲欧美激情网 | 亚洲国产一区二区三区在线观看 | 国产精品久久久久久久久免费 | 99精品国产一区二区三区 | 午夜电影福利 | 久久在视频 | 亚洲+变态+欧美+另类+精品 | 中文字幕在线免费 | 久久精品中文 | 亚洲欧美一区二区在线观看 | 亚洲91| 色站综合 | 中文字幕日韩一区 | 国外成人在线视频 | 日韩中文字幕久久 | 日韩精品成人在线 | 国产精品成人av | 欧美日韩一区二区三区视频 | 欧美精品国产精品 | 一级美国黄色片 | 91久久视频 | 日韩国产精品一区二区三区 | 欧美 日韩 中文 | 天堂久| 久久精品99久久 | 欧美成人精品在线 | 国产一区二区 | 亚洲精品二区 | 色橹橹欧美在线观看视频高清 | 成人免费一区二区 |