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:
Sat Feb 23 00:58:04 2019 +0000
Revision:
12:75efd1e2314c
Parent:
11:1050ffc0e9ef
Child:
13:02c28a5a26c0
put in running average instead of IIR filter

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 6:c3db4eff9170 10
laserdad 6:c3db4eff9170 11
laserdad 5:d7b803aa9079 12 AnalogOut vOut1(A3);
laserdad 5:d7b803aa9079 13 AnalogOut vOut2(A4);
laserdad 5:d7b803aa9079 14 DigitalOut cs_pin1(CS1);
laserdad 5:d7b803aa9079 15 DigitalOut cs_pin2(CS2);
laserdad 5:d7b803aa9079 16 SPI spi(MOSI_1, MISO_1, SCLK_1);
laserdad 5:d7b803aa9079 17 MAX11410 adc1(&spi,&cs_pin1);
laserdad 5:d7b803aa9079 18 MAX11410 adc2(&spi,&cs_pin2);
laserdad 7:5295cbdb123c 19 Serial pc(USBTX, USBRX,115200);
laserdad 7:5295cbdb123c 20 //Serial pc(USBTX, USBRX, 9600);
laserdad 6:c3db4eff9170 21 Serial rpi(PA_9,PA_10,115200);
laserdad 5:d7b803aa9079 22
laserdad 12:75efd1e2314c 23 #define NUM_CHANNELS 10
laserdad 12:75efd1e2314c 24
laserdad 12:75efd1e2314c 25 int32_t channel_data[NUM_CHANNELS];
laserdad 12:75efd1e2314c 26 int32_t new_data;
laserdad 12:75efd1e2314c 27 int32_t avg_data;
laserdad 12:75efd1e2314c 28 int32t data_buffer[NUM_CHANNELS][10];
laserdad 12:75efd1e2314c 29 int32t data_sum[NUM_CHANNELS];
laserdad 12:75efd1e2314c 30 int32t ind = 0;
laserdad 12:75efd1e2314c 31 int num_samples = 0;
laserdad 12:75efd1e2314c 32 int num_avgs = 4;
laserdad 12:75efd1e2314c 33 int ptr =-1;
laserdad 12:75efd1e2314c 34
laserdad 5:d7b803aa9079 35 void starting()
smartsystemdesign 2:39ba9beabf3c 36 {
laserdad 5:d7b803aa9079 37 pc.printf("this program has started\r\n");
laserdad 5:d7b803aa9079 38 }
laserdad 5:d7b803aa9079 39
simon 0:4f78cdfc99de 40
laserdad 6:c3db4eff9170 41 char getNthByte(int32_t data, int ind)
laserdad 6:c3db4eff9170 42 {
laserdad 6:c3db4eff9170 43 return (data>>(8*ind)) & 0x000000FF ;
laserdad 6:c3db4eff9170 44 }
laserdad 5:d7b803aa9079 45
laserdad 5:d7b803aa9079 46
laserdad 5:d7b803aa9079 47 void print8bitRegsAdc1(char start_reg,char end_reg)
laserdad 5:d7b803aa9079 48 {
laserdad 5:d7b803aa9079 49 bool int_status;
laserdad 5:d7b803aa9079 50 char val;
laserdad 5:d7b803aa9079 51 for(int n=start_reg;n<=end_reg;n++)
laserdad 5:d7b803aa9079 52 {
laserdad 5:d7b803aa9079 53 val = adc1.read8bits(n,&int_status);
laserdad 5:d7b803aa9079 54 pc.printf("reg %02x, val =%02x\r\n",n,val);
simon 0:4f78cdfc99de 55 }
laserdad 5:d7b803aa9079 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 5:d7b803aa9079 63 for(int n=start_reg;n<=end_reg;n++)
laserdad 5:d7b803aa9079 64 {
laserdad 5:d7b803aa9079 65 val = adc2.read8bits(n,&int_status);
laserdad 5:d7b803aa9079 66 pc.printf("reg %02x, val =%02x\r\n",n,val);
laserdad 5:d7b803aa9079 67 }
simon 0:4f78cdfc99de 68 }
smartsystemdesign 2:39ba9beabf3c 69
laserdad 7:5295cbdb123c 70
laserdad 12:75efd1e2314c 71 void get_avgs() {
laserdad 12:75efd1e2314c 72 ptr++; //increment pointer
laserdad 12:75efd1e2314c 73 if (ptr == num_avgs) {
laserdad 12:75efd1e2314c 74 ptr = 0; //reset pointer
laserdad 12:75efd1e2314c 75 }
laserdad 12:75efd1e2314c 76 if num_samples < num_avgs {
laserdad 12:75efd1e2314c 77 num_samples++; //increment number of samples
laserdad 12:75efd1e2314c 78 }
laserdad 12:75efd1e2314c 79 else {
laserdad 12:75efd1e2314c 80 for (int n = 0; n<NUM_CHANNELS; n++) { //loop over channels
laserdad 12:75efd1e2314c 81 data_sum[n] -= data_buffer[n][ptr]; //subtract oldest sample
laserdad 12:75efd1e2314c 82 }
laserdad 12:75efd1e2314c 83 }
laserdad 12:75efd1e2314c 84 for (int n=0;n<NUM_CHANNELS;n++) {
laserdad 12:75efd1e2314c 85 data_buffer[n][ptr] = channel_data[n]; //put new sample in buffer
laserdad 12:75efd1e2314c 86 data_sum[n] += channel_data[n]; //add new sample
laserdad 12:75efd1e2314c 87 avg_data[n] = data_sum[n] / num_avgs; //get new average
laserdad 12:75efd1e2314c 88 }
laserdad 12:75efd1e2314c 89 {
laserdad 12:75efd1e2314c 90
laserdad 12:75efd1e2314c 91
laserdad 5:d7b803aa9079 92 int main()
smartsystemdesign 2:39ba9beabf3c 93 {
laserdad 12:75efd1e2314c 94
laserdad 12:75efd1e2314c 95 // int32_t channel_data2[NUM_CHANNELS];
laserdad 12:75efd1e2314c 96
laserdad 12:75efd1e2314c 97
laserdad 12:75efd1e2314c 98
laserdad 12:75efd1e2314c 99
laserdad 12:75efd1e2314c 100
laserdad 12:75efd1e2314c 101
laserdad 11:1050ffc0e9ef 102 int filterdiv = 4; //this is the divisor in the IIR channel filter.
laserdad 11:1050ffc0e9ef 103 // It adds 1/filterdiv of the difference between the new sample and the average to the new average
laserdad 11:1050ffc0e9ef 104 // This is integer math, so I am sticking to multiples of 2 for now.
laserdad 7:5295cbdb123c 105 int32_t checksum2 =0;
laserdad 7:5295cbdb123c 106 int32_t checksum = 0;
laserdad 7:5295cbdb123c 107 char checksum_byte = 0;
laserdad 7:5295cbdb123c 108 char byte2print[40];
laserdad 6:c3db4eff9170 109 double vdiff=0.01;
laserdad 5:d7b803aa9079 110 vOut1 = 0.5-vdiff/2;
laserdad 5:d7b803aa9079 111 vOut2 = 0.5+vdiff/2;
laserdad 5:d7b803aa9079 112 starting();
laserdad 7:5295cbdb123c 113
laserdad 5:d7b803aa9079 114 bool int_state;
laserdad 5:d7b803aa9079 115 spi.format(8,MAX11410_SPI_MODE); //configure number of spi bits 8, 16
laserdad 5:d7b803aa9079 116 spi.frequency(8000000); // Max 8MHz
laserdad 5:d7b803aa9079 117 //read chip ID
laserdad 5:d7b803aa9079 118
laserdad 5:d7b803aa9079 119 pc.printf("chip ID %d\r\n",adc1.read8bits(REG_PART_ID,&int_state) );
laserdad 5:d7b803aa9079 120
laserdad 5:d7b803aa9079 121 //config ADC 1
laserdad 11:1050ffc0e9ef 122 adc1.reset(); //POR chip 1
laserdad 11:1050ffc0e9ef 123 adc2.reset(); //POR chip 2
laserdad 5:d7b803aa9079 124
laserdad 5:d7b803aa9079 125 //check default register configs
laserdad 5:d7b803aa9079 126 pc.printf("default regs for ADC1\r\n");
laserdad 5:d7b803aa9079 127 print8bitRegsAdc1(REG_PD,REG_WAIT_START);
laserdad 5:d7b803aa9079 128
laserdad 5:d7b803aa9079 129 pc.printf("default regs for ADC2\r\n");
laserdad 5:d7b803aa9079 130 print8bitRegsAdc2(REG_PD,REG_WAIT_START);
laserdad 5:d7b803aa9079 131
laserdad 5:d7b803aa9079 132 //config interrupts, PGA, Buffer, polarity, reference
laserdad 5:d7b803aa9079 133 char mode_config = MODE_NORMAL;
laserdad 5:d7b803aa9079 134 adc1.write8bitReg(REG_PD,mode_config); //got to normal mode
laserdad 5:d7b803aa9079 135 adc2.write8bitReg(REG_PD,mode_config); //got to normal mode
laserdad 5:d7b803aa9079 136
laserdad 11:1050ffc0e9ef 137 char filter_config = FIR_SIXTY | _RATE(5) ; //five is the max at 35.6 sps
laserdad 5:d7b803aa9079 138 adc1.write8bitReg( REG_FILTER,filter_config );
laserdad 5:d7b803aa9079 139 adc2.write8bitReg( REG_FILTER,filter_config );
laserdad 5:d7b803aa9079 140
laserdad 5:d7b803aa9079 141 char ctrl_config = INT_CLOCK | BIPOLAR | TWOS_COMP | _PBUF_EN(0) | _NBUF_EN(0) | REF_AVDD ; //ADC configuration
laserdad 5:d7b803aa9079 142 adc1.write8bitReg( REG_CTRL, ctrl_config );
laserdad 5:d7b803aa9079 143 adc2.write8bitReg( REG_CTRL, ctrl_config );
laserdad 5:d7b803aa9079 144
laserdad 5:d7b803aa9079 145 char source_config = VBIAS_ACTIVE | BRN_OFF | _IDAC(0); //not sourcing current
laserdad 5:d7b803aa9079 146 adc1.write8bitReg( REG_SOURCE,source_config );
laserdad 5:d7b803aa9079 147 adc2.write8bitReg( REG_SOURCE,source_config );
laserdad 5:d7b803aa9079 148
laserdad 5:d7b803aa9079 149 uint32_t status_ie_config = DATA_RDY_INT | CAL_RDY_INT | CONV_RDY_INT;
laserdad 5:d7b803aa9079 150 adc1.write24bitReg(REG_STATUS_IE,status_ie_config);
laserdad 5:d7b803aa9079 151 adc2.write8bitReg( REG_SOURCE,source_config );
laserdad 5:d7b803aa9079 152
laserdad 5:d7b803aa9079 153 char gain_setting = 0;
laserdad 5:d7b803aa9079 154 char pga_config = PGA | _GAIN_EXP(gain_setting) ; //no gain
laserdad 5:d7b803aa9079 155 adc1.write8bitReg(REG_PGA,pga_config);
laserdad 5:d7b803aa9079 156 adc2.write8bitReg(REG_PGA,pga_config);
laserdad 5:d7b803aa9079 157
laserdad 5:d7b803aa9079 158 pc.printf("PGA gain = %d\r\n",1<<gain_setting);
laserdad 5:d7b803aa9079 159
laserdad 5:d7b803aa9079 160 //check register writes
laserdad 5:d7b803aa9079 161 pc.printf("checking register writes\r\n");
laserdad 5:d7b803aa9079 162 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_PD,adc1.read8bits(REG_PD,&int_state),mode_config);
laserdad 5:d7b803aa9079 163 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_FILTER,adc1.read8bits(REG_FILTER,&int_state),filter_config);
laserdad 5:d7b803aa9079 164 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_CTRL,adc1.read8bits(REG_CTRL,&int_state),ctrl_config);
laserdad 5:d7b803aa9079 165 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_SOURCE,adc1.read8bits(REG_SOURCE,&int_state),source_config);
laserdad 5:d7b803aa9079 166 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 5:d7b803aa9079 167 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_PGA,adc1.read8bits(REG_PGA,&int_state),pga_config);
laserdad 5:d7b803aa9079 168
laserdad 5:d7b803aa9079 169 // for each channel 1-5
shawjo 9:5d9509c15e8a 170 /// for(int n=0;n<5;n++)
shawjo 9:5d9509c15e8a 171 /// {
shawjo 9:5d9509c15e8a 172 /// //select channel
shawjo 9:5d9509c15e8a 173 /// char p_ch = 2*n<<4;
shawjo 9:5d9509c15e8a 174 /// char n_ch = 2*n+1;
shawjo 9:5d9509c15e8a 175 /// adc1.write8bitReg(REG_MUX_CTRL0, p_ch | n_ch );
shawjo 9:5d9509c15e8a 176 ///
shawjo 9:5d9509c15e8a 177 /// //select data output register and begin conversion
shawjo 9:5d9509c15e8a 178 /// adc1.write8bitReg(REG_CONV_START, (_DEST(n) | SINGLE_CONV) );
shawjo 9:5d9509c15e8a 179 ///
shawjo 9:5d9509c15e8a 180 /// //optional: cal Gain
shawjo 9:5d9509c15e8a 181 ///
shawjo 9:5d9509c15e8a 182 /// //optional: cal Offset
shawjo 9:5d9509c15e8a 183 ///
shawjo 9:5d9509c15e8a 184 /// //optional: store cal parameters
shawjo 9:5d9509c15e8a 185 ///
shawjo 9:5d9509c15e8a 186 /// //begin conversion
shawjo 9:5d9509c15e8a 187 ///
shawjo 9:5d9509c15e8a 188 /// //wait for interrupt
shawjo 9:5d9509c15e8a 189 /// while(!adc1.interrupt() )
shawjo 9:5d9509c15e8a 190 /// {
shawjo 9:5d9509c15e8a 191 /// wait_ms(CONV_DELAY_MS);//do nothing
shawjo 9:5d9509c15e8a 192 ///// pc.printf("waiting for int");
shawjo 9:5d9509c15e8a 193 /// }
shawjo 9:5d9509c15e8a 194 ///
shawjo 9:5d9509c15e8a 195 /// //read conversion
shawjo 9:5d9509c15e8a 196 /// channel_data[n] = adc1.read24bitsSigned(REG_DATA0+n,&int_state);
shawjo 9:5d9509c15e8a 197 /// pc.printf("%d, ",channel_data[n]);
shawjo 9:5d9509c15e8a 198 /// } //channel sweep
shawjo 9:5d9509c15e8a 199 /// pc.printf("\r\n");
shawjo 9:5d9509c15e8a 200 ///
shawjo 9:5d9509c15e8a 201 ///
shawjo 9:5d9509c15e8a 202 /// //config ADC 2: repeat above
laserdad 5:d7b803aa9079 203
laserdad 5:d7b803aa9079 204
laserdad 7:5295cbdb123c 205
laserdad 7:5295cbdb123c 206 pc.printf("beginning while loop");
laserdad 7:5295cbdb123c 207 wait_ms(1000);
laserdad 6:c3db4eff9170 208 while(1)
laserdad 6:c3db4eff9170 209 {
laserdad 6:c3db4eff9170 210 for(int n=0; n<5; n++)
laserdad 6:c3db4eff9170 211 {
laserdad 11:1050ffc0e9ef 212 //setup ADCs to read in parallel
laserdad 6:c3db4eff9170 213 //select channel
shawjo 9:5d9509c15e8a 214 char p_ch = 2*n+1<<4;
shawjo 9:5d9509c15e8a 215 char n_ch = 2*n;
laserdad 6:c3db4eff9170 216 adc1.write8bitReg(REG_MUX_CTRL0, p_ch | n_ch );
laserdad 11:1050ffc0e9ef 217 adc2.write8bitReg(REG_MUX_CTRL0, p_ch | n_ch );
laserdad 6:c3db4eff9170 218
laserdad 6:c3db4eff9170 219 //select data output register and begin conversion
laserdad 6:c3db4eff9170 220 adc1.write8bitReg(REG_CONV_START, (_DEST(n) | SINGLE_CONV) );
laserdad 11:1050ffc0e9ef 221 adc2.write8bitReg(REG_CONV_START, (_DEST(n) | SINGLE_CONV) );
laserdad 6:c3db4eff9170 222
laserdad 6:c3db4eff9170 223 //optional: cal Gain
laserdad 6:c3db4eff9170 224
laserdad 6:c3db4eff9170 225 //optional: cal Offset
laserdad 6:c3db4eff9170 226
laserdad 6:c3db4eff9170 227 //optional: store cal parameters
laserdad 6:c3db4eff9170 228
laserdad 6:c3db4eff9170 229 //begin conversion
laserdad 6:c3db4eff9170 230
laserdad 6:c3db4eff9170 231 //wait for interrupt
laserdad 6:c3db4eff9170 232 while(!adc1.interrupt() )
laserdad 6:c3db4eff9170 233 {
laserdad 6:c3db4eff9170 234 wait_ms(CONV_DELAY_MS);//do nothing
laserdad 7:5295cbdb123c 235 // pc.printf("waiting for int");
laserdad 6:c3db4eff9170 236 }
laserdad 11:1050ffc0e9ef 237 if (channel_data[n] == 0)
laserdad 11:1050ffc0e9ef 238 {
laserdad 11:1050ffc0e9ef 239 channel_data[n] = adc1.read24bitsSigned(REG_DATA0+n,&int_state);
laserdad 11:1050ffc0e9ef 240 }
laserdad 11:1050ffc0e9ef 241 else
laserdad 11:1050ffc0e9ef 242 {
laserdad 12:75efd1e2314c 243 new_data = adc1.read24bitsSigned(REG_DATA0+n,&int_state);
laserdad 12:75efd1e2314c 244 // channel_data[n] += (new_data-channel_data[n])/filterdiv;
laserdad 12:75efd1e2314c 245 channel_data[n] = new_data;
laserdad 11:1050ffc0e9ef 246 }
laserdad 6:c3db4eff9170 247 while(!adc2.interrupt() )
laserdad 6:c3db4eff9170 248 {
laserdad 6:c3db4eff9170 249 wait_ms(CONV_DELAY_MS);//do nothing
laserdad 11:1050ffc0e9ef 250 // pc.printf("waiting for int");
laserdad 6:c3db4eff9170 251 }
laserdad 6:c3db4eff9170 252 //read conversion
laserdad 11:1050ffc0e9ef 253 if (channel_data[n+5] == 0)
laserdad 11:1050ffc0e9ef 254 {
laserdad 11:1050ffc0e9ef 255 channel_data[n+5] = adc2.read24bitsSigned(REG_DATA0+n,&int_state);
laserdad 11:1050ffc0e9ef 256 }
laserdad 11:1050ffc0e9ef 257 else
laserdad 11:1050ffc0e9ef 258 {
laserdad 12:75efd1e2314c 259 new_data = adc2.read24bitsSigned(REG_DATA0+n,&int_state);
laserdad 12:75efd1e2314c 260 //channel_data[n+5] += (new_data-channel_data[n+5])/filterdiv;
laserdad 12:75efd1e2314c 261 channel_data[n] = new_data;
laserdad 11:1050ffc0e9ef 262 }
laserdad 6:c3db4eff9170 263 }
laserdad 6:c3db4eff9170 264 // calc checksum
laserdad 11:1050ffc0e9ef 265 checksum = 0x66 + 0x01;
laserdad 12:75efd1e2314c 266 // for (int n=0; n<NUM_CHANNELS; n++)
shawjo 8:882a6cdb1bf3 267 // {
shawjo 8:882a6cdb1bf3 268 // checksum += channel_data[n];
shawjo 8:882a6cdb1bf3 269 // }
shawjo 8:882a6cdb1bf3 270 // checksum_byte = (char) checksum;
laserdad 6:c3db4eff9170 271
laserdad 12:75efd1e2314c 272 for (int n=0; n<NUM_CHANNELS; n++)
laserdad 6:c3db4eff9170 273 {
laserdad 6:c3db4eff9170 274 for(int m=0;m<4;m++)
laserdad 6:c3db4eff9170 275 {
laserdad 6:c3db4eff9170 276 byte2print[n*4+m] = getNthByte(channel_data[n],3-m);
shawjo 8:882a6cdb1bf3 277 checksum += getNthByte(channel_data[n],3-m);
shawjo 8:882a6cdb1bf3 278 }
laserdad 6:c3db4eff9170 279 }
shawjo 8:882a6cdb1bf3 280 checksum_byte = (char) checksum;
shawjo 8:882a6cdb1bf3 281
laserdad 6:c3db4eff9170 282 //print data and checksum
laserdad 6:c3db4eff9170 283
laserdad 6:c3db4eff9170 284 // print header 0x6601
laserdad 6:c3db4eff9170 285 rpi.putc(0x66);
laserdad 6:c3db4eff9170 286 rpi.putc(0x01);
laserdad 6:c3db4eff9170 287 for (int n =0; n<40;n++)
laserdad 6:c3db4eff9170 288 {
laserdad 6:c3db4eff9170 289 rpi.putc(byte2print[n]);
laserdad 6:c3db4eff9170 290 }
laserdad 7:5295cbdb123c 291 rpi.putc( checksum_byte );
laserdad 7:5295cbdb123c 292 // now reassemble the bits and print them
laserdad 11:1050ffc0e9ef 293 //
laserdad 12:75efd1e2314c 294 // for (int n=0;n<NUM_CHANNELS;n++)
laserdad 11:1050ffc0e9ef 295 // {
laserdad 11:1050ffc0e9ef 296 // channel_data2[n] = (byte2print[4*n]<<24 ) | ( byte2print[4*n+1]<<16 ) | ( byte2print[4*n+2] << 8 ) | byte2print[4*n+3];
laserdad 11:1050ffc0e9ef 297 // }
laserdad 11:1050ffc0e9ef 298 // pc.printf("orig reconstructed\r\n");
laserdad 12:75efd1e2314c 299
laserdad 12:75efd1e2314c 300 get_avgs(); //calculate running average
laserdad 12:75efd1e2314c 301
laserdad 12:75efd1e2314c 302 for (int n=0;n<NUM_CHANNELS;n++)
laserdad 12:75efd1e2314c 303 {
laserdad 12:75efd1e2314c 304 pc.printf("%d, %d\r\n",n,avg_data[n]);
laserdad 12:75efd1e2314c 305 }
laserdad 11:1050ffc0e9ef 306 // checksum2 = 0;
laserdad 12:75efd1e2314c 307 // for(int n=0;n<NUM_CHANNELS;n++)
laserdad 11:1050ffc0e9ef 308 // {
laserdad 11:1050ffc0e9ef 309 // checksum2 += channel_data2[n];
laserdad 11:1050ffc0e9ef 310 // }
laserdad 11:1050ffc0e9ef 311 // pc.printf("checksum %02X, %08X, %08X\r\n",checksum_byte,checksum,checksum2);
laserdad 6:c3db4eff9170 312 } //end while
laserdad 5:d7b803aa9079 313
laserdad 5:d7b803aa9079 314 } //END MAIN