
/*============================================================================ MBED_MAX21105_2IMU_Burst Read data from 2 MAX21105 IMU Data return by serial command in burst mode Visarute Pinrod SonicMEMS Laboratory, ECE, Cornell University, Ithaca, NY, USA Novemver 16, 2015 ============================================================================*/
Dependencies: mbed
main.cpp@0:ee6b1953c19a, 2016-01-25 (annotated)
- Committer:
- visarute
- Date:
- Mon Jan 25 03:44:30 2016 +0000
- Revision:
- 0:ee6b1953c19a
MBED_MAX21105_2IMU_Burst; Read data from 2 MAX21105 IMU ; Data return by serial command in burst mode; Visarute Pinrod; SonicMEMS Laboratory, ECE, Cornell University, Ithaca, NY
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
visarute | 0:ee6b1953c19a | 1 | /*============================================================================ |
visarute | 0:ee6b1953c19a | 2 | MBED_MAX21105_2IMU_Burst |
visarute | 0:ee6b1953c19a | 3 | Read data from 2 MAX21105 IMU |
visarute | 0:ee6b1953c19a | 4 | Data return by serial command in burst mode |
visarute | 0:ee6b1953c19a | 5 | Visarute Pinrod |
visarute | 0:ee6b1953c19a | 6 | SonicMEMS Laboratory, ECE, Cornell University, Ithaca, NY, USA |
visarute | 0:ee6b1953c19a | 7 | Novemver 16, 2015 |
visarute | 0:ee6b1953c19a | 8 | ============================================================================*/ |
visarute | 0:ee6b1953c19a | 9 | |
visarute | 0:ee6b1953c19a | 10 | // Import library |
visarute | 0:ee6b1953c19a | 11 | #include "mbed.h" |
visarute | 0:ee6b1953c19a | 12 | #include "SPI.h" |
visarute | 0:ee6b1953c19a | 13 | #include "DigitalOut.h" |
visarute | 0:ee6b1953c19a | 14 | |
visarute | 0:ee6b1953c19a | 15 | // Define pinout |
visarute | 0:ee6b1953c19a | 16 | SPI spi1(p5, p6, p7); //mosi, miso, sck |
visarute | 0:ee6b1953c19a | 17 | SPI spi2(p11, p12, p13); //mosi, miso, sck |
visarute | 0:ee6b1953c19a | 18 | DigitalOut cs_MAX21105(p8); //cs for MAX21105 6Dof IMU |
visarute | 0:ee6b1953c19a | 19 | DigitalOut cs_MAX21105_2(p9); //cs for MAX21105 6Dof IMU |
visarute | 0:ee6b1953c19a | 20 | DigitalOut cs_MCP4921(p14); //cs for MCP4921 DAC for heater |
visarute | 0:ee6b1953c19a | 21 | DigitalOut cs_TSYS01st(p15); //cs for TSYS01 Temperature sensor for stage |
visarute | 0:ee6b1953c19a | 22 | |
visarute | 0:ee6b1953c19a | 23 | |
visarute | 0:ee6b1953c19a | 24 | // Object |
visarute | 0:ee6b1953c19a | 25 | Serial pc(USBTX, USBRX); // tx, rx |
visarute | 0:ee6b1953c19a | 26 | Timer t; |
visarute | 0:ee6b1953c19a | 27 | |
visarute | 0:ee6b1953c19a | 28 | // get value from command format |
visarute | 0:ee6b1953c19a | 29 | int getVal(char *cmd){ |
visarute | 0:ee6b1953c19a | 30 | int val=-1; |
visarute | 0:ee6b1953c19a | 31 | char valC[4]; |
visarute | 0:ee6b1953c19a | 32 | valC[0]=cmd[3]; |
visarute | 0:ee6b1953c19a | 33 | valC[1]=cmd[4]; |
visarute | 0:ee6b1953c19a | 34 | valC[2]=cmd[5]; |
visarute | 0:ee6b1953c19a | 35 | valC[3]=cmd[6]; |
visarute | 0:ee6b1953c19a | 36 | sscanf(valC,"%4x",&val); |
visarute | 0:ee6b1953c19a | 37 | return val; |
visarute | 0:ee6b1953c19a | 38 | } |
visarute | 0:ee6b1953c19a | 39 | |
visarute | 0:ee6b1953c19a | 40 | // Start SPI connection |
visarute | 0:ee6b1953c19a | 41 | void startSPI(){ |
visarute | 0:ee6b1953c19a | 42 | spi1.format(8,3); |
visarute | 0:ee6b1953c19a | 43 | spi1.frequency(1000000); |
visarute | 0:ee6b1953c19a | 44 | spi2.format(8,3); |
visarute | 0:ee6b1953c19a | 45 | spi2.frequency(1000000); |
visarute | 0:ee6b1953c19a | 46 | cs_MAX21105 = 1; |
visarute | 0:ee6b1953c19a | 47 | cs_MAX21105_2 = 1; |
visarute | 0:ee6b1953c19a | 48 | cs_MCP4921 = 1; |
visarute | 0:ee6b1953c19a | 49 | cs_TSYS01st = 1; |
visarute | 0:ee6b1953c19a | 50 | } |
visarute | 0:ee6b1953c19a | 51 | |
visarute | 0:ee6b1953c19a | 52 | // SPI write data to MAX21105 |
visarute | 0:ee6b1953c19a | 53 | void writeMAX21105(char addr, char value){ |
visarute | 0:ee6b1953c19a | 54 | cs_MAX21105 = 0; |
visarute | 0:ee6b1953c19a | 55 | spi1.write(addr); // MAX21100 Writing scheme |
visarute | 0:ee6b1953c19a | 56 | spi1.write(value); // MAX21100 Writing scheme |
visarute | 0:ee6b1953c19a | 57 | cs_MAX21105 = 1; |
visarute | 0:ee6b1953c19a | 58 | } |
visarute | 0:ee6b1953c19a | 59 | |
visarute | 0:ee6b1953c19a | 60 | // SPI read and return 8 bits data to MBED |
visarute | 0:ee6b1953c19a | 61 | char readMAX21105(char addr){ |
visarute | 0:ee6b1953c19a | 62 | char buf_u8; |
visarute | 0:ee6b1953c19a | 63 | cs_MAX21105 = 0; |
visarute | 0:ee6b1953c19a | 64 | spi1.write(0x80|addr); // MAX21100 Reading scheme |
visarute | 0:ee6b1953c19a | 65 | buf_u8 = spi1.write(0x0); // MAX21100 Reading scheme |
visarute | 0:ee6b1953c19a | 66 | cs_MAX21105 = 1; |
visarute | 0:ee6b1953c19a | 67 | return(buf_u8); |
visarute | 0:ee6b1953c19a | 68 | } |
visarute | 0:ee6b1953c19a | 69 | |
visarute | 0:ee6b1953c19a | 70 | // SPI write data to MAX21105 |
visarute | 0:ee6b1953c19a | 71 | void writeMAX21105_2(char addr, char value){ |
visarute | 0:ee6b1953c19a | 72 | cs_MAX21105_2 = 0; |
visarute | 0:ee6b1953c19a | 73 | spi2.write(addr); // MAX21100 Writing scheme |
visarute | 0:ee6b1953c19a | 74 | spi2.write(value); // MAX21100 Writing scheme |
visarute | 0:ee6b1953c19a | 75 | cs_MAX21105_2 = 1; |
visarute | 0:ee6b1953c19a | 76 | } |
visarute | 0:ee6b1953c19a | 77 | |
visarute | 0:ee6b1953c19a | 78 | // SPI read and return 8 bits data to MBED |
visarute | 0:ee6b1953c19a | 79 | char readMAX21105_2(char addr){ |
visarute | 0:ee6b1953c19a | 80 | char buf_u8; |
visarute | 0:ee6b1953c19a | 81 | cs_MAX21105_2 = 0; |
visarute | 0:ee6b1953c19a | 82 | spi2.write(0x80|addr); // MAX21100 Reading scheme |
visarute | 0:ee6b1953c19a | 83 | buf_u8 = spi2.write(0x0); // MAX21100 Reading scheme |
visarute | 0:ee6b1953c19a | 84 | cs_MAX21105_2 = 1; |
visarute | 0:ee6b1953c19a | 85 | return(buf_u8); |
visarute | 0:ee6b1953c19a | 86 | } |
visarute | 0:ee6b1953c19a | 87 | |
visarute | 0:ee6b1953c19a | 88 | void startMAX21105(){ |
visarute | 0:ee6b1953c19a | 89 | // Check MAX21105 conditions |
visarute | 0:ee6b1953c19a | 90 | char whoami = readMAX21105(0x20); // WHOAMI register |
visarute | 0:ee6b1953c19a | 91 | char buf = readMAX21105(0x21); // SILICON_REV_OTP register |
visarute | 0:ee6b1953c19a | 92 | |
visarute | 0:ee6b1953c19a | 93 | // Set MAX21105 options |
visarute | 0:ee6b1953c19a | 94 | writeMAX21105(0x00, 0x00); // SET_PWR 0x00 - Power down, |
visarute | 0:ee6b1953c19a | 95 | writeMAX21105(0x01, 0x03); // SNS_CFG_1 0x03 - LPF = 2kHz, SNS_DOUT_FSC=125 dps |
visarute | 0:ee6b1953c19a | 96 | writeMAX21105(0x02, 0x22); // SNS_CFG_2 0x22 - sns_gyr_ois_lpf=on, sns_odr=2000Hz |
visarute | 0:ee6b1953c19a | 97 | // writeMAX21105(0x02, 0x25); // SNS_CFG_2 0x25 - sns_gyr_ois_lpf=on, sns_odr=200Hz |
visarute | 0:ee6b1953c19a | 98 | // writeMAX21105(0x02, 0x06); // SNS_CFG_2 0x06 - sns_odr=100Hz |
visarute | 0:ee6b1953c19a | 99 | writeMAX21105(0x03, 0x00); // SNS_CFG_3 0x00 - sns_hpf_co = 0.08 Hz |
visarute | 0:ee6b1953c19a | 100 | writeMAX21105(0x04, 0xC0); // SET_ACC_PWR 0xC0 - sns_acc_fsc=2g |
visarute | 0:ee6b1953c19a | 101 | writeMAX21105(0x05, 0x30); // ACC_CFG1 0x30 acc_odr = 2000 Hz |
visarute | 0:ee6b1953c19a | 102 | // writeMAX21105(0x05, 0x33); // ACC_CFG1 0x33 acc_odr = 200 Hz |
visarute | 0:ee6b1953c19a | 103 | // writeMAX21105(0x05, 0x01); // ACC_CFG1 0x01 - acc_odr = 800 Hz |
visarute | 0:ee6b1953c19a | 104 | writeMAX21105(0x06, 0x01); // ACC_CFG2 0x01 Unfiltered |
visarute | 0:ee6b1953c19a | 105 | writeMAX21105(0x00, 0x78); // POWER_CFG 0x78 - accelero,gyro low noise |
visarute | 0:ee6b1953c19a | 106 | |
visarute | 0:ee6b1953c19a | 107 | writeMAX21105(0x13, 0x01); // SET_TEMP_DR 0x01 - enable temp, fine, dataready all |
visarute | 0:ee6b1953c19a | 108 | writeMAX21105(0x00, 0x78); // POWER_CFG 0x78 - accelero,gyro low noise |
visarute | 0:ee6b1953c19a | 109 | |
visarute | 0:ee6b1953c19a | 110 | pc.printf("[IMU_INITIAL_ST]"); |
visarute | 0:ee6b1953c19a | 111 | pc.printf("WHOAMI = 0x%X (MAX21105: B4)", whoami); //WhoAmI MAX21105 = B4 |
visarute | 0:ee6b1953c19a | 112 | pc.printf("REVISION_ID = 0x%X", buf); // Should be 0x00 |
visarute | 0:ee6b1953c19a | 113 | pc.printf("[IMU_INITIAL_ED]\n"); |
visarute | 0:ee6b1953c19a | 114 | } |
visarute | 0:ee6b1953c19a | 115 | |
visarute | 0:ee6b1953c19a | 116 | |
visarute | 0:ee6b1953c19a | 117 | void startMAX21105_2(){ |
visarute | 0:ee6b1953c19a | 118 | // Check MAX21105 conditions |
visarute | 0:ee6b1953c19a | 119 | char whoami = readMAX21105_2(0x20); // WHOAMI register |
visarute | 0:ee6b1953c19a | 120 | whoami = readMAX21105_2(0x20); |
visarute | 0:ee6b1953c19a | 121 | char buf = readMAX21105_2(0x21); // SILICON_REV_OTP register |
visarute | 0:ee6b1953c19a | 122 | |
visarute | 0:ee6b1953c19a | 123 | // Set MAX21105 options |
visarute | 0:ee6b1953c19a | 124 | writeMAX21105_2(0x00, 0x00); // SET_PWR 0x00 - Power down, |
visarute | 0:ee6b1953c19a | 125 | writeMAX21105_2(0x01, 0x03); // SNS_CFG_1 0x03 - LPF = 2kHz, SNS_DOUT_FSC=125 dps |
visarute | 0:ee6b1953c19a | 126 | writeMAX21105_2(0x02, 0x22); // SNS_CFG_2 0x22 - sns_gyr_ois_lpf=on, sns_odr=2000Hz |
visarute | 0:ee6b1953c19a | 127 | writeMAX21105_2(0x03, 0x00); // SNS_CFG_3 0x00 - sns_hpf_co = 0.08 Hz |
visarute | 0:ee6b1953c19a | 128 | writeMAX21105_2(0x04, 0xC0); // SET_ACC_PWR 0xC0 - sns_acc_fsc=2g |
visarute | 0:ee6b1953c19a | 129 | writeMAX21105_2(0x05, 0x30); // ACC_CFG1 0x30 acc_odr = 2000 Hz |
visarute | 0:ee6b1953c19a | 130 | writeMAX21105_2(0x06, 0x01); // ACC_CFG2 0x01 Unfiltered |
visarute | 0:ee6b1953c19a | 131 | writeMAX21105_2(0x00, 0x78); // POWER_CFG 0x78 - accelero,gyro low noise |
visarute | 0:ee6b1953c19a | 132 | writeMAX21105_2(0x13, 0x01); // SET_TEMP_DR 0x01 - enable temp, fine, dataready all |
visarute | 0:ee6b1953c19a | 133 | writeMAX21105_2(0x00, 0x78); // POWER_CFG 0x78 - accelero,gyro low noise |
visarute | 0:ee6b1953c19a | 134 | |
visarute | 0:ee6b1953c19a | 135 | pc.printf("[IMU_INITIAL_ST]"); |
visarute | 0:ee6b1953c19a | 136 | pc.printf("WHOAMI = 0x%X (MAX21105: B4)", whoami); //WhoAmI MAX21105 = B4 |
visarute | 0:ee6b1953c19a | 137 | pc.printf("REVISION_ID = 0x%X", buf); // Should be 0x00 |
visarute | 0:ee6b1953c19a | 138 | pc.printf("[IMU_INITIAL_ED]\n"); |
visarute | 0:ee6b1953c19a | 139 | } |
visarute | 0:ee6b1953c19a | 140 | |
visarute | 0:ee6b1953c19a | 141 | // Read 6 axis data |
visarute | 0:ee6b1953c19a | 142 | // See MAX21105 User guide for address and bit field description |
visarute | 0:ee6b1953c19a | 143 | void readMAX21105All(char *imuBuf,short imuCnt){ |
visarute | 0:ee6b1953c19a | 144 | // Variables for data from IMU |
visarute | 0:ee6b1953c19a | 145 | char con; // IMU status |
visarute | 0:ee6b1953c19a | 146 | short i; // Data point measurement loop variable |
visarute | 0:ee6b1953c19a | 147 | int time; |
visarute | 0:ee6b1953c19a | 148 | // Wait for connection and return data |
visarute | 0:ee6b1953c19a | 149 | t.start(); |
visarute | 0:ee6b1953c19a | 150 | t.reset(); |
visarute | 0:ee6b1953c19a | 151 | for(i=0;i<imuCnt;i++) { |
visarute | 0:ee6b1953c19a | 152 | while ((con = readMAX21105(0x23))==0); // wait until DATA_READY |
visarute | 0:ee6b1953c19a | 153 | imuBuf[0+18*i] = con; |
visarute | 0:ee6b1953c19a | 154 | imuBuf[1+18*i] = readMAX21105(0x24); // wX_H MSB Angular speed X |
visarute | 0:ee6b1953c19a | 155 | imuBuf[2+18*i] = readMAX21105(0x25); // wX_L LSB Angular speed X |
visarute | 0:ee6b1953c19a | 156 | imuBuf[3+18*i] = readMAX21105(0x26); // wY_H MSB Angular speed Y |
visarute | 0:ee6b1953c19a | 157 | imuBuf[4+18*i] = readMAX21105(0x27); // wY_L LSB Angular speed Y |
visarute | 0:ee6b1953c19a | 158 | imuBuf[5+18*i] = readMAX21105(0x28); // wZ_H MSB Angular speed Z |
visarute | 0:ee6b1953c19a | 159 | imuBuf[6+18*i] = readMAX21105(0x29); // wZ_L LSB Angular speed Z |
visarute | 0:ee6b1953c19a | 160 | |
visarute | 0:ee6b1953c19a | 161 | imuBuf[7+18*i] = readMAX21105(0x2A); // aX_H MSB Acceleration X |
visarute | 0:ee6b1953c19a | 162 | imuBuf[8+18*i] = readMAX21105(0x2B); // aX_L LSB Acceleration X |
visarute | 0:ee6b1953c19a | 163 | imuBuf[9+18*i] = readMAX21105(0x2C); //aY_H MSB Acceleration Y |
visarute | 0:ee6b1953c19a | 164 | imuBuf[10+18*i] = readMAX21105(0x2D); //aY_L LSB Acceleration Y |
visarute | 0:ee6b1953c19a | 165 | imuBuf[11+18*i] = readMAX21105(0x2E); //aZ_H MSB Acceleration Z |
visarute | 0:ee6b1953c19a | 166 | imuBuf[12+18*i] = readMAX21105(0x2F); //aZ_L LSB Acceleration Z |
visarute | 0:ee6b1953c19a | 167 | imuBuf[13+18*i] = readMAX21105(0x30); //TEMP_H MSB Temperature |
visarute | 0:ee6b1953c19a | 168 | imuBuf[14+18*i] = readMAX21105(0x31); //TEMP_L LSB Temperature |
visarute | 0:ee6b1953c19a | 169 | time=t.read_us(); |
visarute | 0:ee6b1953c19a | 170 | imuBuf[15+18*i] = (char)(time>>16&0xFF); //TEMP_L LSB Temperature |
visarute | 0:ee6b1953c19a | 171 | imuBuf[16+18*i] = (char)(time>>8&0xFF); //TEMP_L LSB Temperature |
visarute | 0:ee6b1953c19a | 172 | imuBuf[17+18*i] = (char)(time&0xFF); //TEMP_L LSB Temperature |
visarute | 0:ee6b1953c19a | 173 | } |
visarute | 0:ee6b1953c19a | 174 | t.stop(); |
visarute | 0:ee6b1953c19a | 175 | } |
visarute | 0:ee6b1953c19a | 176 | |
visarute | 0:ee6b1953c19a | 177 | // Send all axis data to PC |
visarute | 0:ee6b1953c19a | 178 | void sendPCAll(char *imuBuf,short imuCnt){ |
visarute | 0:ee6b1953c19a | 179 | pc.printf("[IMU_READALL_ST]"); |
visarute | 0:ee6b1953c19a | 180 | // Variables for data from IMU |
visarute | 0:ee6b1953c19a | 181 | char con; // IMU status |
visarute | 0:ee6b1953c19a | 182 | short i; // Data point measurement loop variable |
visarute | 0:ee6b1953c19a | 183 | |
visarute | 0:ee6b1953c19a | 184 | uint8_t wX_H, wX_L, wY_H, wY_L, wZ_H, wZ_L; // Angular speed MSB&LSB x,y,z |
visarute | 0:ee6b1953c19a | 185 | uint8_t aX_H, aX_L, aY_H, aY_L, aZ_H, aZ_L; // Acceleration MSB&LSB x,y,z |
visarute | 0:ee6b1953c19a | 186 | uint8_t temp_H, temp_L; |
visarute | 0:ee6b1953c19a | 187 | uint8_t time_H, time_M, time_L; |
visarute | 0:ee6b1953c19a | 188 | uint16_t wx, wy, wz, ax, ay, az, temp; // Full angular speed & acceleration |
visarute | 0:ee6b1953c19a | 189 | int time; |
visarute | 0:ee6b1953c19a | 190 | |
visarute | 0:ee6b1953c19a | 191 | // Wait for connection and return data |
visarute | 0:ee6b1953c19a | 192 | for(i=0;i<imuCnt;i++) { |
visarute | 0:ee6b1953c19a | 193 | con=imuBuf[0+18*i]; |
visarute | 0:ee6b1953c19a | 194 | wX_H = imuBuf[1+18*i]; // MSB Angular speed X |
visarute | 0:ee6b1953c19a | 195 | wX_L = imuBuf[2+18*i]; // LSB Angular speed X |
visarute | 0:ee6b1953c19a | 196 | wY_H = imuBuf[3+18*i]; // MSB Angular speed Y |
visarute | 0:ee6b1953c19a | 197 | wY_L = imuBuf[4+18*i]; // LSB Angular speed Y |
visarute | 0:ee6b1953c19a | 198 | wZ_H = imuBuf[5+18*i]; // MSB Angular speed Z |
visarute | 0:ee6b1953c19a | 199 | wZ_L = imuBuf[6+18*i]; // LSB Angular speed Z |
visarute | 0:ee6b1953c19a | 200 | |
visarute | 0:ee6b1953c19a | 201 | aX_H = imuBuf[7+18*i]; // MSB Acceleration X |
visarute | 0:ee6b1953c19a | 202 | aX_L = imuBuf[8+18*i]; // LSB Acceleration X |
visarute | 0:ee6b1953c19a | 203 | aY_H = imuBuf[9+18*i]; // MSB Acceleration Y |
visarute | 0:ee6b1953c19a | 204 | aY_L = imuBuf[10+18*i]; // LSB Acceleration Y |
visarute | 0:ee6b1953c19a | 205 | aZ_H = imuBuf[11+18*i]; // MSB Acceleration Z |
visarute | 0:ee6b1953c19a | 206 | aZ_L = imuBuf[12+18*i]; // LSB Acceleration Z |
visarute | 0:ee6b1953c19a | 207 | |
visarute | 0:ee6b1953c19a | 208 | temp_H = imuBuf[13+18*i]; // MSB Temperature |
visarute | 0:ee6b1953c19a | 209 | temp_L = imuBuf[14+18*i]; // LSB Temperature |
visarute | 0:ee6b1953c19a | 210 | |
visarute | 0:ee6b1953c19a | 211 | time_H = imuBuf[15+18*i]; // MSB Time |
visarute | 0:ee6b1953c19a | 212 | time_M = imuBuf[16+18*i]; // middle Time |
visarute | 0:ee6b1953c19a | 213 | time_L = imuBuf[17+18*i]; // LSB Time |
visarute | 0:ee6b1953c19a | 214 | |
visarute | 0:ee6b1953c19a | 215 | // Stack MSB and LSB together and send out thru serialPC |
visarute | 0:ee6b1953c19a | 216 | wx = (uint16_t)((uint16_t)wX_H<<8|(wX_L)); |
visarute | 0:ee6b1953c19a | 217 | wy = (uint16_t)((uint16_t)wY_H<<8|(wY_L)); |
visarute | 0:ee6b1953c19a | 218 | wz = (uint16_t)((uint16_t)wZ_H<<8|(wZ_L)); |
visarute | 0:ee6b1953c19a | 219 | ax = (uint16_t)((uint16_t)aX_H<<8|(aX_L)); |
visarute | 0:ee6b1953c19a | 220 | ay = (uint16_t)((uint16_t)aY_H<<8|(aY_L)); |
visarute | 0:ee6b1953c19a | 221 | az = (uint16_t)((uint16_t)aZ_H<<8|(aZ_L)); |
visarute | 0:ee6b1953c19a | 222 | temp = (uint16_t)((uint16_t)temp_H<<8|(temp_L)); |
visarute | 0:ee6b1953c19a | 223 | time = (int)((int)time_H<<16|(int)time_M<<8|(time_L)); |
visarute | 0:ee6b1953c19a | 224 | pc.printf("ST%01X%04X%04X%04X%04X%04X%04X%04X%06XED", |
visarute | 0:ee6b1953c19a | 225 | con, wx, wy, wz, ax, ay, az,temp,time); |
visarute | 0:ee6b1953c19a | 226 | } |
visarute | 0:ee6b1953c19a | 227 | pc.printf("[IMU_READALL_ED]"); |
visarute | 0:ee6b1953c19a | 228 | } |
visarute | 0:ee6b1953c19a | 229 | |
visarute | 0:ee6b1953c19a | 230 | void burstGMAX21105(){ |
visarute | 0:ee6b1953c19a | 231 | writeMAX21105(0x02, 0x24); // SNS_CFG_2 0x22 - sns_gyr_ois_lpf=on, sns_odr=2000Hz |
visarute | 0:ee6b1953c19a | 232 | writeMAX21105(0x05, 0x32); // SNS_CFG_2 0x22 - sns_gyr_ois_lpf=on, sns_odr=2000Hz |
visarute | 0:ee6b1953c19a | 233 | writeMAX21105(0x02, 0x24); // SNS_CFG_2 0x22 - sns_gyr_ois_lpf=on, sns_odr=2000Hz |
visarute | 0:ee6b1953c19a | 234 | writeMAX21105(0x05, 0x32); // SNS_CFG_2 0x22 - sns_gyr_ois_lpf=on, sns_odr=2000Hz |
visarute | 0:ee6b1953c19a | 235 | char con; // IMU status |
visarute | 0:ee6b1953c19a | 236 | char wX_H, wX_L, wY_H, wY_L, wZ_H, wZ_L; // Angular speed MSB&LSB x,y,z |
visarute | 0:ee6b1953c19a | 237 | char aX_H, aX_L, aY_H, aY_L, aZ_H, aZ_L; // Accel MSB&LSB x,y,z |
visarute | 0:ee6b1953c19a | 238 | int time; |
visarute | 0:ee6b1953c19a | 239 | t.start(); |
visarute | 0:ee6b1953c19a | 240 | t.reset(); |
visarute | 0:ee6b1953c19a | 241 | while(1){ |
visarute | 0:ee6b1953c19a | 242 | while ((con = readMAX21105(0x23))==0); // wait until DATA_READY |
visarute | 0:ee6b1953c19a | 243 | time=t.read_us(); |
visarute | 0:ee6b1953c19a | 244 | wX_H = readMAX21105(0x24); // wX_H MSB Angular speed X |
visarute | 0:ee6b1953c19a | 245 | wX_L = readMAX21105(0x25); // wX_L LSB Angular speed X |
visarute | 0:ee6b1953c19a | 246 | wY_H = readMAX21105(0x26); // wY_H MSB Angular speed Y |
visarute | 0:ee6b1953c19a | 247 | wY_L = readMAX21105(0x27); // wY_L LSB Angular speed Y |
visarute | 0:ee6b1953c19a | 248 | wZ_H = readMAX21105(0x28); // wZ_H MSB Angular speed Z |
visarute | 0:ee6b1953c19a | 249 | wZ_L = readMAX21105(0x29); // wZ_L LSB Angular speed Z |
visarute | 0:ee6b1953c19a | 250 | aX_H = readMAX21105(0x2A); // aX_H MSB Acceleration X |
visarute | 0:ee6b1953c19a | 251 | aX_L = readMAX21105(0x2B); // aX_L LSB Acceleration X |
visarute | 0:ee6b1953c19a | 252 | aY_H = readMAX21105(0x2C); //aY_H MSB Acceleration Y |
visarute | 0:ee6b1953c19a | 253 | aY_L = readMAX21105(0x2D); //aY_L LSB Acceleration Y |
visarute | 0:ee6b1953c19a | 254 | aZ_H = readMAX21105(0x2E); //aZ_H MSB Acceleration Z |
visarute | 0:ee6b1953c19a | 255 | aZ_L = readMAX21105(0x2F); //aZ_L LSB Acceleration Z |
visarute | 0:ee6b1953c19a | 256 | pc.printf("ST%01X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%08XED\n",con,wX_H,wX_L,wY_H,wY_L,wZ_H,wZ_L,aX_H,aX_L,aY_H,aY_L,aZ_H,aZ_L,time); |
visarute | 0:ee6b1953c19a | 257 | } |
visarute | 0:ee6b1953c19a | 258 | t.stop(); |
visarute | 0:ee6b1953c19a | 259 | } |
visarute | 0:ee6b1953c19a | 260 | |
visarute | 0:ee6b1953c19a | 261 | void burstMAX21105_2(){ |
visarute | 0:ee6b1953c19a | 262 | writeMAX21105(0x02, 0x24); // SNS_CFG_2 0x22 - sns_gyr_ois_lpf=on, sns_odr=400Hz |
visarute | 0:ee6b1953c19a | 263 | writeMAX21105(0x05, 0x32); // SNS_CFG_2 0x22 - sns_gyr_ois_lpf=on, sns_odr=400Hz |
visarute | 0:ee6b1953c19a | 264 | writeMAX21105(0x02, 0x24); // SNS_CFG_2 0x22 - sns_gyr_ois_lpf=on, sns_odr=400Hz |
visarute | 0:ee6b1953c19a | 265 | writeMAX21105(0x05, 0x32); // SNS_CFG_2 0x22 - sns_gyr_ois_lpf=on, sns_odr=400Hz |
visarute | 0:ee6b1953c19a | 266 | writeMAX21105_2(0x02, 0x24); // SNS_CFG_2 0x22 - sns_gyr_ois_lpf=on, sns_odr=400Hz |
visarute | 0:ee6b1953c19a | 267 | writeMAX21105_2(0x05, 0x32); // SNS_CFG_2 0x22 - sns_gyr_ois_lpf=on, sns_odr=400Hz |
visarute | 0:ee6b1953c19a | 268 | writeMAX21105_2(0x02, 0x24); // SNS_CFG_2 0x22 - sns_gyr_ois_lpf=on, sns_odr=400Hz |
visarute | 0:ee6b1953c19a | 269 | writeMAX21105_2(0x05, 0x32); // SNS_CFG_2 0x22 - sns_gyr_ois_lpf=on, sns_odr=400Hz |
visarute | 0:ee6b1953c19a | 270 | |
visarute | 0:ee6b1953c19a | 271 | char con; // IMU status |
visarute | 0:ee6b1953c19a | 272 | char wX_H, wX_L, wY_H, wY_L, wZ_H, wZ_L; // Angular speed MSB&LSB x,y,z |
visarute | 0:ee6b1953c19a | 273 | char aX_H, aX_L, aY_H, aY_L, aZ_H, aZ_L; // Accel MSB&LSB x,y,z |
visarute | 0:ee6b1953c19a | 274 | int time; |
visarute | 0:ee6b1953c19a | 275 | t.start(); |
visarute | 0:ee6b1953c19a | 276 | t.reset(); |
visarute | 0:ee6b1953c19a | 277 | while(1){ |
visarute | 0:ee6b1953c19a | 278 | con = readMAX21105(0x23); |
visarute | 0:ee6b1953c19a | 279 | if(con!=0){ // wait until DATA_READY |
visarute | 0:ee6b1953c19a | 280 | time=t.read_us(); |
visarute | 0:ee6b1953c19a | 281 | wX_H = readMAX21105(0x24); // wX_H MSB Angular speed X |
visarute | 0:ee6b1953c19a | 282 | wX_L = readMAX21105(0x25); // wX_L LSB Angular speed X |
visarute | 0:ee6b1953c19a | 283 | wY_H = readMAX21105(0x26); // wY_H MSB Angular speed Y |
visarute | 0:ee6b1953c19a | 284 | wY_L = readMAX21105(0x27); // wY_L LSB Angular speed Y |
visarute | 0:ee6b1953c19a | 285 | wZ_H = readMAX21105(0x28); // wZ_H MSB Angular speed Z |
visarute | 0:ee6b1953c19a | 286 | wZ_L = readMAX21105(0x29); // wZ_L LSB Angular speed Z |
visarute | 0:ee6b1953c19a | 287 | aX_H = readMAX21105(0x2A); // aX_H MSB Acceleration X |
visarute | 0:ee6b1953c19a | 288 | aX_L = readMAX21105(0x2B); // aX_L LSB Acceleration X |
visarute | 0:ee6b1953c19a | 289 | aY_H = readMAX21105(0x2C); //aY_H MSB Acceleration Y |
visarute | 0:ee6b1953c19a | 290 | aY_L = readMAX21105(0x2D); //aY_L LSB Acceleration Y |
visarute | 0:ee6b1953c19a | 291 | aZ_H = readMAX21105(0x2E); //aZ_H MSB Acceleration Z |
visarute | 0:ee6b1953c19a | 292 | aZ_L = readMAX21105(0x2F); //aZ_L LSB Acceleration Z |
visarute | 0:ee6b1953c19a | 293 | pc.printf("ST1%01X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%08XED\n",con,wX_H,wX_L,wY_H,wY_L,wZ_H,wZ_L,aX_H,aX_L,aY_H,aY_L,aZ_H,aZ_L,time); |
visarute | 0:ee6b1953c19a | 294 | } |
visarute | 0:ee6b1953c19a | 295 | |
visarute | 0:ee6b1953c19a | 296 | con = readMAX21105_2(0x23); |
visarute | 0:ee6b1953c19a | 297 | if(con!=0){ // wait until DATA_READY |
visarute | 0:ee6b1953c19a | 298 | time=t.read_us(); |
visarute | 0:ee6b1953c19a | 299 | wX_H = readMAX21105_2(0x24); // wX_H MSB Angular speed X |
visarute | 0:ee6b1953c19a | 300 | wX_L = readMAX21105_2(0x25); // wX_L LSB Angular speed X |
visarute | 0:ee6b1953c19a | 301 | wY_H = readMAX21105_2(0x26); // wY_H MSB Angular speed Y |
visarute | 0:ee6b1953c19a | 302 | wY_L = readMAX21105_2(0x27); // wY_L LSB Angular speed Y |
visarute | 0:ee6b1953c19a | 303 | wZ_H = readMAX21105_2(0x28); // wZ_H MSB Angular speed Z |
visarute | 0:ee6b1953c19a | 304 | wZ_L = readMAX21105_2(0x29); // wZ_L LSB Angular speed Z |
visarute | 0:ee6b1953c19a | 305 | aX_H = readMAX21105_2(0x2A); // aX_H MSB Acceleration X |
visarute | 0:ee6b1953c19a | 306 | aX_L = readMAX21105_2(0x2B); // aX_L LSB Acceleration X |
visarute | 0:ee6b1953c19a | 307 | aY_H = readMAX21105_2(0x2C); //aY_H MSB Acceleration Y |
visarute | 0:ee6b1953c19a | 308 | aY_L = readMAX21105_2(0x2D); //aY_L LSB Acceleration Y |
visarute | 0:ee6b1953c19a | 309 | aZ_H = readMAX21105_2(0x2E); //aZ_H MSB Acceleration Z |
visarute | 0:ee6b1953c19a | 310 | aZ_L = readMAX21105_2(0x2F); //aZ_L LSB Acceleration Z |
visarute | 0:ee6b1953c19a | 311 | pc.printf("ST2%01X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%08XED\n",con,wX_H,wX_L,wY_H,wY_L,wZ_H,wZ_L,aX_H,aX_L,aY_H,aY_L,aZ_H,aZ_L,time); |
visarute | 0:ee6b1953c19a | 312 | } |
visarute | 0:ee6b1953c19a | 313 | |
visarute | 0:ee6b1953c19a | 314 | } |
visarute | 0:ee6b1953c19a | 315 | t.stop(); |
visarute | 0:ee6b1953c19a | 316 | } |
visarute | 0:ee6b1953c19a | 317 | |
visarute | 0:ee6b1953c19a | 318 | void setMCP4921(int val){ |
visarute | 0:ee6b1953c19a | 319 | cs_MCP4921 = 0; // Select the device by seting chip select low |
visarute | 0:ee6b1953c19a | 320 | spi1.write(0x70|(0xF&(val>>8)));// Set MCP4921 value. 0x7000 prefix |
visarute | 0:ee6b1953c19a | 321 | spi1.write(0xFF&val); // Set MCP4921 value. 0x7000 prefix |
visarute | 0:ee6b1953c19a | 322 | cs_MCP4921 = 1; // Deselect the device |
visarute | 0:ee6b1953c19a | 323 | } |
visarute | 0:ee6b1953c19a | 324 | |
visarute | 0:ee6b1953c19a | 325 | void startTSYS01st(){ |
visarute | 0:ee6b1953c19a | 326 | // Select the device by seting chip select low |
visarute | 0:ee6b1953c19a | 327 | cs_TSYS01st = 0; |
visarute | 0:ee6b1953c19a | 328 | spi1.write(0x1E); // Reset |
visarute | 0:ee6b1953c19a | 329 | cs_TSYS01st=1; |
visarute | 0:ee6b1953c19a | 330 | wait(0.1); //2.8 ms reload |
visarute | 0:ee6b1953c19a | 331 | |
visarute | 0:ee6b1953c19a | 332 | uint8_t kH, kL, kA[8]; |
visarute | 0:ee6b1953c19a | 333 | char i; |
visarute | 0:ee6b1953c19a | 334 | |
visarute | 0:ee6b1953c19a | 335 | kA[0]=0xAA; |
visarute | 0:ee6b1953c19a | 336 | kA[1]=0xA8; |
visarute | 0:ee6b1953c19a | 337 | kA[2]=0xA6; |
visarute | 0:ee6b1953c19a | 338 | kA[3]=0xA4; |
visarute | 0:ee6b1953c19a | 339 | kA[4]=0xA2; |
visarute | 0:ee6b1953c19a | 340 | kA[5]=0xAC; |
visarute | 0:ee6b1953c19a | 341 | kA[6]=0xAE; |
visarute | 0:ee6b1953c19a | 342 | kA[7]=0xA0; |
visarute | 0:ee6b1953c19a | 343 | pc.printf("[TEMPS_COEFF_ST]"); |
visarute | 0:ee6b1953c19a | 344 | for(i=0;i<8;i++){ |
visarute | 0:ee6b1953c19a | 345 | cs_TSYS01st = 0; |
visarute | 0:ee6b1953c19a | 346 | spi1.write(kA[i]); // k0 read |
visarute | 0:ee6b1953c19a | 347 | kH=spi1.write(0x00); // k0_MSB |
visarute | 0:ee6b1953c19a | 348 | kL=spi1.write(0x00); // k0_LSB |
visarute | 0:ee6b1953c19a | 349 | pc.printf("%02X%02X",kH,kL); |
visarute | 0:ee6b1953c19a | 350 | cs_TSYS01st = 1; |
visarute | 0:ee6b1953c19a | 351 | } |
visarute | 0:ee6b1953c19a | 352 | pc.printf("[TEMPS_COEFF_ED]"); |
visarute | 0:ee6b1953c19a | 353 | } |
visarute | 0:ee6b1953c19a | 354 | |
visarute | 0:ee6b1953c19a | 355 | void readTSYS01st(){ |
visarute | 0:ee6b1953c19a | 356 | uint8_t t[3]; |
visarute | 0:ee6b1953c19a | 357 | cs_TSYS01st = 0; |
visarute | 0:ee6b1953c19a | 358 | spi1.write(0x48); // k0 read |
visarute | 0:ee6b1953c19a | 359 | wait(0.1); |
visarute | 0:ee6b1953c19a | 360 | cs_TSYS01st = 1; |
visarute | 0:ee6b1953c19a | 361 | |
visarute | 0:ee6b1953c19a | 362 | cs_TSYS01st = 0; |
visarute | 0:ee6b1953c19a | 363 | spi1.write(0x00); // k0 read |
visarute | 0:ee6b1953c19a | 364 | t[0]=spi1.write(0x00); // k0 read |
visarute | 0:ee6b1953c19a | 365 | t[1]=spi1.write(0x00); // k0 read |
visarute | 0:ee6b1953c19a | 366 | t[2]=spi1.write(0x00); // k0 read |
visarute | 0:ee6b1953c19a | 367 | cs_TSYS01st = 1; |
visarute | 0:ee6b1953c19a | 368 | pc.printf("[TEMPS_VALUE_ST]"); |
visarute | 0:ee6b1953c19a | 369 | pc.printf("%02X%02X%02X",t[0],t[1],t[2]); |
visarute | 0:ee6b1953c19a | 370 | pc.printf("[TEMPS_VALUE_ED]"); |
visarute | 0:ee6b1953c19a | 371 | } |
visarute | 0:ee6b1953c19a | 372 | |
visarute | 0:ee6b1953c19a | 373 | // Start connection |
visarute | 0:ee6b1953c19a | 374 | void initialization(){ |
visarute | 0:ee6b1953c19a | 375 | //pc.baud(921600); |
visarute | 0:ee6b1953c19a | 376 | pc.baud(460800); |
visarute | 0:ee6b1953c19a | 377 | |
visarute | 0:ee6b1953c19a | 378 | startSPI(); // Start SPI connection |
visarute | 0:ee6b1953c19a | 379 | startMAX21105(); // Connect to MAX21105 |
visarute | 0:ee6b1953c19a | 380 | startMAX21105_2(); |
visarute | 0:ee6b1953c19a | 381 | } |
visarute | 0:ee6b1953c19a | 382 | |
visarute | 0:ee6b1953c19a | 383 | int main(){ |
visarute | 0:ee6b1953c19a | 384 | // Variable for main function |
visarute | 0:ee6b1953c19a | 385 | char buf[16]; // Buffer for the command from PC |
visarute | 0:ee6b1953c19a | 386 | char imuBuf[28800]; // Buffer for IMU output |
visarute | 0:ee6b1953c19a | 387 | short imuCnt=1600; // # of Point read from imu |
visarute | 0:ee6b1953c19a | 388 | int val; // Value from command |
visarute | 0:ee6b1953c19a | 389 | |
visarute | 0:ee6b1953c19a | 390 | // Start system |
visarute | 0:ee6b1953c19a | 391 | initialization(); |
visarute | 0:ee6b1953c19a | 392 | // Infinite loop: listen to serial command |
visarute | 0:ee6b1953c19a | 393 | while(1) { |
visarute | 0:ee6b1953c19a | 394 | if (pc.readable()) { |
visarute | 0:ee6b1953c19a | 395 | //Command format: Start Mode Submode VALUe enD S F F FFFF D |
visarute | 0:ee6b1953c19a | 396 | pc.gets(buf, 16); |
visarute | 0:ee6b1953c19a | 397 | //pc.printf("Get buf: %s\n",buf); |
visarute | 0:ee6b1953c19a | 398 | if ((buf[0] == 'S')&&(buf[7] == 'D')) { |
visarute | 0:ee6b1953c19a | 399 | //Mode switch |
visarute | 0:ee6b1953c19a | 400 | switch(buf[1]) { |
visarute | 0:ee6b1953c19a | 401 | //read all axis mode |
visarute | 0:ee6b1953c19a | 402 | case 'r': |
visarute | 0:ee6b1953c19a | 403 | // Submode switch |
visarute | 0:ee6b1953c19a | 404 | switch(buf[2]) { |
visarute | 0:ee6b1953c19a | 405 | case 'a': |
visarute | 0:ee6b1953c19a | 406 | readMAX21105All(imuBuf,imuCnt); |
visarute | 0:ee6b1953c19a | 407 | sendPCAll(imuBuf,imuCnt); |
visarute | 0:ee6b1953c19a | 408 | pc.printf("\n"); |
visarute | 0:ee6b1953c19a | 409 | break; |
visarute | 0:ee6b1953c19a | 410 | case 'm': |
visarute | 0:ee6b1953c19a | 411 | readMAX21105All(imuBuf,imuCnt); |
visarute | 0:ee6b1953c19a | 412 | sendPCAll(imuBuf,imuCnt); |
visarute | 0:ee6b1953c19a | 413 | readTSYS01st(); |
visarute | 0:ee6b1953c19a | 414 | pc.printf("\n"); |
visarute | 0:ee6b1953c19a | 415 | break; |
visarute | 0:ee6b1953c19a | 416 | case 'b': |
visarute | 0:ee6b1953c19a | 417 | burstGMAX21105(); |
visarute | 0:ee6b1953c19a | 418 | break; |
visarute | 0:ee6b1953c19a | 419 | case '2': |
visarute | 0:ee6b1953c19a | 420 | burstMAX21105_2(); |
visarute | 0:ee6b1953c19a | 421 | break; |
visarute | 0:ee6b1953c19a | 422 | default: |
visarute | 0:ee6b1953c19a | 423 | break; |
visarute | 0:ee6b1953c19a | 424 | } |
visarute | 0:ee6b1953c19a | 425 | //stage temperature |
visarute | 0:ee6b1953c19a | 426 | case 's': |
visarute | 0:ee6b1953c19a | 427 | // Submode switch |
visarute | 0:ee6b1953c19a | 428 | switch(buf[2]) { |
visarute | 0:ee6b1953c19a | 429 | case 's': |
visarute | 0:ee6b1953c19a | 430 | startTSYS01st(); |
visarute | 0:ee6b1953c19a | 431 | pc.printf("\n"); |
visarute | 0:ee6b1953c19a | 432 | break; |
visarute | 0:ee6b1953c19a | 433 | case 'r': |
visarute | 0:ee6b1953c19a | 434 | readTSYS01st(); |
visarute | 0:ee6b1953c19a | 435 | pc.printf("\n"); |
visarute | 0:ee6b1953c19a | 436 | break; |
visarute | 0:ee6b1953c19a | 437 | default: |
visarute | 0:ee6b1953c19a | 438 | break; |
visarute | 0:ee6b1953c19a | 439 | } |
visarute | 0:ee6b1953c19a | 440 | break; |
visarute | 0:ee6b1953c19a | 441 | //set heater |
visarute | 0:ee6b1953c19a | 442 | case 'h': |
visarute | 0:ee6b1953c19a | 443 | val = getVal(buf); |
visarute | 0:ee6b1953c19a | 444 | if(val!=-1){ |
visarute | 0:ee6b1953c19a | 445 | setMCP4921(val); |
visarute | 0:ee6b1953c19a | 446 | } |
visarute | 0:ee6b1953c19a | 447 | break; |
visarute | 0:ee6b1953c19a | 448 | default: |
visarute | 0:ee6b1953c19a | 449 | break; |
visarute | 0:ee6b1953c19a | 450 | } |
visarute | 0:ee6b1953c19a | 451 | } |
visarute | 0:ee6b1953c19a | 452 | } |
visarute | 0:ee6b1953c19a | 453 | } |
visarute | 0:ee6b1953c19a | 454 | return 0; |
visarute | 0:ee6b1953c19a | 455 | } |