Aditya Mehrotra
/
Sensor_Training_BoardV2
main.cpp@2:bdfce41aae53, 2021-11-16 (annotated)
- Committer:
- saloutos
- Date:
- Tue Nov 16 19:10:08 2021 +0000
- Revision:
- 2:bdfce41aae53
- Parent:
- 1:466049963f1f
- Child:
- 3:4dcadafb89a2
configured LTC chip for sampling 6 channels and added sampling from custom force sensor
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
adimmit | 0:63fac75e5afc | 1 | /* mbed Microcontroller Library |
adimmit | 0:63fac75e5afc | 2 | * Copyright (c) 2019 ARM Limited |
adimmit | 0:63fac75e5afc | 3 | * SPDX-License-Identifier: Apache-2.0 |
adimmit | 0:63fac75e5afc | 4 | */ |
adimmit | 0:63fac75e5afc | 5 | |
adimmit | 0:63fac75e5afc | 6 | #include "mbed.h" |
adimmit | 0:63fac75e5afc | 7 | #include "platform/mbed_thread.h" |
adimmit | 1:466049963f1f | 8 | #include "ltc_message.h" |
adimmit | 0:63fac75e5afc | 9 | #include <SPI.h> |
adimmit | 1:466049963f1f | 10 | #include "EthernetInterface.h" |
saloutos | 2:bdfce41aae53 | 11 | #include "bmp3.h" |
saloutos | 2:bdfce41aae53 | 12 | |
saloutos | 2:bdfce41aae53 | 13 | // overall loop time |
saloutos | 2:bdfce41aae53 | 14 | #define DT 0.005f //0.001f // 0.005f is 200Hz |
adimmit | 0:63fac75e5afc | 15 | |
adimmit | 0:63fac75e5afc | 16 | //SETUP THE LTC CHIP |
adimmit | 0:63fac75e5afc | 17 | #define LTC_MOSI PB_2 |
adimmit | 0:63fac75e5afc | 18 | #define LTC_MISO PC_11 |
adimmit | 0:63fac75e5afc | 19 | #define LTC_CLK PC_10 |
adimmit | 0:63fac75e5afc | 20 | #define LTC_CS PA_15 |
adimmit | 0:63fac75e5afc | 21 | #define BSY PB_5 |
adimmit | 0:63fac75e5afc | 22 | #define CNV PB_6 |
adimmit | 0:63fac75e5afc | 23 | |
saloutos | 2:bdfce41aae53 | 24 | #define BUFF_SIZE 18 //24 // 24, 8-bit words will come through |
saloutos | 2:bdfce41aae53 | 25 | #define NUM_CHANNELS 6 //8 // 8 total channels |
adimmit | 1:466049963f1f | 26 | #define CH_SIZE 3 // 3 words / channel |
adimmit | 0:63fac75e5afc | 27 | |
adimmit | 0:63fac75e5afc | 28 | SPI LTC_CHIP(LTC_MOSI, LTC_MISO, LTC_CLK); |
adimmit | 0:63fac75e5afc | 29 | DigitalOut cs_LTC(LTC_CS); |
adimmit | 0:63fac75e5afc | 30 | DigitalIn bsy_LTC(BSY); |
adimmit | 0:63fac75e5afc | 31 | DigitalOut CNV_PIN(CNV); |
adimmit | 0:63fac75e5afc | 32 | |
saloutos | 2:bdfce41aae53 | 33 | float CONV_FACTOR = 0.00031294782f; //--> for -10.24 --> 10.24V |
adimmit | 1:466049963f1f | 34 | |
adimmit | 0:63fac75e5afc | 35 | //SETUP REGISTERS |
adimmit | 1:466049963f1f | 36 | uint8_t rx_buff[BUFF_SIZE]; //each is an 8-bit word |
adimmit | 1:466049963f1f | 37 | ltc_spi adc_data; |
adimmit | 0:63fac75e5afc | 38 | |
adimmit | 0:63fac75e5afc | 39 | //setup SERIAL |
adimmit | 0:63fac75e5afc | 40 | Serial pc(USBTX, USBRX); |
adimmit | 0:63fac75e5afc | 41 | |
saloutos | 2:bdfce41aae53 | 42 | // set up IMU SPI bus? |
saloutos | 2:bdfce41aae53 | 43 | |
saloutos | 2:bdfce41aae53 | 44 | |
saloutos | 2:bdfce41aae53 | 45 | ////Setup ETHERNET |
saloutos | 2:bdfce41aae53 | 46 | //// Set up ethernet connection |
saloutos | 2:bdfce41aae53 | 47 | //const int SERVER_PORT = 2; |
saloutos | 2:bdfce41aae53 | 48 | //const char* SERVER_ADDRESS = "192.168.1.2"; // Adress of the other Mbed (Mbed B) |
saloutos | 2:bdfce41aae53 | 49 | //const int LOCAL_PORT = 1; |
saloutos | 2:bdfce41aae53 | 50 | //const char* ip = "192.168.1.1"; // Mbed A = 1; Mbed B = 2 |
saloutos | 2:bdfce41aae53 | 51 | //const char* mask = "255.255.255.0"; |
saloutos | 2:bdfce41aae53 | 52 | //const char* gateway = "192.168.1.10"; |
saloutos | 2:bdfce41aae53 | 53 | //EthernetInterface eth; // network stack |
saloutos | 2:bdfce41aae53 | 54 | //SocketAddress local; // local address |
saloutos | 2:bdfce41aae53 | 55 | //SocketAddress client; // client address (connection to other board) |
saloutos | 2:bdfce41aae53 | 56 | //UDPSocket server; // UDP socket (peripheral on this board) |
saloutos | 2:bdfce41aae53 | 57 | |
saloutos | 2:bdfce41aae53 | 58 | |
saloutos | 2:bdfce41aae53 | 59 | /// INITIALIZE SENSOR FOR TESTING HERE |
saloutos | 2:bdfce41aae53 | 60 | Timer timer; |
saloutos | 2:bdfce41aae53 | 61 | int begin, end; |
saloutos | 2:bdfce41aae53 | 62 | struct bmp3_dev s1; // sets up dev as a 'bmp3_dev structure' w/ associated variables |
saloutos | 2:bdfce41aae53 | 63 | struct bmp3_dev s2; |
saloutos | 2:bdfce41aae53 | 64 | struct bmp3_dev s3; |
saloutos | 2:bdfce41aae53 | 65 | struct bmp3_dev s4; |
saloutos | 2:bdfce41aae53 | 66 | struct bmp3_dev s5; |
saloutos | 2:bdfce41aae53 | 67 | struct bmp3_dev s6; |
saloutos | 2:bdfce41aae53 | 68 | struct bmp3_dev s7; |
saloutos | 2:bdfce41aae53 | 69 | struct bmp3_dev s8; |
saloutos | 2:bdfce41aae53 | 70 | // Sensor pins |
saloutos | 2:bdfce41aae53 | 71 | SPI sn_spi(PC_3, PC_2, PB_10); //Sensor SPI - mosi, miso, sclk |
saloutos | 2:bdfce41aae53 | 72 | DigitalOut dec_enable(PB_12); |
saloutos | 2:bdfce41aae53 | 73 | DigitalOut dec_bit0(PG_15); |
saloutos | 2:bdfce41aae53 | 74 | DigitalOut dec_bit1(PG_10); |
saloutos | 2:bdfce41aae53 | 75 | DigitalOut dec_bit2(PG_12); |
saloutos | 2:bdfce41aae53 | 76 | |
saloutos | 2:bdfce41aae53 | 77 | |
saloutos | 2:bdfce41aae53 | 78 | Ticker datalog; |
saloutos | 2:bdfce41aae53 | 79 | |
saloutos | 2:bdfce41aae53 | 80 | int sn_data[8]; |
saloutos | 2:bdfce41aae53 | 81 | |
saloutos | 2:bdfce41aae53 | 82 | bool tickerActivated = false; |
saloutos | 2:bdfce41aae53 | 83 | |
saloutos | 2:bdfce41aae53 | 84 | void log_data(){ |
saloutos | 2:bdfce41aae53 | 85 | tickerActivated = true; |
saloutos | 2:bdfce41aae53 | 86 | } |
saloutos | 2:bdfce41aae53 | 87 | |
saloutos | 2:bdfce41aae53 | 88 | void writeLow(uint8_t pin){ // modified for just 2 sensors |
saloutos | 2:bdfce41aae53 | 89 | dec_enable = 0; |
saloutos | 2:bdfce41aae53 | 90 | if (pin == 1){ |
saloutos | 2:bdfce41aae53 | 91 | dec_bit0 = 0; |
saloutos | 2:bdfce41aae53 | 92 | dec_bit1 = 0; |
saloutos | 2:bdfce41aae53 | 93 | dec_bit2 = 0; |
saloutos | 2:bdfce41aae53 | 94 | } |
saloutos | 2:bdfce41aae53 | 95 | else if (pin == 2){ |
saloutos | 2:bdfce41aae53 | 96 | dec_bit0 = 1; |
saloutos | 2:bdfce41aae53 | 97 | dec_bit1 = 0; |
saloutos | 2:bdfce41aae53 | 98 | dec_bit2 = 0; |
saloutos | 2:bdfce41aae53 | 99 | } |
saloutos | 2:bdfce41aae53 | 100 | else if (pin == 3){ |
saloutos | 2:bdfce41aae53 | 101 | dec_bit0 = 0; |
saloutos | 2:bdfce41aae53 | 102 | dec_bit1 = 1; |
saloutos | 2:bdfce41aae53 | 103 | dec_bit2 = 0; |
saloutos | 2:bdfce41aae53 | 104 | } |
saloutos | 2:bdfce41aae53 | 105 | else if (pin == 4){ |
saloutos | 2:bdfce41aae53 | 106 | dec_bit0 = 1; |
saloutos | 2:bdfce41aae53 | 107 | dec_bit1 = 1; |
saloutos | 2:bdfce41aae53 | 108 | dec_bit2 = 0; |
saloutos | 2:bdfce41aae53 | 109 | } |
saloutos | 2:bdfce41aae53 | 110 | else if (pin == 5){ |
saloutos | 2:bdfce41aae53 | 111 | dec_bit0 = 0; |
saloutos | 2:bdfce41aae53 | 112 | dec_bit1 = 0; |
saloutos | 2:bdfce41aae53 | 113 | dec_bit2 = 1; |
saloutos | 2:bdfce41aae53 | 114 | } |
saloutos | 2:bdfce41aae53 | 115 | else if (pin == 6){ |
saloutos | 2:bdfce41aae53 | 116 | dec_bit0 = 1; |
saloutos | 2:bdfce41aae53 | 117 | dec_bit1 = 0; |
saloutos | 2:bdfce41aae53 | 118 | dec_bit2 = 1; |
saloutos | 2:bdfce41aae53 | 119 | } |
saloutos | 2:bdfce41aae53 | 120 | else if (pin == 7){ |
saloutos | 2:bdfce41aae53 | 121 | dec_bit0 = 0; |
saloutos | 2:bdfce41aae53 | 122 | dec_bit1 = 1; |
saloutos | 2:bdfce41aae53 | 123 | dec_bit2 = 1; |
saloutos | 2:bdfce41aae53 | 124 | } |
saloutos | 2:bdfce41aae53 | 125 | else if (pin == 8){ |
saloutos | 2:bdfce41aae53 | 126 | dec_bit0 = 1; |
saloutos | 2:bdfce41aae53 | 127 | dec_bit1 = 1; |
saloutos | 2:bdfce41aae53 | 128 | dec_bit2 = 1; |
saloutos | 2:bdfce41aae53 | 129 | } |
saloutos | 2:bdfce41aae53 | 130 | } |
saloutos | 2:bdfce41aae53 | 131 | |
saloutos | 2:bdfce41aae53 | 132 | void writeHigh(){ |
saloutos | 2:bdfce41aae53 | 133 | dec_enable = 1; // write all pins high by disabling the decoder |
saloutos | 2:bdfce41aae53 | 134 | } |
adimmit | 1:466049963f1f | 135 | |
saloutos | 2:bdfce41aae53 | 136 | // General Read and Write functions |
saloutos | 2:bdfce41aae53 | 137 | // read function: |0x80 done in library, dummy byte taken care of in library |
saloutos | 2:bdfce41aae53 | 138 | static int8_t user_spi_read(uint8_t cspin, uint8_t reg_addr, uint8_t *reg_data, uint16_t len) { |
saloutos | 2:bdfce41aae53 | 139 | writeLow(cspin); |
saloutos | 2:bdfce41aae53 | 140 | sn_spi.write(reg_addr); // send read command to chip_id register (reg 0x00) |
saloutos | 2:bdfce41aae53 | 141 | for(int i = 0; i < len; i++){ |
saloutos | 2:bdfce41aae53 | 142 | *(reg_data+i) = sn_spi.write(0x00); // read in 2nd byte = chip_id |
saloutos | 2:bdfce41aae53 | 143 | } |
saloutos | 2:bdfce41aae53 | 144 | writeHigh(); |
saloutos | 2:bdfce41aae53 | 145 | return 0; |
saloutos | 2:bdfce41aae53 | 146 | } |
saloutos | 2:bdfce41aae53 | 147 | |
saloutos | 2:bdfce41aae53 | 148 | static int8_t user_spi_write(uint8_t cspin, uint8_t reg_addr, uint8_t *reg_data, uint16_t len) { |
saloutos | 2:bdfce41aae53 | 149 | writeLow(cspin); |
saloutos | 2:bdfce41aae53 | 150 | sn_spi.write(reg_addr); |
saloutos | 2:bdfce41aae53 | 151 | if (len>1) { |
saloutos | 2:bdfce41aae53 | 152 | for(int i = 0; i < len-1; i++){ |
saloutos | 2:bdfce41aae53 | 153 | sn_spi.write(*(reg_data+i)); // send alternating register address and register bytes in multi write |
saloutos | 2:bdfce41aae53 | 154 | } |
saloutos | 2:bdfce41aae53 | 155 | } |
saloutos | 2:bdfce41aae53 | 156 | else{ |
saloutos | 2:bdfce41aae53 | 157 | sn_spi.write(reg_data[0]); |
saloutos | 2:bdfce41aae53 | 158 | } |
saloutos | 2:bdfce41aae53 | 159 | writeHigh(); |
saloutos | 2:bdfce41aae53 | 160 | return 0; |
saloutos | 2:bdfce41aae53 | 161 | } |
saloutos | 2:bdfce41aae53 | 162 | |
saloutos | 2:bdfce41aae53 | 163 | void user_delay_ms(uint32_t msec){ //delay in milliseconds |
saloutos | 2:bdfce41aae53 | 164 | wait_ms(msec); |
saloutos | 2:bdfce41aae53 | 165 | } |
saloutos | 2:bdfce41aae53 | 166 | |
saloutos | 2:bdfce41aae53 | 167 | void config_dev(struct bmp3_dev *dev){ |
saloutos | 2:bdfce41aae53 | 168 | int8_t rslt=0;//BMP3_OK; // get error with rslt = BMP3_OK; |
saloutos | 2:bdfce41aae53 | 169 | |
saloutos | 2:bdfce41aae53 | 170 | dev -> intf = BMP3_SPI_INTF; |
saloutos | 2:bdfce41aae53 | 171 | dev -> read = &user_spi_read; // what to set here??? should be pointer to read function? &spi_read |
saloutos | 2:bdfce41aae53 | 172 | dev -> write = &user_spi_write;// what to set here??? should be pointer to write function? &spi_write |
saloutos | 2:bdfce41aae53 | 173 | dev -> delay_ms = &user_delay_ms;// what to set here??? delay in ms |
saloutos | 2:bdfce41aae53 | 174 | rslt = bmp3_init(dev); |
saloutos | 2:bdfce41aae53 | 175 | pc.printf("* initialize sensor result = 0x%x *\r\n", rslt); |
saloutos | 2:bdfce41aae53 | 176 | wait(0.25); |
saloutos | 2:bdfce41aae53 | 177 | |
saloutos | 2:bdfce41aae53 | 178 | // ***** Configuring settings of sensor |
saloutos | 2:bdfce41aae53 | 179 | // Normal Mode - bmp3_set_op_mode |
saloutos | 2:bdfce41aae53 | 180 | // Temp En, Press En |
saloutos | 2:bdfce41aae53 | 181 | // OSR = no oversampling temp, press |
saloutos | 2:bdfce41aae53 | 182 | // ODR = 200Hz temp, press |
saloutos | 2:bdfce41aae53 | 183 | // IRR = no IRR filter |
saloutos | 2:bdfce41aae53 | 184 | // ^^^all 4 above = bmp3_set_sensor_settings |
saloutos | 2:bdfce41aae53 | 185 | |
saloutos | 2:bdfce41aae53 | 186 | // Set sensor settings (press en, temp en, OSR, ODR, IRR) |
saloutos | 2:bdfce41aae53 | 187 | dev -> settings.press_en = 0x01; // BMP3_ENABLE |
saloutos | 2:bdfce41aae53 | 188 | dev -> settings.temp_en = 0x01; //BMP3_ENABLE |
saloutos | 2:bdfce41aae53 | 189 | dev -> settings.odr_filter.press_os = 0x00; //BMP3_NO_OVERSAMPLING |
saloutos | 2:bdfce41aae53 | 190 | dev -> settings.odr_filter.temp_os = 0x00; //BMP3_NO_OVERSAMPLING |
saloutos | 2:bdfce41aae53 | 191 | dev -> settings.odr_filter.odr = 0x00; //BMP3_ODR_200_HZ |
saloutos | 2:bdfce41aae53 | 192 | dev -> settings.odr_filter.iir_filter = 0x00; //BMP3_IIR_Filter_disable |
saloutos | 2:bdfce41aae53 | 193 | |
saloutos | 2:bdfce41aae53 | 194 | uint16_t settings_sel; |
saloutos | 2:bdfce41aae53 | 195 | //settings_sel = BMP3_PRESS_EN_SEL | BMP3_TEMP_EN_SEL | BMP3_PRESS_OS_SEL | BMP3_TEMP_OS_SEL | BMP3_IIR_FILTER_SEL | BMP3_ODR_SEL; |
saloutos | 2:bdfce41aae53 | 196 | settings_sel = uint16_t(1 << 1) | uint16_t(1 << 2) | uint16_t(1 << 4) | uint16_t(1 << 5) | uint16_t(1 << 6) | uint16_t(1 << 7); |
saloutos | 2:bdfce41aae53 | 197 | //settings_sel = uint16_t(1 << 1) | uint16_t(1 << 2); |
saloutos | 2:bdfce41aae53 | 198 | rslt = bmp3_set_sensor_settings(settings_sel, dev); |
saloutos | 2:bdfce41aae53 | 199 | |
saloutos | 2:bdfce41aae53 | 200 | // Set operating (power) mode |
saloutos | 2:bdfce41aae53 | 201 | dev -> settings.op_mode = 0x03; /// normal mode = 0x03 |
saloutos | 2:bdfce41aae53 | 202 | rslt = bmp3_set_op_mode(dev); |
saloutos | 2:bdfce41aae53 | 203 | |
saloutos | 2:bdfce41aae53 | 204 | // Check settings |
saloutos | 2:bdfce41aae53 | 205 | rslt = bmp3_get_sensor_settings(dev); |
saloutos | 2:bdfce41aae53 | 206 | } |
saloutos | 2:bdfce41aae53 | 207 | |
saloutos | 2:bdfce41aae53 | 208 | |
saloutos | 2:bdfce41aae53 | 209 | |
saloutos | 2:bdfce41aae53 | 210 | |
saloutos | 2:bdfce41aae53 | 211 | |
saloutos | 2:bdfce41aae53 | 212 | |
saloutos | 2:bdfce41aae53 | 213 | |
saloutos | 2:bdfce41aae53 | 214 | |
saloutos | 2:bdfce41aae53 | 215 | |
saloutos | 2:bdfce41aae53 | 216 | // calibration matrix for ATI sensor |
saloutos | 2:bdfce41aae53 | 217 | float Fxc[6] = {-0.1971322934773, -0.04349257334311, 2.298051028435, -80.35044049387, 1.362983909976, 78.23673392118}; |
saloutos | 2:bdfce41aae53 | 218 | float Fyc[6] = {-0.855555082028, 90.04004739944, -0.2236363056212, -46.22515556189, 0.4634720862657, -45.33866366008}; |
saloutos | 2:bdfce41aae53 | 219 | float Fzc[6] = {126.0118743229, -3.400673797001, 125.6239720415, -3.58428375801, 124.6128824882, -3.121863244239}; |
saloutos | 2:bdfce41aae53 | 220 | float Mxc[6] = {-0.03257086475743, 1.078228404461, -4.281073433774, -0.4388170286617, 4.26206973335, 7 - 0.6391561102933}; // check that these rows are x,y,z too |
saloutos | 2:bdfce41aae53 | 221 | float Myc[6] = {5.013689449541, -0.1348267445261, -2.487858919058, 1.036624778844, -2.465023328927, -0.8776820303935}; |
saloutos | 2:bdfce41aae53 | 222 | float Mzc[6] = {0.03045090196646, -2.681788264229, 0.06994993822276, -2.787067635975, -0.04822780843519, -2.696991001959}; |
saloutos | 2:bdfce41aae53 | 223 | |
saloutos | 2:bdfce41aae53 | 224 | // bias terms |
saloutos | 2:bdfce41aae53 | 225 | float bias[6]; |
saloutos | 2:bdfce41aae53 | 226 | |
saloutos | 2:bdfce41aae53 | 227 | // convert forces and torques |
saloutos | 2:bdfce41aae53 | 228 | float ftdata[6]; |
saloutos | 2:bdfce41aae53 | 229 | |
saloutos | 2:bdfce41aae53 | 230 | |
adimmit | 1:466049963f1f | 231 | //Setup Timer |
adimmit | 1:466049963f1f | 232 | Timer t; |
adimmit | 1:466049963f1f | 233 | |
adimmit | 1:466049963f1f | 234 | //MESSAGE TO SEND |
adimmit | 1:466049963f1f | 235 | //float msg[6]; |
adimmit | 1:466049963f1f | 236 | int16_t msg[6]; |
adimmit | 1:466049963f1f | 237 | char send_buf[36]; |
adimmit | 1:466049963f1f | 238 | //server.sendto(client, send_buf, sizeof(send_buf)-1); --> command to send |
adimmit | 1:466049963f1f | 239 | /*msg[0] = thumb_prox.read_u16()/64; |
adimmit | 1:466049963f1f | 240 | msg[1] = thumb_dist.read_u16()/64; |
adimmit | 1:466049963f1f | 241 | msg[2] = index_prox.read_u16()/64; |
adimmit | 1:466049963f1f | 242 | msg[3] = index_dist.read_u16()/64; |
adimmit | 1:466049963f1f | 243 | msg[4] = mid_prox.read_u16()/64; |
adimmit | 1:466049963f1f | 244 | msg[5] = mid_dist.read_u16()/64; */ //--> populating the message |
adimmit | 1:466049963f1f | 245 | |
adimmit | 1:466049963f1f | 246 | |
saloutos | 2:bdfce41aae53 | 247 | |
saloutos | 2:bdfce41aae53 | 248 | // send 6 configuration words with the 6 channel numbers, still the default softspan 7 conversion |
saloutos | 2:bdfce41aae53 | 249 | void config_LTC(){ |
saloutos | 2:bdfce41aae53 | 250 | |
saloutos | 2:bdfce41aae53 | 251 | uint8_t discard; |
saloutos | 2:bdfce41aae53 | 252 | |
saloutos | 2:bdfce41aae53 | 253 | cs_LTC=0; |
saloutos | 2:bdfce41aae53 | 254 | |
saloutos | 2:bdfce41aae53 | 255 | // set sampling order for channels 0-5 |
saloutos | 2:bdfce41aae53 | 256 | discard = LTC_CHIP.write(0b10000111); // byte is 7:V, 6:0, 5-3:ID, 2-0:mode |
saloutos | 2:bdfce41aae53 | 257 | discard = LTC_CHIP.write(0b10001111); |
saloutos | 2:bdfce41aae53 | 258 | discard = LTC_CHIP.write(0b10010111); |
saloutos | 2:bdfce41aae53 | 259 | discard = LTC_CHIP.write(0b10011111); |
saloutos | 2:bdfce41aae53 | 260 | discard = LTC_CHIP.write(0b10100111); |
saloutos | 2:bdfce41aae53 | 261 | discard = LTC_CHIP.write(0b10101111); |
saloutos | 2:bdfce41aae53 | 262 | |
saloutos | 2:bdfce41aae53 | 263 | cs_LTC=1; |
saloutos | 2:bdfce41aae53 | 264 | |
saloutos | 2:bdfce41aae53 | 265 | } |
saloutos | 2:bdfce41aae53 | 266 | |
saloutos | 2:bdfce41aae53 | 267 | |
saloutos | 2:bdfce41aae53 | 268 | |
adimmit | 0:63fac75e5afc | 269 | /* |
adimmit | 0:63fac75e5afc | 270 | We need to |
adimmit | 0:63fac75e5afc | 271 | - pull CS low |
adimmit | 0:63fac75e5afc | 272 | - read the data into a register |
adimmit | 0:63fac75e5afc | 273 | - release CS |
adimmit | 0:63fac75e5afc | 274 | - decode the data |
adimmit | 0:63fac75e5afc | 275 | - repeat |
adimmit | 0:63fac75e5afc | 276 | */ |
adimmit | 0:63fac75e5afc | 277 | void read_data() { |
adimmit | 0:63fac75e5afc | 278 | |
saloutos | 2:bdfce41aae53 | 279 | // right now, programmed LTC chip to only sample 6 channels, starting at channel 0 on next conversion (in config_LTC)...also changed number of channels variables |
saloutos | 2:bdfce41aae53 | 280 | // TODO: could also decode channel ID from bits 4-6 of the info byte in message packet, assign to correct adc channel |
saloutos | 2:bdfce41aae53 | 281 | // TODO: could also include next channel for sampling in each conversion message |
saloutos | 2:bdfce41aae53 | 282 | |
adimmit | 1:466049963f1f | 283 | for (int i = 0; i<NUM_CHANNELS; i++) { |
adimmit | 1:466049963f1f | 284 | //request conversion |
adimmit | 1:466049963f1f | 285 | CNV_PIN=1; |
adimmit | 1:466049963f1f | 286 | wait_ns(60); // wait for 60ns |
adimmit | 1:466049963f1f | 287 | CNV_PIN=0; |
adimmit | 1:466049963f1f | 288 | //WAIT FOR BSY --> bsy_LTC |
adimmit | 1:466049963f1f | 289 | while(bsy_LTC==1){} |
adimmit | 1:466049963f1f | 290 | //debugging ONLY |
adimmit | 1:466049963f1f | 291 | wait_us(1); |
adimmit | 1:466049963f1f | 292 | //then ask for data |
adimmit | 1:466049963f1f | 293 | cs_LTC=0; |
adimmit | 1:466049963f1f | 294 | //spi id register |
adimmit | 1:466049963f1f | 295 | //LTC_CHIP.write(0x00); // --> do we need this? |
adimmit | 1:466049963f1f | 296 | //read 144 bytes |
adimmit | 1:466049963f1f | 297 | |
saloutos | 2:bdfce41aae53 | 298 | |
saloutos | 2:bdfce41aae53 | 299 | |
saloutos | 2:bdfce41aae53 | 300 | |
adimmit | 1:466049963f1f | 301 | //read data |
adimmit | 1:466049963f1f | 302 | int bytecount = CH_SIZE*i; |
adimmit | 1:466049963f1f | 303 | while(bytecount < CH_SIZE*(1+i)){ |
adimmit | 1:466049963f1f | 304 | rx_buff[bytecount] = LTC_CHIP.write(0x00); |
adimmit | 1:466049963f1f | 305 | bytecount++; |
adimmit | 1:466049963f1f | 306 | } |
adimmit | 1:466049963f1f | 307 | |
adimmit | 1:466049963f1f | 308 | //lift CS |
adimmit | 1:466049963f1f | 309 | cs_LTC=1; |
adimmit | 1:466049963f1f | 310 | } |
adimmit | 0:63fac75e5afc | 311 | |
adimmit | 1:466049963f1f | 312 | //PACK THE STRUCT |
adimmit | 1:466049963f1f | 313 | |
adimmit | 1:466049963f1f | 314 | for(int i = 0; i < BUFF_SIZE; i++) |
adimmit | 1:466049963f1f | 315 | { |
adimmit | 1:466049963f1f | 316 | ((uint8_t*)(&adc_data))[i] = rx_buff[i]; |
adimmit | 0:63fac75e5afc | 317 | } |
adimmit | 0:63fac75e5afc | 318 | |
saloutos | 2:bdfce41aae53 | 319 | |
saloutos | 2:bdfce41aae53 | 320 | // fill msg[] here |
saloutos | 2:bdfce41aae53 | 321 | msg[0] = adc_data.channel[0].cnv_upper<<8 | adc_data.channel[0].cnv_lower; |
saloutos | 2:bdfce41aae53 | 322 | msg[1] = adc_data.channel[1].cnv_upper<<8 | adc_data.channel[1].cnv_lower; |
saloutos | 2:bdfce41aae53 | 323 | msg[2] = adc_data.channel[2].cnv_upper<<8 | adc_data.channel[2].cnv_lower; |
saloutos | 2:bdfce41aae53 | 324 | msg[3] = adc_data.channel[3].cnv_upper<<8 | adc_data.channel[3].cnv_lower; |
saloutos | 2:bdfce41aae53 | 325 | msg[4] = adc_data.channel[4].cnv_upper<<8 | adc_data.channel[4].cnv_lower; |
saloutos | 2:bdfce41aae53 | 326 | msg[5] = adc_data.channel[5].cnv_upper<<8 | adc_data.channel[5].cnv_lower; |
saloutos | 2:bdfce41aae53 | 327 | |
saloutos | 2:bdfce41aae53 | 328 | // set a flag to add bias here after first 100 samples? |
saloutos | 2:bdfce41aae53 | 329 | |
saloutos | 2:bdfce41aae53 | 330 | |
adimmit | 0:63fac75e5afc | 331 | //WRITE THIS TO A STRUCT OF SOME SORT but we need to delete the bits we don't care about |
adimmit | 0:63fac75e5afc | 332 | } |
adimmit | 0:63fac75e5afc | 333 | |
saloutos | 2:bdfce41aae53 | 334 | // convert integer readings to voltages to f/t values |
saloutos | 2:bdfce41aae53 | 335 | void convert_data(){ |
saloutos | 2:bdfce41aae53 | 336 | |
saloutos | 2:bdfce41aae53 | 337 | // dummy buffer to store converted ADC vals |
saloutos | 2:bdfce41aae53 | 338 | float buff[6]; |
saloutos | 2:bdfce41aae53 | 339 | for(int i=0; i<6; i++){ |
saloutos | 2:bdfce41aae53 | 340 | buff[i] = CONV_FACTOR*((float)msg[i]-bias[i]); // bias[] is in same units as msg[] |
saloutos | 2:bdfce41aae53 | 341 | ftdata[i] = 0; // also zero out ftdata here |
saloutos | 2:bdfce41aae53 | 342 | } |
saloutos | 2:bdfce41aae53 | 343 | |
saloutos | 2:bdfce41aae53 | 344 | // convert each f/t value separately |
saloutos | 2:bdfce41aae53 | 345 | for(int i=0; i<6; i++){ |
saloutos | 2:bdfce41aae53 | 346 | ftdata[0] += Fxc[i]*buff[i]; |
saloutos | 2:bdfce41aae53 | 347 | ftdata[1] += Fyc[i]*buff[i]; |
saloutos | 2:bdfce41aae53 | 348 | ftdata[2] += Fzc[i]*buff[i]; |
saloutos | 2:bdfce41aae53 | 349 | ftdata[3] += Mxc[i]*buff[i]; |
saloutos | 2:bdfce41aae53 | 350 | ftdata[4] += Myc[i]*buff[i]; |
saloutos | 2:bdfce41aae53 | 351 | ftdata[5] += Mzc[i]*buff[i]; |
saloutos | 2:bdfce41aae53 | 352 | } |
saloutos | 2:bdfce41aae53 | 353 | |
saloutos | 2:bdfce41aae53 | 354 | } |
saloutos | 2:bdfce41aae53 | 355 | |
saloutos | 2:bdfce41aae53 | 356 | |
adimmit | 0:63fac75e5afc | 357 | |
adimmit | 0:63fac75e5afc | 358 | int main() |
adimmit | 0:63fac75e5afc | 359 | { |
adimmit | 0:63fac75e5afc | 360 | // Initialise the digital pin LED1 as an output |
adimmit | 0:63fac75e5afc | 361 | DigitalOut led(LED1); |
adimmit | 0:63fac75e5afc | 362 | CNV_PIN=0; |
adimmit | 0:63fac75e5afc | 363 | |
adimmit | 0:63fac75e5afc | 364 | //setup pc |
adimmit | 0:63fac75e5afc | 365 | pc.baud(115200); |
saloutos | 2:bdfce41aae53 | 366 | pc.printf("------STARTUP------\n\n\n\r"); |
adimmit | 0:63fac75e5afc | 367 | |
adimmit | 0:63fac75e5afc | 368 | //setup SPI |
adimmit | 1:466049963f1f | 369 | LTC_CHIP.format(8, 0); |
saloutos | 2:bdfce41aae53 | 370 | LTC_CHIP.frequency(10000); //10MHz? //60Mhz clock frequency |
saloutos | 2:bdfce41aae53 | 371 | |
saloutos | 2:bdfce41aae53 | 372 | wait_ms(1); |
saloutos | 2:bdfce41aae53 | 373 | config_LTC(); |
saloutos | 2:bdfce41aae53 | 374 | wait_ms(1); |
adimmit | 1:466049963f1f | 375 | |
saloutos | 2:bdfce41aae53 | 376 | // //setup ETHERNET |
saloutos | 2:bdfce41aae53 | 377 | // eth.set_network(ip, mask, gateway); |
saloutos | 2:bdfce41aae53 | 378 | // eth.connect(); |
saloutos | 2:bdfce41aae53 | 379 | // //more ETHERNET |
saloutos | 2:bdfce41aae53 | 380 | // client.set_port(SERVER_PORT); |
saloutos | 2:bdfce41aae53 | 381 | // client.set_ip_address(SERVER_ADDRESS); |
saloutos | 2:bdfce41aae53 | 382 | // local.set_port(LOCAL_PORT); |
saloutos | 2:bdfce41aae53 | 383 | // local.set_ip_address(ip); |
saloutos | 2:bdfce41aae53 | 384 | // int code = server.open(ð); |
saloutos | 2:bdfce41aae53 | 385 | // if(code!=0) { pc.printf("Error from opening server = %d\n\r",code); } |
saloutos | 2:bdfce41aae53 | 386 | // code = server.bind(local); |
saloutos | 2:bdfce41aae53 | 387 | // if(code!=0) { pc.printf("Error from binding socket = %d\n\r",code); } |
adimmit | 1:466049963f1f | 388 | |
saloutos | 2:bdfce41aae53 | 389 | |
saloutos | 2:bdfce41aae53 | 390 | |
saloutos | 2:bdfce41aae53 | 391 | // SET UP FROM OLD SENSOR CODE HERE |
adimmit | 0:63fac75e5afc | 392 | |
saloutos | 2:bdfce41aae53 | 393 | // Set up sensor pins |
saloutos | 2:bdfce41aae53 | 394 | dec_enable = 1; |
saloutos | 2:bdfce41aae53 | 395 | // Initialize dev 1 |
saloutos | 2:bdfce41aae53 | 396 | s1.dev_id = 1; // tells which cs pin associated with device |
saloutos | 2:bdfce41aae53 | 397 | config_dev(&s1); |
saloutos | 2:bdfce41aae53 | 398 | //Initialize dev 2 |
saloutos | 2:bdfce41aae53 | 399 | s2.dev_id = 2; // tells which cs pin associated with device |
saloutos | 2:bdfce41aae53 | 400 | config_dev(&s2); |
saloutos | 2:bdfce41aae53 | 401 | //Initialize dev 3 |
saloutos | 2:bdfce41aae53 | 402 | s3.dev_id = 3; // tells which cs pin associated with device |
saloutos | 2:bdfce41aae53 | 403 | config_dev(&s3); |
saloutos | 2:bdfce41aae53 | 404 | //Initialize dev 4 |
saloutos | 2:bdfce41aae53 | 405 | s4.dev_id = 4; // tells which cs pin associated with device |
saloutos | 2:bdfce41aae53 | 406 | config_dev(&s4); |
saloutos | 2:bdfce41aae53 | 407 | //Initialize dev 5 |
saloutos | 2:bdfce41aae53 | 408 | s5.dev_id = 5; // tells which cs pin associated with device |
saloutos | 2:bdfce41aae53 | 409 | config_dev(&s5); |
saloutos | 2:bdfce41aae53 | 410 | //Initialize dev 6 |
saloutos | 2:bdfce41aae53 | 411 | s6.dev_id = 6; // tells which cs pin associated with device |
saloutos | 2:bdfce41aae53 | 412 | config_dev(&s6); |
saloutos | 2:bdfce41aae53 | 413 | //Initialize dev 7 |
saloutos | 2:bdfce41aae53 | 414 | s7.dev_id = 7; // tells which cs pin associated with device |
saloutos | 2:bdfce41aae53 | 415 | config_dev(&s7); |
saloutos | 2:bdfce41aae53 | 416 | //Initialize dev 8 |
saloutos | 2:bdfce41aae53 | 417 | s8.dev_id = 8; // tells which cs pin associated with device |
saloutos | 2:bdfce41aae53 | 418 | config_dev(&s8); |
adimmit | 1:466049963f1f | 419 | |
saloutos | 2:bdfce41aae53 | 420 | // Getting data from sensor |
saloutos | 2:bdfce41aae53 | 421 | struct bmp3_data data1; |
saloutos | 2:bdfce41aae53 | 422 | struct bmp3_data data2; |
saloutos | 2:bdfce41aae53 | 423 | struct bmp3_data data3; |
saloutos | 2:bdfce41aae53 | 424 | struct bmp3_data data4; |
saloutos | 2:bdfce41aae53 | 425 | struct bmp3_data data5; |
saloutos | 2:bdfce41aae53 | 426 | struct bmp3_data data6; |
saloutos | 2:bdfce41aae53 | 427 | struct bmp3_data data7; |
saloutos | 2:bdfce41aae53 | 428 | struct bmp3_data data8; |
saloutos | 2:bdfce41aae53 | 429 | |
saloutos | 2:bdfce41aae53 | 430 | uint8_t sensor_comp; |
saloutos | 2:bdfce41aae53 | 431 | sensor_comp = uint8_t(1)| uint8_t(1<<1); // sensor_comp = BMP3_PRESS | BMP3_TEMP; |
saloutos | 2:bdfce41aae53 | 432 | |
saloutos | 2:bdfce41aae53 | 433 | |
saloutos | 2:bdfce41aae53 | 434 | |
saloutos | 2:bdfce41aae53 | 435 | |
saloutos | 2:bdfce41aae53 | 436 | |
saloutos | 2:bdfce41aae53 | 437 | pc.printf("Calibrating ATI sensor..."); |
adimmit | 1:466049963f1f | 438 | t.start(); |
saloutos | 2:bdfce41aae53 | 439 | // read 100 times to calculate bias voltages |
saloutos | 2:bdfce41aae53 | 440 | for(int i=0; i<100; i++){ |
saloutos | 2:bdfce41aae53 | 441 | t.reset(); |
saloutos | 2:bdfce41aae53 | 442 | read_data(); |
saloutos | 2:bdfce41aae53 | 443 | for(int j=0; j<6; j++){ |
saloutos | 2:bdfce41aae53 | 444 | bias[j] += 0.01*(float)msg[j]; |
saloutos | 2:bdfce41aae53 | 445 | } |
saloutos | 2:bdfce41aae53 | 446 | while(t.read()<0.001){;} |
saloutos | 2:bdfce41aae53 | 447 | } |
saloutos | 2:bdfce41aae53 | 448 | t.stop(); |
saloutos | 2:bdfce41aae53 | 449 | pc.printf("done!\n\r"); |
saloutos | 2:bdfce41aae53 | 450 | // pc.printf("%.2f,%.2f,%.2f,%.2f,%.2f,%.2f\n\r", bias[0],bias[1],bias[2],bias[3],bias[4],bias[5]); |
adimmit | 1:466049963f1f | 451 | |
saloutos | 2:bdfce41aae53 | 452 | pc.printf("Starting to sample...\n\n\r"); |
saloutos | 2:bdfce41aae53 | 453 | |
saloutos | 2:bdfce41aae53 | 454 | // attach sampling interrupt |
saloutos | 2:bdfce41aae53 | 455 | datalog.attach_us(&log_data,10000); // 1000us = 1ms (10000 = 10 ms = 100 Hz) |
adimmit | 1:466049963f1f | 456 | |
adimmit | 0:63fac75e5afc | 457 | while (true) { |
adimmit | 1:466049963f1f | 458 | |
saloutos | 2:bdfce41aae53 | 459 | if(tickerActivated == true) { |
saloutos | 2:bdfce41aae53 | 460 | |
saloutos | 2:bdfce41aae53 | 461 | tickerActivated = false; |
saloutos | 2:bdfce41aae53 | 462 | |
saloutos | 2:bdfce41aae53 | 463 | // LTC chip for ATI sensor |
saloutos | 2:bdfce41aae53 | 464 | read_data(); |
saloutos | 2:bdfce41aae53 | 465 | convert_data(); // remove this eventually, convert after sending over ethernet |
saloutos | 2:bdfce41aae53 | 466 | // print received data |
saloutos | 2:bdfce41aae53 | 467 | // pc.printf("%d,%d,%d,%d,%d,%d\n\r", msg[0],msg[1],msg[2],msg[3],msg[4],msg[5]); |
saloutos | 2:bdfce41aae53 | 468 | // print converted data |
saloutos | 2:bdfce41aae53 | 469 | pc.printf("%.2f,%.2f,%.2f,%.2f,%.2f,%.2f\t", ftdata[0],ftdata[1],ftdata[2],ftdata[3],ftdata[4],ftdata[5]); |
saloutos | 2:bdfce41aae53 | 470 | |
saloutos | 2:bdfce41aae53 | 471 | // Custom force sensor |
saloutos | 2:bdfce41aae53 | 472 | |
saloutos | 2:bdfce41aae53 | 473 | bmp3_get_sensor_data(sensor_comp, &data1, &s1); // todo: combine into a read_data function |
saloutos | 2:bdfce41aae53 | 474 | bmp3_get_sensor_data(sensor_comp, &data2, &s2); |
saloutos | 2:bdfce41aae53 | 475 | bmp3_get_sensor_data(sensor_comp, &data3, &s3); |
saloutos | 2:bdfce41aae53 | 476 | bmp3_get_sensor_data(sensor_comp, &data4, &s4); |
saloutos | 2:bdfce41aae53 | 477 | bmp3_get_sensor_data(sensor_comp, &data5, &s5); |
saloutos | 2:bdfce41aae53 | 478 | bmp3_get_sensor_data(sensor_comp, &data6, &s6); |
saloutos | 2:bdfce41aae53 | 479 | bmp3_get_sensor_data(sensor_comp, &data7, &s7); |
saloutos | 2:bdfce41aae53 | 480 | bmp3_get_sensor_data(sensor_comp, &data8, &s8); |
saloutos | 2:bdfce41aae53 | 481 | |
saloutos | 2:bdfce41aae53 | 482 | // todo: combine into a convert_data function, or inlcude in the read_data function...at least have d[] instead of d1,d2,d3,etc. |
saloutos | 2:bdfce41aae53 | 483 | sn_data[0] = int(data1.pressure)-100000; // pressure is returned in Pa, could subtract actual sea level pressure here |
saloutos | 2:bdfce41aae53 | 484 | sn_data[1] = int(data2.pressure)-100000; |
saloutos | 2:bdfce41aae53 | 485 | sn_data[2] = int(data3.pressure)-100000; |
saloutos | 2:bdfce41aae53 | 486 | sn_data[3] = int(data4.pressure)-100000; |
saloutos | 2:bdfce41aae53 | 487 | sn_data[4] = int(data5.pressure)-100000; |
saloutos | 2:bdfce41aae53 | 488 | sn_data[5] = int(data6.pressure)-100000; |
saloutos | 2:bdfce41aae53 | 489 | sn_data[6] = int(data7.pressure)-100000; |
saloutos | 2:bdfce41aae53 | 490 | sn_data[7] = int(data8.pressure)-100000; |
saloutos | 2:bdfce41aae53 | 491 | |
saloutos | 2:bdfce41aae53 | 492 | pc.printf("%03d,%03d,%03d,%03d,%03d,%03d,%03d,%03d \n\r", sn_data[0],sn_data[1],sn_data[2],sn_data[3],sn_data[4],sn_data[5],sn_data[6],sn_data[7]); |
saloutos | 2:bdfce41aae53 | 493 | |
saloutos | 2:bdfce41aae53 | 494 | // pc.printf("/n/r"); |
saloutos | 2:bdfce41aae53 | 495 | |
saloutos | 2:bdfce41aae53 | 496 | //POPULATE THE ETHERNET MESSAGE |
saloutos | 2:bdfce41aae53 | 497 | // sprintf(send_buf, "%d,%d,%d,%d,%d,%d", msg[0],msg[1],msg[2],msg[3],msg[4],msg[5]); |
saloutos | 2:bdfce41aae53 | 498 | // server.sendto(client, send_buf, sizeof(send_buf)-1); // send message |
saloutos | 2:bdfce41aae53 | 499 | |
saloutos | 2:bdfce41aae53 | 500 | |
saloutos | 2:bdfce41aae53 | 501 | |
saloutos | 2:bdfce41aae53 | 502 | |
saloutos | 2:bdfce41aae53 | 503 | } |
adimmit | 1:466049963f1f | 504 | |
adimmit | 0:63fac75e5afc | 505 | } |
adimmit | 1:466049963f1f | 506 | |
saloutos | 2:bdfce41aae53 | 507 | // // Terminate connection (if you want) |
saloutos | 2:bdfce41aae53 | 508 | // server.close(); |
saloutos | 2:bdfce41aae53 | 509 | // eth.disconnect(); |
adimmit | 0:63fac75e5afc | 510 | } |