test program to power up two MAX11410 ADCs and check the inputs of ADC1. Uses MAX11410 library.

Dependencies:   mbed MAX11410

Fork of MAX11410-test by Dan Allen

Committer:
laserdad
Date:
Thu Mar 21 22:33:50 2019 +0000
Revision:
17:f051190b4bff
Parent:
16:d25147dfdd5c
updated to use fixed running average of 10 samples--best compromise of noise and lag.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simon 0:4f78cdfc99de 1 #include "mbed.h"
laserdad 5:d7b803aa9079 2 #include "MAX11410.h"
simon 0:4f78cdfc99de 3
laserdad 5:d7b803aa9079 4 #define CS1 D9
laserdad 5:d7b803aa9079 5 #define CS2 D10
laserdad 5:d7b803aa9079 6 #define MOSI_1 D11
laserdad 5:d7b803aa9079 7 #define MISO_1 D12
laserdad 5:d7b803aa9079 8 #define SCLK_1 D13
laserdad 5:d7b803aa9079 9 #define VDD 3.3
laserdad 17:f051190b4bff 10 #define NUM_AVGS 10 //this is for the IIR and AVG filters
laserdad 17:f051190b4bff 11 #define NUM_CHANNELS 10
laserdad 17:f051190b4bff 12 #define NUM_FILTER_TAPS 18 //this is for the FIR filter
laserdad 6:c3db4eff9170 13
laserdad 6:c3db4eff9170 14
laserdad 5:d7b803aa9079 15 AnalogOut vOut1(A3);
laserdad 5:d7b803aa9079 16 AnalogOut vOut2(A4);
laserdad 5:d7b803aa9079 17 DigitalOut cs_pin1(CS1);
laserdad 5:d7b803aa9079 18 DigitalOut cs_pin2(CS2);
laserdad 5:d7b803aa9079 19 SPI spi(MOSI_1, MISO_1, SCLK_1);
laserdad 5:d7b803aa9079 20 MAX11410 adc1(&spi,&cs_pin1);
laserdad 5:d7b803aa9079 21 MAX11410 adc2(&spi,&cs_pin2);
laserdad 7:5295cbdb123c 22 Serial pc(USBTX, USBRX,115200);
laserdad 7:5295cbdb123c 23 //Serial pc(USBTX, USBRX, 9600);
laserdad 6:c3db4eff9170 24 Serial rpi(PA_9,PA_10,115200);
laserdad 16:d25147dfdd5c 25 Timer t;
laserdad 12:75efd1e2314c 26
laserdad 16:d25147dfdd5c 27 int32_t channel_data[NUM_CHANNELS] = {0,0,0,0,0,0,0,0,0,0};
laserdad 16:d25147dfdd5c 28 int32_t new_data = 0;;
laserdad 13:02c28a5a26c0 29 int32_t avg_data[NUM_CHANNELS];
laserdad 13:02c28a5a26c0 30 int32_t data_buffer[NUM_CHANNELS][10];
laserdad 13:02c28a5a26c0 31 int32_t data_sum[NUM_CHANNELS];
laserdad 13:02c28a5a26c0 32 int32_t ind = 0;
laserdad 12:75efd1e2314c 33 int num_samples = 0;
laserdad 17:f051190b4bff 34 int num_avgs = NUM_AVGS;
laserdad 16:d25147dfdd5c 35 int ptr =0;
laserdad 12:75efd1e2314c 36
laserdad 5:d7b803aa9079 37 void starting()
smartsystemdesign 2:39ba9beabf3c 38 {
laserdad 5:d7b803aa9079 39 pc.printf("this program has started\r\n");
laserdad 5:d7b803aa9079 40 }
laserdad 5:d7b803aa9079 41
simon 0:4f78cdfc99de 42
laserdad 6:c3db4eff9170 43 char getNthByte(int32_t data, int ind)
laserdad 6:c3db4eff9170 44 {
laserdad 6:c3db4eff9170 45 return (data>>(8*ind)) & 0x000000FF ;
laserdad 6:c3db4eff9170 46 }
laserdad 5:d7b803aa9079 47
laserdad 5:d7b803aa9079 48
laserdad 5:d7b803aa9079 49 void print8bitRegsAdc1(char start_reg,char end_reg)
laserdad 5:d7b803aa9079 50 {
laserdad 5:d7b803aa9079 51 bool int_status;
laserdad 5:d7b803aa9079 52 char val;
laserdad 16:d25147dfdd5c 53 for(int n=start_reg; n<=end_reg; n++) {
laserdad 5:d7b803aa9079 54 val = adc1.read8bits(n,&int_status);
laserdad 5:d7b803aa9079 55 pc.printf("reg %02x, val =%02x\r\n",n,val);
simon 0:4f78cdfc99de 56 }
laserdad 5:d7b803aa9079 57 }
laserdad 5:d7b803aa9079 58
laserdad 5:d7b803aa9079 59 void print8bitRegsAdc2(char start_reg,char end_reg)
laserdad 5:d7b803aa9079 60 {
laserdad 5:d7b803aa9079 61 bool int_status;
laserdad 5:d7b803aa9079 62 char val;
laserdad 16:d25147dfdd5c 63 for(int n=start_reg; n<=end_reg; n++) {
laserdad 5:d7b803aa9079 64 val = adc2.read8bits(n,&int_status);
laserdad 5:d7b803aa9079 65 pc.printf("reg %02x, val =%02x\r\n",n,val);
laserdad 5:d7b803aa9079 66 }
simon 0:4f78cdfc99de 67 }
smartsystemdesign 2:39ba9beabf3c 68
laserdad 7:5295cbdb123c 69
laserdad 16:d25147dfdd5c 70 void get_avgs()
laserdad 16:d25147dfdd5c 71 {
laserdad 13:02c28a5a26c0 72 if (num_samples < num_avgs) {
laserdad 12:75efd1e2314c 73 num_samples++; //increment number of samples
laserdad 16:d25147dfdd5c 74 } else {
laserdad 12:75efd1e2314c 75 for (int n = 0; n<NUM_CHANNELS; n++) { //loop over channels
laserdad 12:75efd1e2314c 76 data_sum[n] -= data_buffer[n][ptr]; //subtract oldest sample
laserdad 12:75efd1e2314c 77 }
laserdad 12:75efd1e2314c 78 }
laserdad 16:d25147dfdd5c 79 for (int n=0; n<NUM_CHANNELS; n++) {
laserdad 12:75efd1e2314c 80 data_buffer[n][ptr] = channel_data[n]; //put new sample in buffer
laserdad 12:75efd1e2314c 81 data_sum[n] += channel_data[n]; //add new sample
laserdad 16:d25147dfdd5c 82 avg_data[n] = data_sum[n] / num_avgs; //get new average
laserdad 16:d25147dfdd5c 83 }
laserdad 16:d25147dfdd5c 84 ptr++; //increment pointer
laserdad 16:d25147dfdd5c 85 if (ptr == num_avgs) {
laserdad 16:d25147dfdd5c 86 ptr = 0; //reset pointer
laserdad 16:d25147dfdd5c 87 }
laserdad 16:d25147dfdd5c 88 }
laserdad 16:d25147dfdd5c 89
laserdad 16:d25147dfdd5c 90 float filter_buffer[NUM_CHANNELS][NUM_FILTER_TAPS];
laserdad 16:d25147dfdd5c 91 //float lpf[NUM_FILTER_TAPS] = {
laserdad 16:d25147dfdd5c 92 // 0.066753767,
laserdad 16:d25147dfdd5c 93 // 0.288003606,
laserdad 16:d25147dfdd5c 94 // 0.489209110,
laserdad 16:d25147dfdd5c 95 // 0.333448254,
laserdad 16:d25147dfdd5c 96 // -0.066620544,
laserdad 16:d25147dfdd5c 97 // -0.194774726,
laserdad 16:d25147dfdd5c 98 // 0.013641767,
laserdad 16:d25147dfdd5c 99 // 0.112606208,
laserdad 16:d25147dfdd5c 100 // -0.010259249,
laserdad 16:d25147dfdd5c 101 // -0.061377259,
laserdad 16:d25147dfdd5c 102 // 0.011435200,
laserdad 16:d25147dfdd5c 103 // 0.029613752,
laserdad 16:d25147dfdd5c 104 // -0.007630463,
laserdad 16:d25147dfdd5c 105 // -0.008933779,
laserdad 16:d25147dfdd5c 106 // 0.005065228,
laserdad 16:d25147dfdd5c 107 // 993.16906E-6,
laserdad 16:d25147dfdd5c 108 // -0.001594816,
laserdad 16:d25147dfdd5c 109 // 420.77505E-6
laserdad 16:d25147dfdd5c 110 //};
laserdad 16:d25147dfdd5c 111 //float lpf[NUM_FILTER_TAPS] = {
laserdad 16:d25147dfdd5c 112 // 0.261120009762270400,
laserdad 16:d25147dfdd5c 113 // 0.577407043230469430,
laserdad 16:d25147dfdd5c 114 // 0.318153169307452854,
laserdad 16:d25147dfdd5c 115 //-0.102856989837421975,
laserdad 16:d25147dfdd5c 116 //-0.077312734575000375,
laserdad 16:d25147dfdd5c 117 // 0.025405207067910347,
laserdad 16:d25147dfdd5c 118 //-0.001960444494723064,
laserdad 16:d25147dfdd5c 119 // 44.73953904209371050E-6};
laserdad 16:d25147dfdd5c 120 //float lpf[NUM_FILTER_TAPS] = {
laserdad 16:d25147dfdd5c 121 // 0.074209685703864631,
laserdad 16:d25147dfdd5c 122 // 0.218596393892535157,
laserdad 16:d25147dfdd5c 123 // 0.322579925396349776,
laserdad 16:d25147dfdd5c 124 // 0.274804773971007665,
laserdad 16:d25147dfdd5c 125 // 0.121138454342240451,
laserdad 16:d25147dfdd5c 126 // 0.004556618102039918,
laserdad 16:d25147dfdd5c 127 //-0.017928065442454785,
laserdad 16:d25147dfdd5c 128 // 0.002042214034417321
laserdad 16:d25147dfdd5c 129 //} ;
laserdad 17:f051190b4bff 130 //float lpf[NUM_FILTER_TAPS] = {
laserdad 17:f051190b4bff 131 // 0.021922032288610106,
laserdad 17:f051190b4bff 132 // 0.092023100339809011,
laserdad 17:f051190b4bff 133 // 0.202378776983641817,
laserdad 17:f051190b4bff 134 // 0.290407730540869380,
laserdad 17:f051190b4bff 135 // 0.283915707651621163,
laserdad 17:f051190b4bff 136 // 0.175369892196639704,
laserdad 17:f051190b4bff 137 // 0.037613514962477279,
laserdad 17:f051190b4bff 138 //-0.044492932416232721,
laserdad 17:f051190b4bff 139 //-0.049124217289769172,
laserdad 17:f051190b4bff 140 //-0.017864664397846109,
laserdad 17:f051190b4bff 141 // 0.003294185403418759,
laserdad 17:f051190b4bff 142 // 0.004556873736760698
laserdad 17:f051190b4bff 143 //};
laserdad 17:f051190b4bff 144 //
laserdad 17:f051190b4bff 145 ////.64Hz 12 tap Kaiser min phase
laserdad 17:f051190b4bff 146 //float lpf[NUM_FILTER_TAPS] = {
laserdad 17:f051190b4bff 147 // 0.028436833059871377,
laserdad 17:f051190b4bff 148 // 0.091256389686655018,
laserdad 17:f051190b4bff 149 // 0.176613000083015115,
laserdad 17:f051190b4bff 150 // 0.242496965064841336,
laserdad 17:f051190b4bff 151 // 0.245802310397899182,
laserdad 17:f051190b4bff 152 // 0.179348609303905254,
laserdad 17:f051190b4bff 153 // 0.080910192685212115,
laserdad 17:f051190b4bff 154 // 0.002992553404179661,
laserdad 17:f051190b4bff 155 //-0.027308910150182431,
laserdad 17:f051190b4bff 156 //-0.020673186464630775,
laserdad 17:f051190b4bff 157 //-0.004453426075815317,
laserdad 17:f051190b4bff 158 // 0.004578669005049506
laserdad 17:f051190b4bff 159 //};
laserdad 17:f051190b4bff 160
laserdad 17:f051190b4bff 161 //0.8Hz 12 tap Kaiser min phase
laserdad 17:f051190b4bff 162 //float lpf[NUM_FILTER_TAPS] = {
laserdad 17:f051190b4bff 163 // 0.021922032288610106,
laserdad 17:f051190b4bff 164 // 0.092023100339809011,
laserdad 17:f051190b4bff 165 // 0.202378776983641817,
laserdad 17:f051190b4bff 166 // 0.290407730540869380,
laserdad 17:f051190b4bff 167 // 0.283915707651621163,
laserdad 17:f051190b4bff 168 // 0.175369892196639704,
laserdad 17:f051190b4bff 169 // 0.037613514962477279,
laserdad 17:f051190b4bff 170 //-0.044492932416232721,
laserdad 17:f051190b4bff 171 //-0.049124217289769172,
laserdad 17:f051190b4bff 172 //-0.017864664397846109,
laserdad 17:f051190b4bff 173 // 0.003294185403418759,
laserdad 17:f051190b4bff 174 // 0.004556873736760698
laserdad 17:f051190b4bff 175 //};
laserdad 17:f051190b4bff 176
laserdad 17:f051190b4bff 177 //0.48Hz 18 tap Kaiser min phase
laserdad 16:d25147dfdd5c 178 float lpf[NUM_FILTER_TAPS] = {
laserdad 17:f051190b4bff 179 0.009102526098895891,
laserdad 17:f051190b4bff 180 0.028984102676961963,
laserdad 17:f051190b4bff 181 0.062642522588951172,
laserdad 17:f051190b4bff 182 0.106483963299688053,
laserdad 17:f051190b4bff 183 0.150349565029814058,
laserdad 17:f051190b4bff 184 0.180469040434368927,
laserdad 17:f051190b4bff 185 0.185261380809190523,
laserdad 17:f051190b4bff 186 0.161071159985581691,
laserdad 17:f051190b4bff 187 0.114518186128496568,
laserdad 17:f051190b4bff 188 0.059873816731079298,
laserdad 17:f051190b4bff 189 0.012753827718163288,
laserdad 17:f051190b4bff 190 -0.016437685391431933,
laserdad 17:f051190b4bff 191 -0.025878490374639303,
laserdad 17:f051190b4bff 192 -0.021158078277756509,
laserdad 17:f051190b4bff 193 -0.010912787629287718,
laserdad 17:f051190b4bff 194 -0.002164072430294558,
laserdad 17:f051190b4bff 195 0.002163269630415508,
laserdad 17:f051190b4bff 196 0.002877752971803134
laserdad 16:d25147dfdd5c 197 };
laserdad 16:d25147dfdd5c 198
laserdad 16:d25147dfdd5c 199
laserdad 17:f051190b4bff 200 void iir() {
laserdad 17:f051190b4bff 201 for (int channel = 0; channel< NUM_CHANNELS; channel++) {
laserdad 17:f051190b4bff 202 avg_data[channel] += (channel_data[channel]-avg_data[channel])/NUM_AVGS;
laserdad 17:f051190b4bff 203 }
laserdad 17:f051190b4bff 204 }
laserdad 17:f051190b4bff 205
laserdad 17:f051190b4bff 206
laserdad 16:d25147dfdd5c 207 void fir( ) {
laserdad 16:d25147dfdd5c 208 int coef_ptr;
laserdad 16:d25147dfdd5c 209 float filtered_data;
laserdad 16:d25147dfdd5c 210 for (int channel = 0; channel<NUM_CHANNELS; channel++) {
laserdad 16:d25147dfdd5c 211 coef_ptr = ptr;
laserdad 16:d25147dfdd5c 212 filter_buffer[channel][coef_ptr] = channel_data[channel];
laserdad 16:d25147dfdd5c 213 filtered_data = 0;
laserdad 16:d25147dfdd5c 214 if (num_samples < NUM_FILTER_TAPS) {
laserdad 16:d25147dfdd5c 215 num_samples++;
laserdad 16:d25147dfdd5c 216 avg_data[channel] = channel_data[channel];
laserdad 16:d25147dfdd5c 217 } else {//run the filter if we have enough samples
laserdad 16:d25147dfdd5c 218 for(uint8_t n=0; n<NUM_FILTER_TAPS; n++) {
laserdad 16:d25147dfdd5c 219 // pc.printf("x = %d\r\n",(*x)[channel][ptr]);
laserdad 16:d25147dfdd5c 220 filtered_data += lpf[n]*(float)filter_buffer[channel][coef_ptr]; //incrementing throught the coeficients as we go back through samples.
laserdad 16:d25147dfdd5c 221 if (coef_ptr==0) {
laserdad 16:d25147dfdd5c 222 coef_ptr = NUM_FILTER_TAPS-1; //wrap index
laserdad 16:d25147dfdd5c 223 } else {
laserdad 16:d25147dfdd5c 224 coef_ptr--;
laserdad 16:d25147dfdd5c 225 }
laserdad 16:d25147dfdd5c 226 }
laserdad 16:d25147dfdd5c 227 avg_data[channel] = (int32_t)filtered_data;
laserdad 16:d25147dfdd5c 228 }
laserdad 16:d25147dfdd5c 229 }
laserdad 16:d25147dfdd5c 230 ptr++; //increment filter buffer
laserdad 16:d25147dfdd5c 231 if (ptr == NUM_FILTER_TAPS) {//loop buffer pointer index
laserdad 16:d25147dfdd5c 232 ptr = 0;
laserdad 12:75efd1e2314c 233 }
laserdad 13:02c28a5a26c0 234 }
laserdad 12:75efd1e2314c 235
laserdad 12:75efd1e2314c 236
laserdad 16:d25147dfdd5c 237
laserdad 16:d25147dfdd5c 238 int main()
smartsystemdesign 2:39ba9beabf3c 239 {
laserdad 12:75efd1e2314c 240
laserdad 12:75efd1e2314c 241 // int32_t channel_data2[NUM_CHANNELS];
laserdad 12:75efd1e2314c 242
laserdad 16:d25147dfdd5c 243
laserdad 12:75efd1e2314c 244
laserdad 16:d25147dfdd5c 245
laserdad 16:d25147dfdd5c 246
laserdad 7:5295cbdb123c 247 int32_t checksum2 =0;
laserdad 7:5295cbdb123c 248 int32_t checksum = 0;
laserdad 7:5295cbdb123c 249 char checksum_byte = 0;
laserdad 7:5295cbdb123c 250 char byte2print[40];
laserdad 6:c3db4eff9170 251 double vdiff=0.01;
laserdad 5:d7b803aa9079 252 vOut1 = 0.5-vdiff/2;
laserdad 5:d7b803aa9079 253 vOut2 = 0.5+vdiff/2;
laserdad 5:d7b803aa9079 254 starting();
laserdad 16:d25147dfdd5c 255
laserdad 5:d7b803aa9079 256 bool int_state;
laserdad 5:d7b803aa9079 257 spi.format(8,MAX11410_SPI_MODE); //configure number of spi bits 8, 16
laserdad 5:d7b803aa9079 258 spi.frequency(8000000); // Max 8MHz
laserdad 5:d7b803aa9079 259 //read chip ID
laserdad 16:d25147dfdd5c 260
laserdad 5:d7b803aa9079 261 pc.printf("chip ID %d\r\n",adc1.read8bits(REG_PART_ID,&int_state) );
laserdad 16:d25147dfdd5c 262
laserdad 5:d7b803aa9079 263 //config ADC 1
laserdad 11:1050ffc0e9ef 264 adc1.reset(); //POR chip 1
laserdad 11:1050ffc0e9ef 265 adc2.reset(); //POR chip 2
laserdad 16:d25147dfdd5c 266
laserdad 5:d7b803aa9079 267 //check default register configs
laserdad 5:d7b803aa9079 268 pc.printf("default regs for ADC1\r\n");
laserdad 5:d7b803aa9079 269 print8bitRegsAdc1(REG_PD,REG_WAIT_START);
laserdad 16:d25147dfdd5c 270
laserdad 5:d7b803aa9079 271 pc.printf("default regs for ADC2\r\n");
laserdad 5:d7b803aa9079 272 print8bitRegsAdc2(REG_PD,REG_WAIT_START);
laserdad 16:d25147dfdd5c 273
laserdad 16:d25147dfdd5c 274 //config interrupts, PGA, Buffer, polarity, reference
laserdad 5:d7b803aa9079 275 char mode_config = MODE_NORMAL;
laserdad 5:d7b803aa9079 276 adc1.write8bitReg(REG_PD,mode_config); //got to normal mode
laserdad 5:d7b803aa9079 277 adc2.write8bitReg(REG_PD,mode_config); //got to normal mode
laserdad 16:d25147dfdd5c 278
laserdad 11:1050ffc0e9ef 279 char filter_config = FIR_SIXTY | _RATE(5) ; //five is the max at 35.6 sps
laserdad 5:d7b803aa9079 280 adc1.write8bitReg( REG_FILTER,filter_config );
laserdad 5:d7b803aa9079 281 adc2.write8bitReg( REG_FILTER,filter_config );
laserdad 16:d25147dfdd5c 282
laserdad 5:d7b803aa9079 283 char ctrl_config = INT_CLOCK | BIPOLAR | TWOS_COMP | _PBUF_EN(0) | _NBUF_EN(0) | REF_AVDD ; //ADC configuration
laserdad 5:d7b803aa9079 284 adc1.write8bitReg( REG_CTRL, ctrl_config );
laserdad 5:d7b803aa9079 285 adc2.write8bitReg( REG_CTRL, ctrl_config );
laserdad 16:d25147dfdd5c 286
laserdad 5:d7b803aa9079 287 char source_config = VBIAS_ACTIVE | BRN_OFF | _IDAC(0); //not sourcing current
laserdad 5:d7b803aa9079 288 adc1.write8bitReg( REG_SOURCE,source_config );
laserdad 5:d7b803aa9079 289 adc2.write8bitReg( REG_SOURCE,source_config );
laserdad 5:d7b803aa9079 290
laserdad 16:d25147dfdd5c 291 uint32_t status_ie_config = DATA_RDY_INT | CAL_RDY_INT | CONV_RDY_INT;
laserdad 16:d25147dfdd5c 292 adc1.write24bitReg(REG_STATUS_IE,status_ie_config);
laserdad 5:d7b803aa9079 293 adc2.write8bitReg( REG_SOURCE,source_config );
laserdad 16:d25147dfdd5c 294
laserdad 5:d7b803aa9079 295 char gain_setting = 0;
laserdad 5:d7b803aa9079 296 char pga_config = PGA | _GAIN_EXP(gain_setting) ; //no gain
laserdad 5:d7b803aa9079 297 adc1.write8bitReg(REG_PGA,pga_config);
laserdad 5:d7b803aa9079 298 adc2.write8bitReg(REG_PGA,pga_config);
laserdad 5:d7b803aa9079 299
laserdad 5:d7b803aa9079 300 pc.printf("PGA gain = %d\r\n",1<<gain_setting);
laserdad 16:d25147dfdd5c 301
laserdad 5:d7b803aa9079 302 //check register writes
laserdad 16:d25147dfdd5c 303 pc.printf("checking register writes ADC1\r\n");
laserdad 5:d7b803aa9079 304 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_PD,adc1.read8bits(REG_PD,&int_state),mode_config);
laserdad 16:d25147dfdd5c 305 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_FILTER,adc1.read8bits(REG_FILTER,&int_state),filter_config);
laserdad 5:d7b803aa9079 306 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_CTRL,adc1.read8bits(REG_CTRL,&int_state),ctrl_config);
laserdad 5:d7b803aa9079 307 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_SOURCE,adc1.read8bits(REG_SOURCE,&int_state),source_config);
laserdad 16:d25147dfdd5c 308 pc.printf("reg %02x, val %06x, set to %06x\r\n",REG_STATUS_IE,adc1.read24bits(REG_STATUS_IE,&int_state),status_ie_config);
laserdad 16:d25147dfdd5c 309 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_PGA,adc1.read8bits(REG_PGA,&int_state),pga_config);
laserdad 16:d25147dfdd5c 310 pc.printf("checking register writes ADC2\r\n");
laserdad 16:d25147dfdd5c 311 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_PD,adc2.read8bits(REG_PD,&int_state),mode_config);
laserdad 16:d25147dfdd5c 312 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_FILTER,adc2.read8bits(REG_FILTER,&int_state),filter_config);
laserdad 16:d25147dfdd5c 313 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_CTRL,adc2.read8bits(REG_CTRL,&int_state),ctrl_config);
laserdad 16:d25147dfdd5c 314 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_SOURCE,adc2.read8bits(REG_SOURCE,&int_state),source_config);
laserdad 16:d25147dfdd5c 315 pc.printf("reg %02x, val %06x, set to %06x\r\n",REG_STATUS_IE,adc2.read24bits(REG_STATUS_IE,&int_state),status_ie_config);
laserdad 16:d25147dfdd5c 316 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_PGA,adc2.read8bits(REG_PGA,&int_state),pga_config);
laserdad 16:d25147dfdd5c 317
laserdad 7:5295cbdb123c 318
laserdad 16:d25147dfdd5c 319 pc.printf("beginning while loop\r\n");
laserdad 7:5295cbdb123c 320 wait_ms(1000);
laserdad 16:d25147dfdd5c 321 t.start();
laserdad 16:d25147dfdd5c 322 while(1) {
laserdad 16:d25147dfdd5c 323 for(int n=0; n<5; n++) {
laserdad 16:d25147dfdd5c 324 //setup ADCs to read in parallel
laserdad 6:c3db4eff9170 325 //select channel
shawjo 9:5d9509c15e8a 326 char p_ch = 2*n+1<<4;
shawjo 9:5d9509c15e8a 327 char n_ch = 2*n;
laserdad 6:c3db4eff9170 328 adc1.write8bitReg(REG_MUX_CTRL0, p_ch | n_ch );
laserdad 11:1050ffc0e9ef 329 adc2.write8bitReg(REG_MUX_CTRL0, p_ch | n_ch );
laserdad 16:d25147dfdd5c 330
laserdad 6:c3db4eff9170 331 //select data output register and begin conversion
laserdad 6:c3db4eff9170 332 adc1.write8bitReg(REG_CONV_START, (_DEST(n) | SINGLE_CONV) );
laserdad 11:1050ffc0e9ef 333 adc2.write8bitReg(REG_CONV_START, (_DEST(n) | SINGLE_CONV) );
laserdad 16:d25147dfdd5c 334
laserdad 6:c3db4eff9170 335 //optional: cal Gain
laserdad 16:d25147dfdd5c 336
laserdad 6:c3db4eff9170 337 //optional: cal Offset
laserdad 16:d25147dfdd5c 338
laserdad 6:c3db4eff9170 339 //optional: store cal parameters
laserdad 16:d25147dfdd5c 340
laserdad 6:c3db4eff9170 341 //begin conversion
laserdad 16:d25147dfdd5c 342
laserdad 6:c3db4eff9170 343 //wait for interrupt
laserdad 16:d25147dfdd5c 344 while(!adc1.interrupt() ) {
laserdad 6:c3db4eff9170 345 wait_ms(CONV_DELAY_MS);//do nothing
laserdad 7:5295cbdb123c 346 // pc.printf("waiting for int");
laserdad 6:c3db4eff9170 347 }
laserdad 16:d25147dfdd5c 348 if (channel_data[n] == 0) {
laserdad 11:1050ffc0e9ef 349 channel_data[n] = adc1.read24bitsSigned(REG_DATA0+n,&int_state);
laserdad 16:d25147dfdd5c 350 } else {
laserdad 16:d25147dfdd5c 351 new_data = adc1.read24bitsSigned(REG_DATA0+n,&int_state);
laserdad 16:d25147dfdd5c 352 // channel_data[n] += (new_data-channel_data[n])/filterdiv;
laserdad 16:d25147dfdd5c 353 channel_data[n] = new_data;
laserdad 11:1050ffc0e9ef 354 }
laserdad 16:d25147dfdd5c 355 while(!adc2.interrupt() ) {
laserdad 6:c3db4eff9170 356 wait_ms(CONV_DELAY_MS);//do nothing
laserdad 11:1050ffc0e9ef 357 // pc.printf("waiting for int");
laserdad 6:c3db4eff9170 358 }
laserdad 6:c3db4eff9170 359 //read conversion
laserdad 16:d25147dfdd5c 360 if (channel_data[n+5] == 0) {
laserdad 11:1050ffc0e9ef 361 channel_data[n+5] = adc2.read24bitsSigned(REG_DATA0+n,&int_state);
laserdad 16:d25147dfdd5c 362 } else {
laserdad 12:75efd1e2314c 363 new_data = adc2.read24bitsSigned(REG_DATA0+n,&int_state);
laserdad 12:75efd1e2314c 364 //channel_data[n+5] += (new_data-channel_data[n+5])/filterdiv;
laserdad 16:d25147dfdd5c 365 channel_data[n+5] = new_data;
laserdad 16:d25147dfdd5c 366 }
laserdad 6:c3db4eff9170 367 }
laserdad 6:c3db4eff9170 368 // calc checksum
laserdad 11:1050ffc0e9ef 369 checksum = 0x66 + 0x01;
laserdad 12:75efd1e2314c 370 // for (int n=0; n<NUM_CHANNELS; n++)
shawjo 8:882a6cdb1bf3 371 // {
shawjo 8:882a6cdb1bf3 372 // checksum += channel_data[n];
shawjo 8:882a6cdb1bf3 373 // }
shawjo 8:882a6cdb1bf3 374 // checksum_byte = (char) checksum;
laserdad 16:d25147dfdd5c 375
laserdad 17:f051190b4bff 376 //****************************************************************************
laserdad 17:f051190b4bff 377 get_avgs(); //calculate running average
laserdad 17:f051190b4bff 378 // fir(); //run FIR filter on all channels
laserdad 17:f051190b4bff 379 // iir();
laserdad 17:f051190b4bff 380 //****************************************************************************
laserdad 17:f051190b4bff 381
laserdad 17:f051190b4bff 382
laserdad 17:f051190b4bff 383
laserdad 16:d25147dfdd5c 384 for (int n=0; n<NUM_CHANNELS; n++) {
laserdad 16:d25147dfdd5c 385 for(int m=0; m<4; m++) {
laserdad 17:f051190b4bff 386 byte2print[n*4+m] = getNthByte(avg_data[n],3-m);
laserdad 17:f051190b4bff 387 checksum += getNthByte(avg_data[n],3-m);
laserdad 16:d25147dfdd5c 388 }
laserdad 6:c3db4eff9170 389 }
shawjo 8:882a6cdb1bf3 390 checksum_byte = (char) checksum;
shawjo 8:882a6cdb1bf3 391
laserdad 6:c3db4eff9170 392 //print data and checksum
laserdad 16:d25147dfdd5c 393
laserdad 6:c3db4eff9170 394 // print header 0x6601
laserdad 6:c3db4eff9170 395 rpi.putc(0x66);
laserdad 6:c3db4eff9170 396 rpi.putc(0x01);
laserdad 16:d25147dfdd5c 397 for (int n =0; n<40; n++) {
laserdad 6:c3db4eff9170 398 rpi.putc(byte2print[n]);
laserdad 6:c3db4eff9170 399 }
laserdad 7:5295cbdb123c 400 rpi.putc( checksum_byte );
laserdad 7:5295cbdb123c 401 // now reassemble the bits and print them
laserdad 11:1050ffc0e9ef 402 //
laserdad 12:75efd1e2314c 403 // for (int n=0;n<NUM_CHANNELS;n++)
laserdad 11:1050ffc0e9ef 404 // {
laserdad 11:1050ffc0e9ef 405 // channel_data2[n] = (byte2print[4*n]<<24 ) | ( byte2print[4*n+1]<<16 ) | ( byte2print[4*n+2] << 8 ) | byte2print[4*n+3];
laserdad 11:1050ffc0e9ef 406 // }
laserdad 11:1050ffc0e9ef 407 // pc.printf("orig reconstructed\r\n");
laserdad 12:75efd1e2314c 408
laserdad 16:d25147dfdd5c 409
laserdad 16:d25147dfdd5c 410 // pc.printf("%d, ",t.read_ms());
laserdad 16:d25147dfdd5c 411 for (int n=0; n<NUM_CHANNELS; n++) {
laserdad 16:d25147dfdd5c 412 // for (int n=3; n<7; n++) {
laserdad 16:d25147dfdd5c 413 // pc.printf("%d, %d\r\n",n,avg_data[n]);
laserdad 16:d25147dfdd5c 414 pc.printf("%d, ",avg_data[n]);
laserdad 16:d25147dfdd5c 415 // pc.printf("%d, ",channel_data[n]);
laserdad 12:75efd1e2314c 416 }
laserdad 16:d25147dfdd5c 417 pc.printf("\r\n");
laserdad 11:1050ffc0e9ef 418 // checksum2 = 0;
laserdad 12:75efd1e2314c 419 // for(int n=0;n<NUM_CHANNELS;n++)
laserdad 11:1050ffc0e9ef 420 // {
laserdad 16:d25147dfdd5c 421 // checksum2 += channel_data2[n];
laserdad 11:1050ffc0e9ef 422 // }
laserdad 11:1050ffc0e9ef 423 // pc.printf("checksum %02X, %08X, %08X\r\n",checksum_byte,checksum,checksum2);
laserdad 6:c3db4eff9170 424 } //end while
laserdad 5:d7b803aa9079 425
laserdad 5:d7b803aa9079 426 } //END MAIN