BMX055に4線式SPIモードで接続するためのライブラリです
Diff: BMX055.cpp
- Revision:
- 1:fed25406cc14
- Parent:
- 0:c317a0f96763
diff -r c317a0f96763 -r fed25406cc14 BMX055.cpp --- a/BMX055.cpp Mon Nov 28 10:48:59 2016 +0000 +++ b/BMX055.cpp Tue Feb 13 04:13:42 2018 +0000 @@ -7,11 +7,11 @@ gyrss=1; magss=1; wait(0.1); - bmx.frequency(1000000); + bmx.frequency(10000000); bmx.format(8,3); - init_acc(RANGE_2G,BW_1000); - init_gyr(RANGE_250,ODR_BW_2000_523); - init_mag(); + init_acc(RANGE_2G,BW_250); + init_gyr(RANGE_250,ODR_BW_2000_230); + init_mag(0,0); @@ -40,14 +40,14 @@ bmx.write(data); accss=1; } -bool BMX055::read_acc(float *acc){ +bool BMX055::read_acc(short *acc){ char data[6]; readnbyte_acc(0x02,data,6); unsigned short buf[3]; for(int i=0;i<3;i++){ buf[i]=(data[2*i]>>4)|(data[2*i+1]<<4); - if(buf[i]>0x800)acc[i]=(float)-1*((~buf[i]+1)&0xfff); - else acc[i]=(float)buf[i]; + if(buf[i]>0x800)acc[i]=(short)-1*((~buf[i]+1)&0xfff); + else acc[i]=(short)buf[i]; } return true; } @@ -56,8 +56,9 @@ } void BMX055::calib_acc(){ //sensor offset - writebyte_acc(0x37,0b00100000); + writebyte_acc(0x37,0b01111110); + wait_ms(10); while(((readbyte_acc(0x36)&0b00010000)>>4)!=1); writebyte_acc(0x36,0b00100000); while(((readbyte_acc(0x36)&0b00010000)>>4)!=1); @@ -99,13 +100,13 @@ bmx.write(data); gyrss=1; } -bool BMX055::read_gyr(float *gyr){ +bool BMX055::read_gyr(short *gyr){ char data[6]; readnbyte_gyr(0x02,data,6); short buf[3]; for(int i=0;i<3;i++){ buf[i]=data[2*i]|(data[2*i+1]<<8); - gyr[i]=(float)buf[i]; + gyr[i]=buf[i]; } return true; @@ -143,39 +144,51 @@ for(int i=0;i<num;i++)data[i]=bmx.write(0xFF); magss=1; } -bool BMX055::read_mag(float *mag){ +bool BMX055::read_mag(short *mag){ if((readbyte_mag(0x48)&0x01)==1){ char data[8]; readnbyte_mag(0x42,data,8); short buf[4]; buf[0]=(data[0]>>3)|(data[1]<<5); - if(buf[0]>0x1000)mag[0]=(float)-1*((~buf[0]+1)&0xfff); - else mag[0]=(float)buf[0]; + if(buf[0]>0x1000)mag[0]=-1*((~buf[0]+1)&0xfff); + else mag[0]=buf[0]; buf[1]=(data[2]>>3)|(data[3]<<5); - if(buf[1]>0x1000)mag[1]=(float)-1*((~buf[1]+1)&0xfff); - else mag[1]=(float)buf[1]; + if(buf[1]>0x1000)mag[1]=-1*((~buf[1]+1)&0xfff); + else mag[1]=buf[1]; buf[2]=((short)data[4]>>1)|((short)data[5]<<7); - if(buf[2]>0x4000)mag[2]=(float)-1*((~buf[2]+1)&0x7fff); - else mag[2]=(float)buf[2]; + if(buf[2]>0x4000)mag[2]=-1*((~buf[2]+1)&0x7fff); + else mag[2]=buf[2]; buf[3]=((short)data[6]>>2)|((short)data[7]<<6); - if(buf[3]>0x2000)mag[3]=(float)-1*((~buf[3]+1)&0x3fff); - else mag[3]=(float)buf[3]; + if(buf[3]>0x2000)mag[3]=-1*((~buf[3]+1)&0x3fff); + else mag[3]=buf[3]; + + writebyte_mag(0x4c,0b00000010);//forced mode trigger + return true; }else return false; } -void BMX055::init_mag(){ +void BMX055::init_mag(unsigned char REPXY,unsigned char REPZ){ magss=1; - writebyte_mag(0x4b,0b10000000);//soft reset - writebyte_mag(0x4b,0b00000001);//power mode + writebyte_mag(0x4b,0b00000001);//go sleep mode + wait_ms(50); + writebyte_mag(0x4b,0b10000011);//soft reset&go sleep mode wait_ms(50); - //printf("id is %d\r\n",readbyte_mag(0x40)); - writebyte_mag(0x4c,0b00111000);//data enable + + writebyte_mag(0x51,REPXY);//set REPXY + //1+REPXY + wait_ms(50); + + writebyte_mag(0x52,REPZ);//set REPZ + //1+REPZ + wait_ms(50); + + writebyte_mag(0x4c,0b00000010);//forced modetrigger }