test program to power up two MAX11410 ADCs and check the inputs of ADC1. Uses MAX11410 library.
Fork of MAX11410-test by
main.cpp@17:f051190b4bff, 2019-03-21 (annotated)
- 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?
User | Revision | Line number | New 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 |