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 22 20:25:00 2018 +0000
Revision:
11:1050ffc0e9ef
Parent:
9:5d9509c15e8a
Child:
12:75efd1e2314c
made ADCs simultaneous added IIR filter got rid of PC prints

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simon 0:4f78cdfc99de 1 // I2CU - Search for devices on an I2C bus
simon 0:4f78cdfc99de 2 // Copyright (c) 2009, sford
simon 0:4f78cdfc99de 3 // Released under the MIT License: http://mbed.org/license/mit
simon 0:4f78cdfc99de 4 //
simon 0:4f78cdfc99de 5 // Goes through each device address, seeing if it gets a response
simon 0:4f78cdfc99de 6 // - for every device if finds, it prints the 8-bit address
simon 0:4f78cdfc99de 7 // - if the program hangs, the bus isn't working (check pull-ups etc)
simon 0:4f78cdfc99de 8 // - if it doesn't find your device, check power/bus wiring etc
smartsystemdesign 3:42120705a9bd 9 //
smartsystemdesign 3:42120705a9bd 10 // - Note: if you plug / unplug devices try cycling power
smartsystemdesign 2:39ba9beabf3c 11
simon 0:4f78cdfc99de 12 #include "mbed.h"
laserdad 5:d7b803aa9079 13 #include "MAX11410.h"
simon 0:4f78cdfc99de 14
laserdad 5:d7b803aa9079 15 #define CS1 D9
laserdad 5:d7b803aa9079 16 #define CS2 D10
laserdad 5:d7b803aa9079 17 #define MOSI_1 D11
laserdad 5:d7b803aa9079 18 #define MISO_1 D12
laserdad 5:d7b803aa9079 19 #define SCLK_1 D13
laserdad 5:d7b803aa9079 20 #define VDD 3.3
laserdad 6:c3db4eff9170 21
laserdad 6:c3db4eff9170 22
laserdad 5:d7b803aa9079 23 AnalogOut vOut1(A3);
laserdad 5:d7b803aa9079 24 AnalogOut vOut2(A4);
laserdad 5:d7b803aa9079 25 DigitalOut cs_pin1(CS1);
laserdad 5:d7b803aa9079 26 DigitalOut cs_pin2(CS2);
laserdad 5:d7b803aa9079 27 SPI spi(MOSI_1, MISO_1, SCLK_1);
laserdad 5:d7b803aa9079 28 MAX11410 adc1(&spi,&cs_pin1);
laserdad 5:d7b803aa9079 29 MAX11410 adc2(&spi,&cs_pin2);
laserdad 7:5295cbdb123c 30 Serial pc(USBTX, USBRX,115200);
laserdad 7:5295cbdb123c 31 //Serial pc(USBTX, USBRX, 9600);
laserdad 6:c3db4eff9170 32 Serial rpi(PA_9,PA_10,115200);
laserdad 5:d7b803aa9079 33
laserdad 5:d7b803aa9079 34 void starting()
smartsystemdesign 2:39ba9beabf3c 35 {
laserdad 5:d7b803aa9079 36 pc.printf("this program has started\r\n");
laserdad 5:d7b803aa9079 37 }
laserdad 5:d7b803aa9079 38
simon 0:4f78cdfc99de 39
laserdad 6:c3db4eff9170 40 char getNthByte(int32_t data, int ind)
laserdad 6:c3db4eff9170 41 {
laserdad 6:c3db4eff9170 42 return (data>>(8*ind)) & 0x000000FF ;
laserdad 6:c3db4eff9170 43 }
laserdad 5:d7b803aa9079 44
laserdad 5:d7b803aa9079 45
laserdad 5:d7b803aa9079 46 void print8bitRegsAdc1(char start_reg,char end_reg)
laserdad 5:d7b803aa9079 47 {
laserdad 5:d7b803aa9079 48 bool int_status;
laserdad 5:d7b803aa9079 49 char val;
laserdad 5:d7b803aa9079 50 for(int n=start_reg;n<=end_reg;n++)
laserdad 5:d7b803aa9079 51 {
laserdad 5:d7b803aa9079 52 val = adc1.read8bits(n,&int_status);
laserdad 5:d7b803aa9079 53 pc.printf("reg %02x, val =%02x\r\n",n,val);
simon 0:4f78cdfc99de 54 }
laserdad 5:d7b803aa9079 55
laserdad 5:d7b803aa9079 56 }
laserdad 5:d7b803aa9079 57
laserdad 5:d7b803aa9079 58 void print8bitRegsAdc2(char start_reg,char end_reg)
laserdad 5:d7b803aa9079 59 {
laserdad 5:d7b803aa9079 60 bool int_status;
laserdad 5:d7b803aa9079 61 char val;
laserdad 5:d7b803aa9079 62 for(int n=start_reg;n<=end_reg;n++)
laserdad 5:d7b803aa9079 63 {
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 5:d7b803aa9079 70 int main()
smartsystemdesign 2:39ba9beabf3c 71 {
laserdad 5:d7b803aa9079 72 int32_t channel_data[10];
laserdad 11:1050ffc0e9ef 73 // int32_t channel_data2[10];
laserdad 11:1050ffc0e9ef 74 int32_t newdata;
laserdad 11:1050ffc0e9ef 75 int filterdiv = 4; //this is the divisor in the IIR channel filter.
laserdad 11:1050ffc0e9ef 76 // It adds 1/filterdiv of the difference between the new sample and the average to the new average
laserdad 11:1050ffc0e9ef 77 // This is integer math, so I am sticking to multiples of 2 for now.
laserdad 7:5295cbdb123c 78 int32_t checksum2 =0;
laserdad 7:5295cbdb123c 79 int32_t checksum = 0;
laserdad 7:5295cbdb123c 80 char checksum_byte = 0;
laserdad 7:5295cbdb123c 81 char byte2print[40];
laserdad 6:c3db4eff9170 82 double vdiff=0.01;
laserdad 5:d7b803aa9079 83 vOut1 = 0.5-vdiff/2;
laserdad 5:d7b803aa9079 84 vOut2 = 0.5+vdiff/2;
laserdad 5:d7b803aa9079 85 starting();
laserdad 7:5295cbdb123c 86
laserdad 5:d7b803aa9079 87 bool int_state;
laserdad 5:d7b803aa9079 88 spi.format(8,MAX11410_SPI_MODE); //configure number of spi bits 8, 16
laserdad 5:d7b803aa9079 89 spi.frequency(8000000); // Max 8MHz
laserdad 5:d7b803aa9079 90 //read chip ID
laserdad 5:d7b803aa9079 91
laserdad 5:d7b803aa9079 92 pc.printf("chip ID %d\r\n",adc1.read8bits(REG_PART_ID,&int_state) );
laserdad 5:d7b803aa9079 93
laserdad 5:d7b803aa9079 94 //config ADC 1
laserdad 11:1050ffc0e9ef 95 adc1.reset(); //POR chip 1
laserdad 11:1050ffc0e9ef 96 adc2.reset(); //POR chip 2
laserdad 5:d7b803aa9079 97
laserdad 5:d7b803aa9079 98 //check default register configs
laserdad 5:d7b803aa9079 99 pc.printf("default regs for ADC1\r\n");
laserdad 5:d7b803aa9079 100 print8bitRegsAdc1(REG_PD,REG_WAIT_START);
laserdad 5:d7b803aa9079 101
laserdad 5:d7b803aa9079 102 pc.printf("default regs for ADC2\r\n");
laserdad 5:d7b803aa9079 103 print8bitRegsAdc2(REG_PD,REG_WAIT_START);
laserdad 5:d7b803aa9079 104
laserdad 5:d7b803aa9079 105 //config interrupts, PGA, Buffer, polarity, reference
laserdad 5:d7b803aa9079 106 char mode_config = MODE_NORMAL;
laserdad 5:d7b803aa9079 107 adc1.write8bitReg(REG_PD,mode_config); //got to normal mode
laserdad 5:d7b803aa9079 108 adc2.write8bitReg(REG_PD,mode_config); //got to normal mode
laserdad 5:d7b803aa9079 109
laserdad 11:1050ffc0e9ef 110 char filter_config = FIR_SIXTY | _RATE(5) ; //five is the max at 35.6 sps
laserdad 5:d7b803aa9079 111 adc1.write8bitReg( REG_FILTER,filter_config );
laserdad 5:d7b803aa9079 112 adc2.write8bitReg( REG_FILTER,filter_config );
laserdad 5:d7b803aa9079 113
laserdad 5:d7b803aa9079 114 char ctrl_config = INT_CLOCK | BIPOLAR | TWOS_COMP | _PBUF_EN(0) | _NBUF_EN(0) | REF_AVDD ; //ADC configuration
laserdad 5:d7b803aa9079 115 adc1.write8bitReg( REG_CTRL, ctrl_config );
laserdad 5:d7b803aa9079 116 adc2.write8bitReg( REG_CTRL, ctrl_config );
laserdad 5:d7b803aa9079 117
laserdad 5:d7b803aa9079 118 char source_config = VBIAS_ACTIVE | BRN_OFF | _IDAC(0); //not sourcing current
laserdad 5:d7b803aa9079 119 adc1.write8bitReg( REG_SOURCE,source_config );
laserdad 5:d7b803aa9079 120 adc2.write8bitReg( REG_SOURCE,source_config );
laserdad 5:d7b803aa9079 121
laserdad 5:d7b803aa9079 122 uint32_t status_ie_config = DATA_RDY_INT | CAL_RDY_INT | CONV_RDY_INT;
laserdad 5:d7b803aa9079 123 adc1.write24bitReg(REG_STATUS_IE,status_ie_config);
laserdad 5:d7b803aa9079 124 adc2.write8bitReg( REG_SOURCE,source_config );
laserdad 5:d7b803aa9079 125
laserdad 5:d7b803aa9079 126 char gain_setting = 0;
laserdad 5:d7b803aa9079 127 char pga_config = PGA | _GAIN_EXP(gain_setting) ; //no gain
laserdad 5:d7b803aa9079 128 adc1.write8bitReg(REG_PGA,pga_config);
laserdad 5:d7b803aa9079 129 adc2.write8bitReg(REG_PGA,pga_config);
laserdad 5:d7b803aa9079 130
laserdad 5:d7b803aa9079 131 pc.printf("PGA gain = %d\r\n",1<<gain_setting);
laserdad 5:d7b803aa9079 132
laserdad 5:d7b803aa9079 133 //check register writes
laserdad 5:d7b803aa9079 134 pc.printf("checking register writes\r\n");
laserdad 5:d7b803aa9079 135 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_PD,adc1.read8bits(REG_PD,&int_state),mode_config);
laserdad 5:d7b803aa9079 136 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_FILTER,adc1.read8bits(REG_FILTER,&int_state),filter_config);
laserdad 5:d7b803aa9079 137 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_CTRL,adc1.read8bits(REG_CTRL,&int_state),ctrl_config);
laserdad 5:d7b803aa9079 138 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_SOURCE,adc1.read8bits(REG_SOURCE,&int_state),source_config);
laserdad 5:d7b803aa9079 139 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 140 pc.printf("reg %02x, val %02x, set to %02x\r\n",REG_PGA,adc1.read8bits(REG_PGA,&int_state),pga_config);
laserdad 5:d7b803aa9079 141
laserdad 5:d7b803aa9079 142 // for each channel 1-5
shawjo 9:5d9509c15e8a 143 /// for(int n=0;n<5;n++)
shawjo 9:5d9509c15e8a 144 /// {
shawjo 9:5d9509c15e8a 145 /// //select channel
shawjo 9:5d9509c15e8a 146 /// char p_ch = 2*n<<4;
shawjo 9:5d9509c15e8a 147 /// char n_ch = 2*n+1;
shawjo 9:5d9509c15e8a 148 /// adc1.write8bitReg(REG_MUX_CTRL0, p_ch | n_ch );
shawjo 9:5d9509c15e8a 149 ///
shawjo 9:5d9509c15e8a 150 /// //select data output register and begin conversion
shawjo 9:5d9509c15e8a 151 /// adc1.write8bitReg(REG_CONV_START, (_DEST(n) | SINGLE_CONV) );
shawjo 9:5d9509c15e8a 152 ///
shawjo 9:5d9509c15e8a 153 /// //optional: cal Gain
shawjo 9:5d9509c15e8a 154 ///
shawjo 9:5d9509c15e8a 155 /// //optional: cal Offset
shawjo 9:5d9509c15e8a 156 ///
shawjo 9:5d9509c15e8a 157 /// //optional: store cal parameters
shawjo 9:5d9509c15e8a 158 ///
shawjo 9:5d9509c15e8a 159 /// //begin conversion
shawjo 9:5d9509c15e8a 160 ///
shawjo 9:5d9509c15e8a 161 /// //wait for interrupt
shawjo 9:5d9509c15e8a 162 /// while(!adc1.interrupt() )
shawjo 9:5d9509c15e8a 163 /// {
shawjo 9:5d9509c15e8a 164 /// wait_ms(CONV_DELAY_MS);//do nothing
shawjo 9:5d9509c15e8a 165 ///// pc.printf("waiting for int");
shawjo 9:5d9509c15e8a 166 /// }
shawjo 9:5d9509c15e8a 167 ///
shawjo 9:5d9509c15e8a 168 /// //read conversion
shawjo 9:5d9509c15e8a 169 /// channel_data[n] = adc1.read24bitsSigned(REG_DATA0+n,&int_state);
shawjo 9:5d9509c15e8a 170 /// pc.printf("%d, ",channel_data[n]);
shawjo 9:5d9509c15e8a 171 /// } //channel sweep
shawjo 9:5d9509c15e8a 172 /// pc.printf("\r\n");
shawjo 9:5d9509c15e8a 173 ///
shawjo 9:5d9509c15e8a 174 ///
shawjo 9:5d9509c15e8a 175 /// //config ADC 2: repeat above
laserdad 5:d7b803aa9079 176
laserdad 5:d7b803aa9079 177
laserdad 7:5295cbdb123c 178
laserdad 7:5295cbdb123c 179 pc.printf("beginning while loop");
laserdad 7:5295cbdb123c 180 wait_ms(1000);
laserdad 6:c3db4eff9170 181 while(1)
laserdad 6:c3db4eff9170 182 {
laserdad 6:c3db4eff9170 183 for(int n=0; n<5; n++)
laserdad 6:c3db4eff9170 184 {
laserdad 11:1050ffc0e9ef 185 //setup ADCs to read in parallel
laserdad 6:c3db4eff9170 186 //select channel
shawjo 9:5d9509c15e8a 187 char p_ch = 2*n+1<<4;
shawjo 9:5d9509c15e8a 188 char n_ch = 2*n;
laserdad 6:c3db4eff9170 189 adc1.write8bitReg(REG_MUX_CTRL0, p_ch | n_ch );
laserdad 11:1050ffc0e9ef 190 adc2.write8bitReg(REG_MUX_CTRL0, p_ch | n_ch );
laserdad 6:c3db4eff9170 191
laserdad 6:c3db4eff9170 192 //select data output register and begin conversion
laserdad 6:c3db4eff9170 193 adc1.write8bitReg(REG_CONV_START, (_DEST(n) | SINGLE_CONV) );
laserdad 11:1050ffc0e9ef 194 adc2.write8bitReg(REG_CONV_START, (_DEST(n) | SINGLE_CONV) );
laserdad 6:c3db4eff9170 195
laserdad 6:c3db4eff9170 196 //optional: cal Gain
laserdad 6:c3db4eff9170 197
laserdad 6:c3db4eff9170 198 //optional: cal Offset
laserdad 6:c3db4eff9170 199
laserdad 6:c3db4eff9170 200 //optional: store cal parameters
laserdad 6:c3db4eff9170 201
laserdad 6:c3db4eff9170 202 //begin conversion
laserdad 6:c3db4eff9170 203
laserdad 6:c3db4eff9170 204 //wait for interrupt
laserdad 6:c3db4eff9170 205 while(!adc1.interrupt() )
laserdad 6:c3db4eff9170 206 {
laserdad 6:c3db4eff9170 207 wait_ms(CONV_DELAY_MS);//do nothing
laserdad 7:5295cbdb123c 208 // pc.printf("waiting for int");
laserdad 6:c3db4eff9170 209 }
laserdad 11:1050ffc0e9ef 210 if (channel_data[n] == 0)
laserdad 11:1050ffc0e9ef 211 {
laserdad 11:1050ffc0e9ef 212 channel_data[n] = adc1.read24bitsSigned(REG_DATA0+n,&int_state);
laserdad 11:1050ffc0e9ef 213 }
laserdad 11:1050ffc0e9ef 214 else
laserdad 11:1050ffc0e9ef 215 {
laserdad 11:1050ffc0e9ef 216 newdata = adc1.read24bitsSigned(REG_DATA0+n,&int_state);
laserdad 11:1050ffc0e9ef 217 channel_data[n] += (newdata-channel_data[n])/filterdiv;
laserdad 11:1050ffc0e9ef 218 }
laserdad 6:c3db4eff9170 219 while(!adc2.interrupt() )
laserdad 6:c3db4eff9170 220 {
laserdad 6:c3db4eff9170 221 wait_ms(CONV_DELAY_MS);//do nothing
laserdad 11:1050ffc0e9ef 222 // pc.printf("waiting for int");
laserdad 6:c3db4eff9170 223 }
laserdad 6:c3db4eff9170 224 //read conversion
laserdad 11:1050ffc0e9ef 225 if (channel_data[n+5] == 0)
laserdad 11:1050ffc0e9ef 226 {
laserdad 11:1050ffc0e9ef 227 channel_data[n+5] = adc2.read24bitsSigned(REG_DATA0+n,&int_state);
laserdad 11:1050ffc0e9ef 228 }
laserdad 11:1050ffc0e9ef 229 else
laserdad 11:1050ffc0e9ef 230 {
laserdad 11:1050ffc0e9ef 231 newdata = adc2.read24bitsSigned(REG_DATA0+n,&int_state);
laserdad 11:1050ffc0e9ef 232 channel_data[n+5] += (newdata-channel_data[n+5])/filterdiv;
laserdad 11:1050ffc0e9ef 233 }
laserdad 6:c3db4eff9170 234 }
laserdad 6:c3db4eff9170 235 // calc checksum
laserdad 11:1050ffc0e9ef 236 checksum = 0x66 + 0x01;
shawjo 8:882a6cdb1bf3 237 // for (int n=0; n<10; n++)
shawjo 8:882a6cdb1bf3 238 // {
shawjo 8:882a6cdb1bf3 239 // checksum += channel_data[n];
shawjo 8:882a6cdb1bf3 240 // }
shawjo 8:882a6cdb1bf3 241 // checksum_byte = (char) checksum;
laserdad 6:c3db4eff9170 242
laserdad 6:c3db4eff9170 243 for (int n=0; n<10; n++)
laserdad 6:c3db4eff9170 244 {
laserdad 6:c3db4eff9170 245 for(int m=0;m<4;m++)
laserdad 6:c3db4eff9170 246 {
laserdad 6:c3db4eff9170 247 byte2print[n*4+m] = getNthByte(channel_data[n],3-m);
shawjo 8:882a6cdb1bf3 248 checksum += getNthByte(channel_data[n],3-m);
shawjo 8:882a6cdb1bf3 249 }
laserdad 6:c3db4eff9170 250 }
shawjo 8:882a6cdb1bf3 251 checksum_byte = (char) checksum;
shawjo 8:882a6cdb1bf3 252
laserdad 6:c3db4eff9170 253 //print data and checksum
laserdad 6:c3db4eff9170 254
laserdad 6:c3db4eff9170 255 // print header 0x6601
laserdad 6:c3db4eff9170 256 rpi.putc(0x66);
laserdad 6:c3db4eff9170 257 rpi.putc(0x01);
laserdad 6:c3db4eff9170 258 for (int n =0; n<40;n++)
laserdad 6:c3db4eff9170 259 {
laserdad 6:c3db4eff9170 260 rpi.putc(byte2print[n]);
laserdad 6:c3db4eff9170 261 }
laserdad 7:5295cbdb123c 262 rpi.putc( checksum_byte );
laserdad 7:5295cbdb123c 263 // now reassemble the bits and print them
laserdad 11:1050ffc0e9ef 264 //
laserdad 11:1050ffc0e9ef 265 // for (int n=0;n<10;n++)
laserdad 11:1050ffc0e9ef 266 // {
laserdad 11:1050ffc0e9ef 267 // channel_data2[n] = (byte2print[4*n]<<24 ) | ( byte2print[4*n+1]<<16 ) | ( byte2print[4*n+2] << 8 ) | byte2print[4*n+3];
laserdad 11:1050ffc0e9ef 268 // }
laserdad 11:1050ffc0e9ef 269 // pc.printf("orig reconstructed\r\n");
laserdad 11:1050ffc0e9ef 270 // for (int n=0;n<10;n++)
laserdad 11:1050ffc0e9ef 271 // {
laserdad 11:1050ffc0e9ef 272 // pc.printf("%d, %d, %d\r\n",n,channel_data[n],channel_data2[n]);
laserdad 11:1050ffc0e9ef 273 // }
laserdad 11:1050ffc0e9ef 274 // checksum2 = 0;
laserdad 11:1050ffc0e9ef 275 // for(int n=0;n<10;n++)
laserdad 11:1050ffc0e9ef 276 // {
laserdad 11:1050ffc0e9ef 277 // checksum2 += channel_data2[n];
laserdad 11:1050ffc0e9ef 278 // }
laserdad 11:1050ffc0e9ef 279 // pc.printf("checksum %02X, %08X, %08X\r\n",checksum_byte,checksum,checksum2);
laserdad 6:c3db4eff9170 280 } //end while
laserdad 5:d7b803aa9079 281
laserdad 5:d7b803aa9079 282 } //END MAIN