Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Sample_manerine_SPI_LSM9DS0 by
main.cpp@7:f53b52e23818, 2017-02-13 (annotated)
- Committer:
- open4416
- Date:
- Mon Feb 13 07:38:06 2017 +0000
- Revision:
- 7:f53b52e23818
- Parent:
- 6:c2efb0a3a543
works fine on STM
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| open4416 | 0:d68e088dfbcd | 1 | #include "mbed.h" |
| open4416 | 1:b42c3522a50a | 2 | #include "LSM9DS0_SH.h" |
| open4416 | 4:b9dd320947ff | 3 | |
| open4416 | 4:b9dd320947ff | 4 | #define pi 3.141592f |
| open4416 | 3:502b83f7761c | 5 | #define d2r 0.01745329f |
| open4416 | 4:b9dd320947ff | 6 | |
| open4416 | 4:b9dd320947ff | 7 | #define Rms 5000 //TT rate |
| open4416 | 5:2f0633d8fc20 | 8 | #define dt 0.005f |
| open4416 | 4:b9dd320947ff | 9 | #define NN 200 |
| open4416 | 4:b9dd320947ff | 10 | |
| open4416 | 6:c2efb0a3a543 | 11 | #define Kp 3.6f |
| open4416 | 6:c2efb0a3a543 | 12 | #define Ki 5.0f |
| open4416 | 6:c2efb0a3a543 | 13 | #define Kd 0.12f |
| open4416 | 6:c2efb0a3a543 | 14 | #define Kcon 0.00f |
| open4416 | 6:c2efb0a3a543 | 15 | |
| open4416 | 1:b42c3522a50a | 16 | #define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt))) |
| open4416 | 0:d68e088dfbcd | 17 | |
| open4416 | 1:b42c3522a50a | 18 | //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓GPIO registor↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// |
| open4416 | 1:b42c3522a50a | 19 | //~~~structure~~~// |
| open4416 | 1:b42c3522a50a | 20 | DigitalOut led(D13); //detection |
| open4416 | 1:b42c3522a50a | 21 | DigitalOut TT_ext(D12); |
| open4416 | 1:b42c3522a50a | 22 | |
| open4416 | 2:0d90c0436797 | 23 | //~~~IMU_SPI~~~// |
| open4416 | 1:b42c3522a50a | 24 | DigitalOut SPI_CSG(D7,1); //low for GYRO enable |
| open4416 | 1:b42c3522a50a | 25 | DigitalOut SPI_CSXM(D6,1); //low for ACC/MAG enable |
| open4416 | 1:b42c3522a50a | 26 | SPI spi(D4, D5, D3); //MOSI MISO SCLK |
| open4416 | 1:b42c3522a50a | 27 | |
| open4416 | 1:b42c3522a50a | 28 | //~~~Serial~~~// |
| open4416 | 1:b42c3522a50a | 29 | Serial pc(D1, D0); //Serial reg(TX RX) |
| open4416 | 4:b9dd320947ff | 30 | //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑end of GPIO registor↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑// |
| open4416 | 1:b42c3522a50a | 31 | |
| open4416 | 0:d68e088dfbcd | 32 | |
| open4416 | 0:d68e088dfbcd | 33 | |
| open4416 | 4:b9dd320947ff | 34 | //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓Varible registor↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// |
| open4416 | 1:b42c3522a50a | 35 | //~~~globle~~~// |
| open4416 | 1:b42c3522a50a | 36 | Ticker TT; //call a timer |
| open4416 | 1:b42c3522a50a | 37 | int count = 0; //one second counter for extrenal led blink |
| open4416 | 2:0d90c0436797 | 38 | |
| open4416 | 2:0d90c0436797 | 39 | //~~~IMU_SPI~~~// |
| open4416 | 3:502b83f7761c | 40 | short low_byte = 0x00; //buffer |
| open4416 | 2:0d90c0436797 | 41 | short high_byte = 0x00; |
| open4416 | 3:502b83f7761c | 42 | short Buff = 0x00; |
| open4416 | 3:502b83f7761c | 43 | float Wx = 0.0; |
| open4416 | 3:502b83f7761c | 44 | float Wy = 0.0; |
| open4416 | 3:502b83f7761c | 45 | float Wz = 0.0; |
| open4416 | 3:502b83f7761c | 46 | float Ax = 0.0; |
| open4416 | 3:502b83f7761c | 47 | float Ay = 0.0; |
| open4416 | 3:502b83f7761c | 48 | float Az = 0.0; |
| open4416 | 1:b42c3522a50a | 49 | //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑end of Varible registor↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑// |
| open4416 | 1:b42c3522a50a | 50 | |
| open4416 | 0:d68e088dfbcd | 51 | |
| open4416 | 0:d68e088dfbcd | 52 | |
| open4416 | 1:b42c3522a50a | 53 | //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓Function registor↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// |
| open4416 | 4:b9dd320947ff | 54 | void init_TIMER(); //set TT_main() rate |
| open4416 | 4:b9dd320947ff | 55 | void TT_main(); //timebase function rated by TT |
| open4416 | 4:b9dd320947ff | 56 | void init_IO(); //initialize IO state |
| open4416 | 7:f53b52e23818 | 57 | |
| open4416 | 4:b9dd320947ff | 58 | void init_IMU(); //initialize IMU |
| open4416 | 4:b9dd320947ff | 59 | void read_IMU(); //read IMU data give raw data |
| open4416 | 4:b9dd320947ff | 60 | |
| open4416 | 4:b9dd320947ff | 61 | float lpf(float input, float output_old, float frequency); //lpf discrete |
| open4416 | 1:b42c3522a50a | 62 | //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑end of Function registor↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑// |
| open4416 | 1:b42c3522a50a | 63 | |
| open4416 | 1:b42c3522a50a | 64 | |
| open4416 | 1:b42c3522a50a | 65 | |
| open4416 | 1:b42c3522a50a | 66 | //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓main funtion↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// |
| open4416 | 0:d68e088dfbcd | 67 | int main() |
| open4416 | 0:d68e088dfbcd | 68 | { |
| open4416 | 4:b9dd320947ff | 69 | pc.baud(115200); //set baud rate |
| open4416 | 0:d68e088dfbcd | 70 | |
| open4416 | 4:b9dd320947ff | 71 | init_IO(); //initialized value |
| open4416 | 4:b9dd320947ff | 72 | init_IMU(); //initialize IMU |
| open4416 | 4:b9dd320947ff | 73 | |
| open4416 | 4:b9dd320947ff | 74 | init_TIMER(); //start TT_main |
| open4416 | 4:b9dd320947ff | 75 | |
| open4416 | 4:b9dd320947ff | 76 | while(1) { //main() loop |
| open4416 | 4:b9dd320947ff | 77 | if(count >= NN) { //check if main working |
| open4416 | 0:d68e088dfbcd | 78 | count=0; |
| open4416 | 0:d68e088dfbcd | 79 | led = !led; |
| open4416 | 0:d68e088dfbcd | 80 | } |
| open4416 | 1:b42c3522a50a | 81 | } |
| open4416 | 0:d68e088dfbcd | 82 | |
| open4416 | 0:d68e088dfbcd | 83 | } |
| open4416 | 1:b42c3522a50a | 84 | //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑end of main funtion↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑// |
| open4416 | 0:d68e088dfbcd | 85 | |
| open4416 | 0:d68e088dfbcd | 86 | |
| open4416 | 0:d68e088dfbcd | 87 | |
| open4416 | 3:502b83f7761c | 88 | //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓Timebase funtion↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// |
| open4416 | 3:502b83f7761c | 89 | void init_TIMER() //set TT_main{} rate |
| open4416 | 3:502b83f7761c | 90 | { |
| open4416 | 3:502b83f7761c | 91 | TT.attach_us(&TT_main, Rms); |
| open4416 | 3:502b83f7761c | 92 | } |
| open4416 | 3:502b83f7761c | 93 | void TT_main() //interrupt function by TT |
| open4416 | 3:502b83f7761c | 94 | { |
| open4416 | 3:502b83f7761c | 95 | TT_ext = !TT_ext; //indicate TT_main() function working |
| open4416 | 3:502b83f7761c | 96 | count = count+1; //one second counter |
| open4416 | 3:502b83f7761c | 97 | |
| open4416 | 3:502b83f7761c | 98 | read_IMU(); //read IMU data give raw data |
| open4416 | 4:b9dd320947ff | 99 | |
| open4416 | 7:f53b52e23818 | 100 | //for Serial-Oscilloscope |
| open4416 | 7:f53b52e23818 | 101 | pc.printf("%.2f,%.2f,%.2f\r", Ax, Ay, Az); |
| open4416 | 4:b9dd320947ff | 102 | |
| open4416 | 3:502b83f7761c | 103 | } |
| open4416 | 4:b9dd320947ff | 104 | //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑end of Timebase funtion↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑// |
| open4416 | 3:502b83f7761c | 105 | |
| open4416 | 3:502b83f7761c | 106 | |
| open4416 | 3:502b83f7761c | 107 | |
| open4416 | 4:b9dd320947ff | 108 | //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓init_IO funtion↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// |
| open4416 | 1:b42c3522a50a | 109 | void init_IO(void) //initialize |
| open4416 | 1:b42c3522a50a | 110 | { |
| open4416 | 1:b42c3522a50a | 111 | TT_ext = 0; |
| open4416 | 1:b42c3522a50a | 112 | led = 1; |
| open4416 | 1:b42c3522a50a | 113 | } |
| open4416 | 4:b9dd320947ff | 114 | //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑end of init_IO funtion↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑// |
| open4416 | 0:d68e088dfbcd | 115 | |
| open4416 | 0:d68e088dfbcd | 116 | |
| open4416 | 0:d68e088dfbcd | 117 | |
| open4416 | 4:b9dd320947ff | 118 | //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓init_IMU funtion↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// |
| open4416 | 3:502b83f7761c | 119 | void init_IMU(void) //initialize |
| open4416 | 0:d68e088dfbcd | 120 | { |
| open4416 | 3:502b83f7761c | 121 | //gloable config |
| open4416 | 1:b42c3522a50a | 122 | SPI_CSXM = 1; //high as init for disable SPI |
| open4416 | 1:b42c3522a50a | 123 | SPI_CSG = 1; |
| open4416 | 6:c2efb0a3a543 | 124 | spi.format(8, 3); //byte width, spi mode |
| open4416 | 1:b42c3522a50a | 125 | spi.frequency(4000000); //8MHz |
| open4416 | 1:b42c3522a50a | 126 | |
| open4416 | 3:502b83f7761c | 127 | //for GYRO config |
| open4416 | 1:b42c3522a50a | 128 | SPI_CSG = 0; //start spi talking |
| open4416 | 1:b42c3522a50a | 129 | spi.write(CTRL_REG1_G); |
| open4416 | 1:b42c3522a50a | 130 | spi.write(0x9F); //data rate 380 Hz/ cut off 25 Hz |
| open4416 | 1:b42c3522a50a | 131 | SPI_CSG = 1; //end spi talking |
| open4416 | 1:b42c3522a50a | 132 | |
| open4416 | 1:b42c3522a50a | 133 | SPI_CSG = 0; //start spi talking |
| open4416 | 1:b42c3522a50a | 134 | spi.write(CTRL_REG4_G); |
| open4416 | 1:b42c3522a50a | 135 | spi.write(0x10); //Scle 500dps |
| open4416 | 1:b42c3522a50a | 136 | SPI_CSG = 1; //end spi talking |
| open4416 | 1:b42c3522a50a | 137 | |
| open4416 | 3:502b83f7761c | 138 | //for ACC config |
| open4416 | 1:b42c3522a50a | 139 | SPI_CSXM = 0; //start spi talking |
| open4416 | 1:b42c3522a50a | 140 | spi.write(CTRL_REG1_XM); |
| open4416 | 1:b42c3522a50a | 141 | spi.write(0x87); //data rate 400 Hz/ Enable |
| open4416 | 1:b42c3522a50a | 142 | SPI_CSXM = 1; //end spi talking |
| open4416 | 1:b42c3522a50a | 143 | |
| open4416 | 1:b42c3522a50a | 144 | SPI_CSXM = 0; //start spi talking |
| open4416 | 1:b42c3522a50a | 145 | spi.write(CTRL_REG2_XM); |
| open4416 | 3:502b83f7761c | 146 | spi.write(0xC8); //cut off 50 Hz/ Scale +-4g |
| open4416 | 1:b42c3522a50a | 147 | SPI_CSXM = 1; //end spi talking |
| open4416 | 0:d68e088dfbcd | 148 | } |
| open4416 | 4:b9dd320947ff | 149 | //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑end of init_IMU funtion↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑// |
| open4416 | 0:d68e088dfbcd | 150 | |
| open4416 | 0:d68e088dfbcd | 151 | |
| open4416 | 0:d68e088dfbcd | 152 | |
| open4416 | 4:b9dd320947ff | 153 | //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓read_IMU funtion↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// |
| open4416 | 3:502b83f7761c | 154 | void read_IMU(void) //read IMU data give raw data |
| open4416 | 0:d68e088dfbcd | 155 | { |
| open4416 | 3:502b83f7761c | 156 | //Wx |
| open4416 | 3:502b83f7761c | 157 | SPI_CSG = 0; //start spi talking Wx |
| open4416 | 3:502b83f7761c | 158 | spi.write(0xE8); //read B11101000 read/multi/address |
| open4416 | 3:502b83f7761c | 159 | low_byte = spi.write(0); |
| open4416 | 3:502b83f7761c | 160 | high_byte = spi.write(0); |
| open4416 | 3:502b83f7761c | 161 | Buff = high_byte << 8 |low_byte; |
| open4416 | 3:502b83f7761c | 162 | SPI_CSG = 1; //end spi talking |
| open4416 | 4:b9dd320947ff | 163 | // Wx = Buff * Gpx + Gdx; |
| open4416 | 7:f53b52e23818 | 164 | Wx = lpf(Buff * Gpx, Wx, 48.0f); |
| open4416 | 3:502b83f7761c | 165 | //Wy |
| open4416 | 3:502b83f7761c | 166 | SPI_CSG = 0; //start spi talking Wx |
| open4416 | 3:502b83f7761c | 167 | spi.write(0xEA); //read B11101010 read/multi/address |
| open4416 | 3:502b83f7761c | 168 | low_byte = spi.write(0); |
| open4416 | 3:502b83f7761c | 169 | high_byte = spi.write(0); |
| open4416 | 3:502b83f7761c | 170 | Buff = high_byte << 8 |low_byte; |
| open4416 | 3:502b83f7761c | 171 | SPI_CSG = 1; //end spi talking |
| open4416 | 4:b9dd320947ff | 172 | // Wy = Buff * Gpy + Gdy; |
| open4416 | 7:f53b52e23818 | 173 | Wy = lpf(Buff * Gpy, Wy, 48.0f); |
| open4416 | 3:502b83f7761c | 174 | //Wz |
| open4416 | 3:502b83f7761c | 175 | SPI_CSG = 0; //start spi talking Wx |
| open4416 | 3:502b83f7761c | 176 | spi.write(0xEC); //read B11101100 read/multi/address |
| open4416 | 3:502b83f7761c | 177 | low_byte = spi.write(0); |
| open4416 | 3:502b83f7761c | 178 | high_byte = spi.write(0); |
| open4416 | 3:502b83f7761c | 179 | Buff = high_byte << 8 |low_byte; |
| open4416 | 3:502b83f7761c | 180 | SPI_CSG = 1; //end spi talking |
| open4416 | 4:b9dd320947ff | 181 | // Wz = Buff * Gpz + Gdz; |
| open4416 | 7:f53b52e23818 | 182 | Wz = lpf(Buff * Gpz, Wz, 48.0f); |
| open4416 | 3:502b83f7761c | 183 | //Ax |
| open4416 | 3:502b83f7761c | 184 | SPI_CSXM = 0; //start spi talking Ax |
| open4416 | 2:0d90c0436797 | 185 | spi.write(0xE8); //read B11101000 read/multi/address |
| open4416 | 2:0d90c0436797 | 186 | low_byte = spi.write(0); |
| open4416 | 2:0d90c0436797 | 187 | high_byte = spi.write(0); |
| open4416 | 3:502b83f7761c | 188 | Buff = high_byte << 8 |low_byte; |
| open4416 | 3:502b83f7761c | 189 | SPI_CSXM = 1; //end spi talking |
| open4416 | 7:f53b52e23818 | 190 | Ax = lpf(Buff * Apx, Ax, 13.0f); |
| open4416 | 3:502b83f7761c | 191 | //Ay |
| open4416 | 3:502b83f7761c | 192 | SPI_CSXM = 0; //start spi talking Ax |
| open4416 | 3:502b83f7761c | 193 | spi.write(0xEA); //read B11101010 read/multi/address |
| open4416 | 3:502b83f7761c | 194 | low_byte = spi.write(0); |
| open4416 | 3:502b83f7761c | 195 | high_byte = spi.write(0); |
| open4416 | 3:502b83f7761c | 196 | Buff = high_byte << 8 |low_byte; |
| open4416 | 3:502b83f7761c | 197 | SPI_CSXM = 1; //end spi talking |
| open4416 | 7:f53b52e23818 | 198 | Ay = lpf(Buff * Apy, Ay, 13.0f); |
| open4416 | 3:502b83f7761c | 199 | //Az |
| open4416 | 3:502b83f7761c | 200 | SPI_CSXM = 0; //start spi talking Ax |
| open4416 | 3:502b83f7761c | 201 | spi.write(0xEC); //read B11101100 read/multi/address |
| open4416 | 3:502b83f7761c | 202 | low_byte = spi.write(0); |
| open4416 | 3:502b83f7761c | 203 | high_byte = spi.write(0); |
| open4416 | 3:502b83f7761c | 204 | Buff = high_byte << 8 |low_byte; |
| open4416 | 3:502b83f7761c | 205 | SPI_CSXM = 1; //end spi talking |
| open4416 | 7:f53b52e23818 | 206 | Az = lpf(Buff * Apz, Az, 13.0f); |
| open4416 | 3:502b83f7761c | 207 | } |
| open4416 | 3:502b83f7761c | 208 | //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑end of read_IMU funtion↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑// |
| open4416 | 1:b42c3522a50a | 209 | |
| open4416 | 1:b42c3522a50a | 210 | |
| open4416 | 1:b42c3522a50a | 211 | |
| open4416 | 4:b9dd320947ff | 212 | //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓lpf funtion↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// |
| open4416 | 4:b9dd320947ff | 213 | float lpf(float input, float output_old, float frequency) |
| open4416 | 4:b9dd320947ff | 214 | { |
| open4416 | 4:b9dd320947ff | 215 | float output = 0; |
| open4416 | 4:b9dd320947ff | 216 | output = (output_old + frequency*dt*input) / (1 + frequency*dt); |
| open4416 | 4:b9dd320947ff | 217 | return output; |
| open4416 | 4:b9dd320947ff | 218 | } |
| open4416 | 4:b9dd320947ff | 219 | //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑end of lpf funtion↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑// |
