標(biāo)題:
三軸加速度傳感器BMA223調(diào)試記錄
[打印本頁]
作者:
下一個(gè)原點(diǎn)
時(shí)間:
2018-9-3 15:49
標(biāo)題:
三軸加速度傳感器BMA223調(diào)試記錄
BMA223調(diào)試記錄
一、運(yùn)動(dòng)中斷檢測(cè)
1.斜率運(yùn)動(dòng)
寄存器: 參數(shù)設(shè)置:
0x00 BMA2x2_CHIP_ID_REG
0x0f BMA2x2_RANGE_SEL_REG: 0x03 //量程(+-)2g
0x10 BMA2x2_BW_SEL_REG: 0x0f //帶寬1000Hz
0x16 BMA2x2_INT_ENABLE1_REG: 0x07 //在組0中使能斜率中斷
0x19 BMA2x2_INT1_PAD_SEL_REG: 0x04 //斜率中斷信號(hào)映射到 INT1 引腳
0x1b BMA2x2_INT2_PAD_SEL_REG: 0x04 //斜率中斷信號(hào)映射到 INT2 引腳
0x20 BMA2x2_INT_SET_REG: 0x05 //設(shè)置INT1/INT2 引腳空閑高電平
0x21 BMA2x2_INT_CTRL_REG: 0x8e //設(shè)置中斷延時(shí)50ms后 復(fù)位
0x27 BMA2x2_SLOPE_DURN_REG: 0x03 //設(shè)置中斷連續(xù)樣本數(shù)據(jù)點(diǎn)個(gè)數(shù)
0x28 BMA2x2_SLOPE_THRES_REG: 0x14 //設(shè)置中斷閾值 20*3.91mg = 78.2 mg
slope(t 0 + Δ t)= acc(t 0 + Δ t) - acc(t 0 )
使用連續(xù)加速度信號(hào)之間的斜率來檢測(cè)運(yùn)動(dòng)的變化。當(dāng)斜率(加速度差的絕對(duì)值)超過預(yù)設(shè)閾值時(shí),產(chǎn)生中斷。一旦斜率降到閾值以下,中斷被清除
2.1慢/無運(yùn)動(dòng)之慢運(yùn)動(dòng)
SLOW_NO_MOTION :*15.63 mg (8-g range)--:threshold->5(78mg)~8(125 mg)
寄存器: 參數(shù)設(shè)置:
0x00 BMA2x2_CHIP_ID_REG
0x0f BMA2x2_RANGE_SEL_REG: 0x03 //量程(+-)8g
0x10 BMA2x2_BW_SEL_REG: 0x0f //帶寬1000Hz
0x18 BMA2x2_INT_SLO_NO_MOT_REG: 0x07 //在組2中使能慢/無運(yùn)動(dòng)中斷
0x19 BMA2x2_INT1_PAD_SEL_REG: 0x08 //斜率中斷信號(hào)映射到 INT1 引腳
0x1b BMA2x2_INT2_PAD_SEL_REG: 0x08 //斜率中斷信號(hào)映射到 INT2 引腳
0x20 BMA2x2_INT_SET_REG: 0x05 //設(shè)置INT1/INT2 引腳空閑高電平
0x21 BMA2x2_INT_CTRL_REG: 0x8e //設(shè)置中斷延時(shí)50ms后 復(fù)位
0x27 BMA2x2_SLO_NO_MOT_THRES_REG: 0x28 //設(shè)置中斷連續(xù)樣本數(shù)據(jù)點(diǎn)個(gè)數(shù)
0x28 BMA2x2_SLO_NO_MOT_THRES_REG: 0x14 //設(shè)置中斷閾
在慢動(dòng)作模式中,當(dāng)至少一個(gè)使能軸的測(cè)量斜率超過可編程數(shù)量的樣本的可編程斜率閾值時(shí),觸發(fā)中斷。 因此,引擎的行為類似于任意運(yùn)動(dòng)中斷,但具有不同的參數(shù)集。 為了抑制誤觸發(fā),如果一定數(shù)量N的連續(xù)斜率數(shù)據(jù)點(diǎn)大于(小于)由(0x27)slo_no_mot_dur <1:0>給出的斜率閾值,則僅產(chǎn)生(清除)中斷。 數(shù)字是N =(0x27)slo_no_mot_dur <1:0> + 1
2.2慢/無運(yùn)動(dòng)之無運(yùn)動(dòng)
NO_MOTION :*15.63 mg
0x00 BMA2x2_CHIP_ID_REG
0x0f BMA2x2_RANGE_SEL_REG: 0x08 //(+-)8g
0x10 BMA2x2_BW_SEL_REG: 0x0f //1000Hz
0x18 BMA2x2_INT_SLO_NO_MOT_REG:0x0F //*在組2中使能慢/無運(yùn)動(dòng)中斷0x19 BMA2x2_INT1_PAD_SEL_REG: 0x08 //斜率中斷信號(hào)映射到 INT1 引腳
0x1b BMA2x2_INT2_PAD_SEL_REG: 0x08 //斜率中斷信號(hào)映射到 INT2 引腳
0x20 BMA2x2_INT_SET_REG: 0x05 //設(shè)置INT1/INT2 引腳空閑高電平
0x21 BMA2x2_INT_CTRL_REG: 0x8e //設(shè)置中斷延時(shí)50ms后 復(fù)位
0x27 BMA2x2_SLO_NO_MOT_THRES_REG:0x08 //設(shè)置中斷觸發(fā)條件持續(xù)時(shí)間
0x28 BMA2x2_SLO_NO_MOT_THRES_REG: 0x10 //設(shè)置中斷閾值
在非運(yùn)動(dòng)模式下,如果所有選定軸上的斜率在可編程延遲時(shí)間內(nèi)保持小于可編程閾值,則會(huì)產(chǎn)生中斷。閾值的縮放與慢動(dòng)作中斷的縮放相同。 但是,在無運(yùn)動(dòng)模式寄存器(0x27)中,slo_no_mot_dur定義了觸發(fā)無運(yùn)動(dòng)中斷之前的延遲時(shí)間。 表19列出了使用寄存器(0x27)slo_no_mot_dur調(diào)整的延遲時(shí)間。 計(jì)時(shí)器滴答周期為1秒。 因此,使用短延遲時(shí)間會(huì)導(dǎo)致相當(dāng)大的時(shí)序不確定性。
3.1HIGH_G 運(yùn)動(dòng)中斷:
0x00 BMA2x2_CHIP_ID_REG
0x0f BMA2x2_RANGE_SEL_REG: 0x03 //(+-)2g
0x10 BMA2x2_BW_SEL_REG: 0x0f //1000Hz
0x17 BMA2x2_INT_ENABLE1_REG: 0x07 //在組2中使能HIGH_G運(yùn)動(dòng)中斷
0x19 BMA2x2_INT1_PAD_SEL_REG: 0x04 //斜率中斷信號(hào)映射到 INT1 引腳0x1b BMA2x2_INT2_PAD_SEL_REG: 0x04 //斜率中斷信號(hào)映射到 INT2 引腳
0x20 BMA2x2_INT_SET_REG: 0x05 //設(shè)置INT1/INT2 引腳空閑高電平
0x21 BMA2x2_INT_CTRL_REG: 0x1e //設(shè)置中斷延時(shí)50ms后 復(fù)位
0x24 BMA2x2_LOW_HIGH_HYST_REG 0x41 //high-g 中斷滯后:*125 mg
0x25 BMA2x2_HIGH_DURN_REG : 0x18 //設(shè)置中斷觸發(fā)條件持續(xù)時(shí)間[0x18+1] * 2 ms
0x26 BMA2x2_HIGH_THRES_REG: 0xC0 //設(shè)置中斷閾值
threshold:0xC0->192 (default) 192*7.81mg = 1499 mg
如果使能的三個(gè)軸(或關(guān)系)里至少有一個(gè)的加速度絕對(duì)值高于閾值,并且至少持續(xù)寄存器(0x25)high_dur里定義的時(shí)間,則產(chǎn)生高g中斷。
如果使能的三個(gè)軸(與關(guān)系,也就是全部軸)的加速度絕對(duì)值低于閾值,并且至少持續(xù)寄存器(0x25)high_dur里定義的時(shí)間,則高g中斷產(chǎn)生復(fù)位。在位(0x09)high_int中存儲(chǔ)中斷狀態(tài)。
3.2LOW_G 運(yùn)動(dòng)中斷:
0x00 BMA2x2_CHIP_ID_REG
0x0f BMA2x2_RANGE_SEL_REG: 0x03 //(+-)2g
0x10 BMA2x2_BW_SEL_REG: 0x0f //1000Hz
0x17 BMA2x2_INT_ENABLE1_REG: 0x07 //在組2中使能HIGH_G運(yùn)動(dòng)中斷
0x19 BMA2x2_INT1_PAD_SEL_REG: 0x04 //斜率中斷信號(hào)映射到 INT1 引腳0x1b BMA2x2_INT2_PAD_SEL_REG: 0x04 //斜率中斷信號(hào)映射到 INT2 引腳
0x20 BMA2x2_INT_SET_REG: 0x05 //設(shè)置INT1/INT2 引腳空閑高電平
0x21 BMA2x2_INT_CTRL_REG: 0x1e //設(shè)置中斷延時(shí)50ms后 復(fù)位
0x24 BMA2x2_LOW_HIGH_HYST_REG 0x41 //high-g 中斷滯后:*125 mg
0x25 BMA2x2_HIGH_DURN_REG : 0x18 //設(shè)置中斷觸發(fā)條件持續(xù)時(shí)間[0x18+1] * 2 ms
0x26 BMA2x2_HIGH_THRES_REG: 0xC0 //設(shè)置中斷閾值
threshold:0xC0->192 (default) 192*7.81mg = 1499 mg
如果所有軸的加速度的絕對(duì)值(在單模式下為'and'關(guān)系)或它們的總和(在和模式的情況下)至少在定義的時(shí)間內(nèi)低于閾值,則產(chǎn)生低g中斷 通過(0x22)low_dur寄存器。
如果至少一個(gè)軸的加速度的絕對(duì)值(在單模式的情況下為'or'關(guān)系)或絕對(duì)值的總和(在和模式的情況下)至少一次的數(shù)據(jù)采集中高于閾值加滯后,則重置中斷。 在位(0x09)low_int中存儲(chǔ)中斷狀態(tài)。
4.1雙擊檢測(cè)
0x00 BMA2x2_CHIP_ID_REG
0x0f BMA2x2_RANGE_SEL_REG: 0x08 //(+-)8g
0x10 BMA2x2_BW_SEL_REG: 0x0f //1000Hz
0x16 BMA2x2_INT_SLO_NO_MOT_REG: 0x10 //在組0中使能雙擊運(yùn)動(dòng)中斷
0x19 BMA2x2_INT1_PAD_SEL_REG: 0x10 //斜率中斷信號(hào)映射到 INT1 引腳
0x1b BMA2x2_INT2_PAD_SEL_REG: 0x10 //斜率中斷信號(hào)映射到 INT2 引腳
0x20 BMA2x2_INT_SET_REG: 0x05 //設(shè)置INT1/INT2 引腳空閑高電平
0x21 BMA2x2_INT_CTRL_REG: 0x8e //設(shè)置中斷延時(shí)50ms后 復(fù)位
0x2A BMA2x2_TAP_PARAM_REG: 0x07 //設(shè)置中斷第二擊的時(shí)間窗口
0X06-->500ms,0x07-->700ms
0x2B BMA2x2_TAP_THRES_REG: 0x14 //設(shè)置中斷閾值
threshold*250 mg (8-g range)--:threshold->2(500mg)~10(2500mg)
4.2單擊檢測(cè)
0x00 BMA2x2_CHIP_ID_REG
0x0f BMA2x2_RANGE_SEL_REG: 0x08 //(+-)8g
0x10 BMA2x2_BW_SEL_REG: 0x0f //1000Hz
0x16 BMA2x2_INT_SLO_NO_MOT_REG: 0x10 //在組0中使能雙擊運(yùn)動(dòng)中斷
0x19 BMA2x2_INT1_PAD_SEL_REG: 0x10 //斜率中斷信號(hào)映射到 INT1 引腳
0x1b BMA2x2_INT2_PAD_SEL_REG: 0x10 //斜率中斷信號(hào)映射到 INT2 引腳
0x20 BMA2x2_INT_SET_REG: 0x05 //設(shè)置INT1/INT2 引腳空閑高電平
0x21 BMA2x2_INT_CTRL_REG: 0x8e //設(shè)置中斷延時(shí)50ms后 復(fù)位
0x2A BMA2x2_TAP_PARAM_REG: 0x07 //設(shè)置中斷第二擊的時(shí)間窗口
0X06-->500ms,0x07-->700ms
0x2B BMA2x2_TAP_THRES_REG: 0x14 //設(shè)置中斷閾值
threshold:0x14->20 (default) 20*3.91mg = 78.2 mg
如果超過至少一個(gè)軸的加速度的預(yù)定義斜率,則檢測(cè)到輕敲事件。區(qū)分兩個(gè)不同的點(diǎn)擊事件:“單擊”是特定時(shí)間內(nèi)的單個(gè)事件,然后是某個(gè)安靜時(shí)間。 “雙擊”包括第一個(gè)這樣的事件,然后是在規(guī)定的時(shí)間范圍內(nèi)的第二個(gè)事件。
二、靜態(tài)特殊方向檢測(cè):
1.在靜止的情況下三軸加速度數(shù)據(jù),其中兩個(gè)軸的數(shù)據(jù)幾乎接近0(>0mg&&<60mg),另一個(gè)軸數(shù)據(jù)接近1000mg。
if((GsensorDataHX<14) && (GsensorDataHX >0))
{
if((GsensorDataHY<14) && (GsensorDataHY>0))
{
if((GsensorDataHZ<80) && (GsensorDataHZ>28) && (GsensorDataZ ==0))
printf("positive\r\n");
else if((GsensorDataHZ<80) && (GsensorDataHZ>28) && (GsensorDataZ ==1))
printf("negative \r\n");
}
}
if((GsensorDataHX<14) && (GsensorDataHX >0))
{
if((GsensorDataHZ<14) && (GsensorDataHZ>0))
{
if((GsensorDataHY<80) && (GsensorDataHY>28) && (GsensorDataY ==0))
printf("Left\r\n");
else if((GsensorDataHY<80) && (GsensorDataHY>28) && (GsensorDataY ==1))
printf("Right \r\n");
}
}
if((GsensorDataHY<14) && (GsensorDataHY >0))
{
if((GsensorDataHZ<14) && (GsensorDataHZ>0))
{
if((GsensorDataHX<80) && (GsensorDataHX>28) && (GsensorDataX ==0))
printf("Front\r\n");
else if((GsensorDataHX<80) &&(GsensorDataHX>28) && (GsensorDataX ==1))
printf("Back \r\n");
}
}
復(fù)制代碼
三、加速度數(shù)據(jù)的運(yùn)動(dòng)檢測(cè)
三軸的合加速度G =重力加速度G0+動(dòng)態(tài)加速度Gv
靜止時(shí),SVM約等于重力加速度,運(yùn)動(dòng)時(shí),G的幅值SVM圍繞著重力加速度G=G0上下浮動(dòng),此時(shí)Gv的幅值SS(i)會(huì)大于0。
1.對(duì)當(dāng)前數(shù)據(jù)點(diǎn)進(jìn)行動(dòng)態(tài)與靜態(tài)識(shí)別:SVM>1050 --->動(dòng)態(tài)點(diǎn)
2.對(duì)動(dòng)態(tài)點(diǎn)的各軸數(shù)據(jù)進(jìn)行幅值測(cè)試分析
for(jtemp=x_flag;jtemp<=z_flag;jtemp++)
{
array3[jtemp]=array2[jtemp];
array2[jtemp]=array1[jtemp];
array1[jtemp]=array0[jtemp];
array0[jtemp]= GsensorData [jtemp]; adresult[jtemp]=array0[jtemp]+array1[jtemp]
+array2[jtemp]+array3[jtemp];
GsensorData_tem_devi[jtemp]=(sumdata-adresult[jtemp)/4;
}
復(fù)制代碼
四、計(jì)步器
1. 滑動(dòng)窗口采樣濾波,找出最大小值
for(jtemp=x_flag;jtemp<=z_flag;jtemp++)
{
array3[jtemp]=array2[jtemp];
array2[jtemp]=array1[jtemp];
array1[jtemp]=array0[jtemp];
array0[jtemp]= GsensorData [jtemp]; adresult[jtemp]=array0[jtemp]+array1[jtemp]
+array2[jtemp]+array3[jtemp];
adresult[jtemp]=adresult[jtemp]>>2;
if(adresult[jtemp]>max[jtemp])
max[jtemp]=adresult[jtemp];
if(adresult[jtemp]<min[jtemp])
min[jtemp]=adresult[jtemp];
}
復(fù)制代碼
2. 計(jì)算動(dòng)態(tài)門限和動(dòng)態(tài)精度,采集四五十次數(shù)據(jù)調(diào)整一次
門限值vpp[jtemp]: 30
中值dc[jtemp]: 500
精度precision[jtemp]: 5
if(sampling_counter>=40)
{
sampling_counter=0;
for(jtemp=0;jtemp<=2;jtemp++)
{
vpp[jtemp]=max[jtemp]-min[jtemp];
dc[jtemp] =min[jtemp]+(vpp[jtemp]>>1);
max[jtemp]=0;
min[jtemp]=1023;
bad_flag[jtemp]=0;
if(vpp[jtemp]>=160)
{
precision[jtemp]=vpp[jtemp]/32; //8
}
else if((vpp[jtemp]>=50)&& (vpp[jtemp]<160))
{
precision[jtemp]=4;
}
else if((vpp[jtemp]>=15) && (vpp[jtemp]<50))
{
precision[jtemp]=3;
}
else
{
precision[jtemp]=2;
bad_flag[jtemp]=1;
}
}
}
復(fù)制代碼
3. 線性移位寄存器,找出最近兩次采集數(shù)據(jù)之間差異最大的值
for(jtemp=0;jtemp<=2;jtemp++)
{
old_fixed[jtemp]=new_fixed[jtemp];
if(adresult[jtemp]>=new_fixed[jtemp]){
if((adresult[jtemp]-new_fixed[jtemp])>=precision[jtemp]) new_fixed[jtemp]=adresult[jtemp];
}
else if(adresult[jtemp]<new_fixed[jtemp]){
if((new_fixed[jtemp]-adresult[jtemp])>=precision[jtemp])
new_fixed[jtemp]=adresult[jtemp];
}
}
復(fù)制代碼
4. 動(dòng)態(tài)門限判決,找出兩次數(shù)據(jù)間最大門限值,并判斷是否在窗口內(nèi)進(jìn)行計(jì)步。
if((vpp[0]>=vpp[1])&&(vpp[0]>=vpp[2])){
if((old_fixed[0]>=dc[0])&&(new_fixed[0]<dc[0])&&(bad_flag[0]==0)) {
printf("X STEP+1 \r\n ");
Time_Window();
}
}
else if((vpp[1]>=vpp[0])&&(vpp[1]>=vpp[2])){
if((old_fixed[1]>=dc[1])&&(new_fixed[1]<dc[1])&&(bad_flag[1]==0)) {
printf("Y STEP+1 \r\n ");
Time_Window();
}
}
else if((vpp[2]>=vpp[1])&&(vpp[2]>=vpp[0])){
if((old_fixed[2]>=dc[2])&&(new_fixed[2]<dc[2])&&(bad_flag[2]==0)) {
printf("Z STEP+1 \r\n ");
Time_Window();
}
}
復(fù)制代碼
5.時(shí)間窗口
/*------------------------------------------------------------------------------------------------------------------------
#define TIMEWINDOW_MIN 10 //0.2s
#define TIMEWINDOW_MAX 100 //2s
#define REGULATION 4 //
#define INVALID 2 //
unsigned char Interval=0; //
unsigned char TempSteps=0; //
unsigned char InvalidSteps=0; //
unsigned char ReReg=2; //
// 2-
// 1-
// 0-
*------------------------------------------------------------------------------------------------------------------------*/
void Time_Window(void)
{
Interval=time_win_value;
time_win_value=0;
if(ReReg==2) //
{
TempSteps++;
Interval=0;
ReReg=1;
InvalidSteps=0;
}
else //
{
printf("Interval:----%d --- \r\n ",Interval);
if((Interval>=TIMEWINDOW_MIN)&&(Interval<=TIMEWINDOW_MAX)) //
{
InvalidSteps=0;
if(ReReg==1) //
{
TempSteps++; //
if(TempSteps>=REGULATION) //
{
ReReg=0; //
STEPS=STEPS+TempSteps; //
TempSteps=0;
printf("STEPS+tempstep:%d \r\n\r\n ",STEPS);
}
Interval=0;
}
else if(ReReg==0) //
{
STEPS++;
TempSteps=0;
Interval=0;
printf("STEPS:%d \r\n\r\n ",STEPS);
}
printf("timer is ok ! \r\n\r\n ");
}
else if(Interval<TIMEWINDOW_MIN) //
{
if(ReReg==0) //
{
InvalidSteps++; //
if(InvalidSteps>=INVALID) //
{
InvalidSteps=0;
ReReg=1;
TempSteps=1;
Interval=0;
}
else //
Interval=0;
}
else if(ReReg==1) //
{
InvalidSteps=0;
ReReg=1;
TempSteps=1;
Interval=0;
}
printf("timer is smaler ! \r\n\r\n ");
}
else if(Interval>TIMEWINDOW_MAX) //
{
InvalidSteps=0;
ReReg=1;
TempSteps=1;
Interval=0;
printf("timer is bigger ! \r\n\r\n ");
}
}
}
復(fù)制代碼
完整的Word格式文檔51黑下載地址:
8.16.1調(diào)試記錄.docx
(48.29 KB, 下載次數(shù): 36)
2018-9-3 15:49 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1