unsigned char adc_read(unsigned char channel, float *value) { unsigned long xdata d, start_time; unsigned char xdata i; /* start conversion */ channel = adc_index[channel % (N_HV_CHN*2)]; write_adc(REG_CONTROL, channel << 4 | 0x0F); // adc_chn, +2.56V range write_adc(REG_MODE, (1<<4) | (1<<1)); // single conversion, 10 channel mode start_time = time(); while (ADC_NRDY) { yield(); for (i=0 ; i<N_HV_CHN ; i++) ramp_hv(i); // do ramping while reading ADC /* abort if no ADC ready after 300ms */ if (time() - start_time > 30) { reset_adc(); return 0; } } read_adc24(REG_ADCDATA, &d); /* convert to volts */ *value = ((float)d / (1l<<24)) * 2.56; /* round result to 6 digits */ *value = floor(*value*1E6+0.5)/1E6; return 1; }
void adc_read() { unsigned char i; unsigned long value; float gvalue; if (ADC_NRDY) return; read_adc24(REG_ADCDATA, &value); /* convert to volts */ gvalue = ((float)value / (1l<<24)) * 2.56; /* round result to 5 digits */ gvalue = floor(gvalue*1E5+0.5)/1E5; /* apply range */ if (user_data.adc_25 == 0) { if (user_data.uni_adc) gvalue *= 10.0/2.56; else gvalue = gvalue/2.56*20.0 - 10; } DISABLE_INTERRUPTS; user_data.adc[adc_chn] = gvalue; ENABLE_INTERRUPTS; /* start next conversion */ adc_chn = (adc_chn + 1) % 8; i = adc_index[adc_chn]; write_adc(REG_CONTROL, i << 4 | 0x0F); // adc_chn, +2.56V range }
unsigned char adc_read(unsigned char channel, float *value) { unsigned long d, start_time; unsigned char i; /* start conversion */ channel = adc_index[channel % 8]; write_adc(REG_CONTROL, channel << 4 | 0x0F); // adc_chn, +2.56V range write_adc(REG_MODE, 2); // single conversion start_time = time(); while (ADC_NRDY) { yield(); for (i=0 ; i<N_HV_CHN ; i++) ramp_hv(i); // do ramping while reading ADC /* abort if no ADC ready after 300ms */ if (time() - start_time > 30) { /* reset ADC */ ADC_NRES = 0; delay_ms(100); ADC_NRES = 1; delay_ms(300); write_adc(REG_FILTER, ADC_SF_VALUE); return 0; } } read_adc24(REG_ADCDATA, &d); /* convert to volts */ *value = ((float)d / (1l<<24)) * 2.56; /* round result to 6 digits */ *value = floor(*value*1E6+0.5)/1E6; return 1; }