This is my quadcopter prototype software, still in development!
Embed:
(wiki syntax)
Show/hide line numbers
bma180.cpp
00001 #include "bma180.h" 00002 00003 #define ID 0x00 00004 #define VERSION 0x01 00005 #define XaccLSB 0x02 00006 #define XaccMSB 0x03 00007 #define YaccLSB 0x04 00008 #define YaccMSB 0x05 00009 #define ZaccLSB 0x06 00010 #define ZaccMSB 0x07 00011 #define CTRL_REG0 0x0D 00012 #define CTRL_REG1 0x0E 00013 #define CTRL_REG2 0x0F 00014 #define RESET 0x10 00015 #define BW 0x20 00016 #define CTRL_REG3 0x21 00017 #define CTRL_REG4 0x22 00018 #define DIS_I2C 0x27 00019 #define MODE 0x30 00020 #define RANGE 0x35 00021 00022 #include "mbed.h" 00023 00024 BMA180::BMA180(SPI& spi, PinName cs): _spi(spi), _cs(cs) { 00025 _spi.format(8,3); 00026 _spi.frequency(10000000); 00027 00028 } 00029 00030 void BMA180::readX() { 00031 _cs = 0; 00032 _spi.write(XaccLSB | 0x80); 00033 data[0] = _spi.write(XaccMSB | 0x80); 00034 data[1] = _spi.write(XaccMSB | 0x80); 00035 _cs = 1; 00036 xi = (data[1]<<6) | (data[0]>>2); 00037 } 00038 void BMA180::readY() { 00039 _cs = 0; 00040 _spi.write(YaccLSB | 0x80); 00041 data[2] = _spi.write(YaccMSB | 0x80); 00042 data[3] = _spi.write(YaccMSB | 0x80); 00043 _cs = 1; 00044 yi = (data[3]<<6) | (data[2]>>2); 00045 } 00046 void BMA180::readZ() { 00047 _cs = 0; 00048 _spi.write(ZaccLSB | 0x80); 00049 data[4] = _spi.write(ZaccMSB | 0x80); 00050 data[5] = _spi.write(ZaccMSB | 0x80); 00051 _cs = 1; 00052 zi = (data[5]<<6) | (data[4]>>2); 00053 } 00054 void BMA180::readRaw() { 00055 _cs = 0; 00056 _spi.write(XaccLSB | 0x80); 00057 data[0] = _spi.write(0x80); 00058 data[1] = _spi.write(0x80); 00059 data[2] = _spi.write(0x80); 00060 data[3] = _spi.write(0x80); 00061 data[4] = _spi.write(0x80); 00062 data[5] = _spi.write(0x80); 00063 _cs = 1; 00064 x = (data[1]<<6) | (data[0]>>2); 00065 if(x>=0x2000) 00066 { 00067 x -= 0x4000; 00068 xi = x; 00069 } 00070 else 00071 { 00072 xi = x; 00073 } 00074 x/=0x2000; 00075 y = (data[3]<<6) | (data[2]>>2); 00076 if(y>=0x2000) 00077 { 00078 y -= 0x4000; 00079 yi =y; 00080 } 00081 else 00082 { 00083 yi = y; 00084 } 00085 y/=0x2000; 00086 z = (data[5]<<6) | (data[4]>>2); 00087 if(z>=0x2000) 00088 { 00089 z -= 0x4000; 00090 zi =z; 00091 } 00092 else 00093 { 00094 zi=z; 00095 } 00096 z/=0x2000; 00097 } 00098 char BMA180::write(char address,char data) { 00099 address &= 0x7F; 00100 _cs = 0; 00101 _spi.write(address); 00102 _spi.write(data); 00103 _cs = 1; 00104 return 1; 00105 } 00106 char BMA180::read(char address) { 00107 char data; 00108 address |= 0x80; 00109 _cs = 0; 00110 _spi.write(address); 00111 data = _spi.write(0xFF); 00112 _cs = 1; 00113 return data; 00114 } 00115 void BMA180::softReset() { 00116 _cs = 0; wait_us(2); 00117 _spi.write(RESET & 0x7F); wait_us(2); 00118 _spi.write(0xB6); 00119 _cs = 1; wait_us(2); 00120 } 00121 void BMA180::range(int r) { 00122 char byte; 00123 00124 byte = read(CTRL_REG0); //unlock image writing 00125 _cs = 0; wait_us(2); 00126 _spi.write(CTRL_REG0 & 0x7F); 00127 _spi.write(byte | 0x10); 00128 _cs = 1; wait_us(2); 00129 00130 byte = read(RANGE); //set the range of acceleromter 00131 byte &= 0xF1; 00132 if(r>6) 00133 byte |= 0x02; 00134 else 00135 byte |= (r<<1); 00136 _cs = 0; wait_us(2); 00137 _spi.write(RANGE & 0x7F); 00138 _spi.write(byte); 00139 _cs = 1; wait_us(2); 00140 00141 byte = read(CTRL_REG0); //lock image writing 00142 _cs = 0; wait_us(2); 00143 _spi.write(CTRL_REG0 & 0x7F); 00144 _spi.write(byte & 0xEF); 00145 _cs = 1; wait_us(2); 00146 } 00147 void BMA180::bw(int r){ 00148 char byte; 00149 00150 byte = read(CTRL_REG0); //unlock image writing 00151 _cs = 0; wait_us(2); 00152 _spi.write(CTRL_REG0 & 0x7F); 00153 _spi.write(byte | 0x10); 00154 _cs = 1; wait_us(2); 00155 00156 byte = read(BW); //bandwidth of acc 00157 byte &= 0x0F; 00158 if (r>9) 00159 byte |= 0x70; 00160 else 00161 byte |= (r<<4); 00162 _cs = 0; wait_us(2); 00163 _spi.write(BW & 0x7F); 00164 _spi.write(byte); 00165 _cs = 1; wait_us(2); 00166 00167 byte = read(CTRL_REG0); //lock image writing 00168 _cs = 0; wait_us(2); 00169 _spi.write(CTRL_REG0 & 0x7F); 00170 _spi.write(byte & 0xEF); 00171 _cs = 1; wait_us(2); 00172 } 00173 00174 void BMA180::init() { 00175 char byte; 00176 wait_us(10000); 00177 byte = read(CTRL_REG0); //unlock image writing 00178 _cs = 0; wait_us(2); 00179 _spi.write(CTRL_REG0 & 0x7F); 00180 _spi.write(byte | 0x10); 00181 _cs = 1; wait_us(2); 00182 00183 byte = read(DIS_I2C); //disable I2C 00184 _cs = 0; wait_us(2); 00185 _spi.write(DIS_I2C & 0x7F); 00186 _spi.write(byte | 0x01); 00187 _cs = 1; wait_us(2); 00188 00189 byte = read(MODE); //mode of acc 00190 _cs = 0; wait_us(2); 00191 _spi.write(MODE & 0x7F); 00192 _spi.write(byte & 0xFC); 00193 _cs = 1; wait_us(2); 00194 00195 byte = read(CTRL_REG0); //lock image writing 00196 _cs = 0; wait_us(2); 00197 _spi.write(CTRL_REG0 & 0x7F); 00198 _spi.write(byte & 0xEF); 00199 _cs = 1; wait_us(2); 00200 }
Generated on Wed Jul 13 2022 23:20:56 by 1.7.2