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?

UserRevisionLine numberNew 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(&eth);
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 }