BV: only read ADC measurement for channel selected

This commit is contained in:
King Kévin 2018-02-23 16:03:55 +01:00
parent 2327a3b5f2
commit fdff675c67
1 changed files with 32 additions and 16 deletions

View File

@ -146,9 +146,6 @@ void busvoodoo_setup(void)
adc_set_sample_time_on_all_channels(ADC1, ADC_SMPR_SMP_28DOT5CYC); // use 28.5 cycles to sample (long enough to be stable)
adc_enable_temperature_sensor(ADC1); // enable internal voltage reference
adc_enable_external_trigger_regular(ADC1, ADC_CR2_EXTSEL_SWSTART); // use software trigger to start conversion
uint8_t rail_channels[] = {ADC_CHANNEL17, ADC_CHANNEL(BUSVOODOO_5V_CHANNEL), ADC_CHANNEL(BUSVOODOO_3V3_CHANNEL), ADC_CHANNEL(BUSVOODOO_LV_CHANNEL), ADC_CHANNEL(BUSVOODOO_HV_CHANNEL)}; // voltages to convert: internal, 5V, 3.3V, LV, HV
adc_set_regular_sequence(ADC1, LENGTH(rail_channels), rail_channels); // set channels to convert
adc_enable_discontinuous_mode_regular(ADC1, LENGTH(rail_channels)); // convert all channels
adc_power_on(ADC1); // switch on ADC
sleep_us(1); // wait t_stab for the ADC to stabilize
adc_reset_calibration(ADC1); // remove previous non-calibration
@ -255,32 +252,51 @@ float busvoodoo_vreg_get(uint8_t channel)
if (channel!=BUSVOODOO_5V_CHANNEL && channel!=BUSVOODOO_3V3_CHANNEL && channel!=BUSVOODOO_LV_CHANNEL && channel!=BUSVOODOO_HV_CHANNEL) { // check channel
return NAN;
}
uint16_t channels[5] = {0}; // to start converted values: internal reference 1.2V, 5V rail, 3.3V rail, LV rail, HV rail, hardware version
adc_start_conversion_regular(ADC1); // start conversion to get first voltage
for (uint8_t channel_i=0; channel_i<LENGTH(channels); channel_i++) { // get all conversions
while (!adc_eoc(ADC1)); // wait until conversion finished
channels[channel_i] = adc_read_regular(ADC1); // read voltage value (clears flag)
}
float to_return = NAN; // voltage to return
switch (channel) { // get converter value and calculate according to the voltage divider on this channel
uint8_t channels[2] = {ADC_CHANNEL17, ADC_CHANNEL17}; // voltages to convert: internal and internal (as fallback)
switch (channel) { // set desired channel
case BUSVOODOO_5V_CHANNEL:
to_return = channels[1]/(10.0/(10.0+10.0));
channels[1] = ADC_CHANNEL(BUSVOODOO_5V_CHANNEL);
break;
case BUSVOODOO_3V3_CHANNEL:
to_return = channels[2]/(10.0/(10.0+10.0));
channels[1] = ADC_CHANNEL(BUSVOODOO_3V3_CHANNEL);
break;
case BUSVOODOO_LV_CHANNEL:
to_return = channels[3]/(10.0/(10.0+10.0));
channels[1] = ADC_CHANNEL(BUSVOODOO_LV_CHANNEL);
break;
case BUSVOODOO_HV_CHANNEL:
to_return = channels[4]/(1.5/(10.0+1.5));
channels[1] = ADC_CHANNEL(BUSVOODOO_HV_CHANNEL);
break;
default: // unknown channel
break;
}
adc_set_regular_sequence(ADC1, LENGTH(channels), channels); // set channels to convert
adc_enable_discontinuous_mode_regular(ADC1, LENGTH(channels)); // convert all channels
adc_start_conversion_regular(ADC1); // start conversion to get first voltage
uint16_t values[LENGTH(channels)] = {0}; // to store converted values
for (uint8_t channel_i=0; channel_i<LENGTH(channels); channel_i++) { // get all conversions
while (!adc_eoc(ADC1)); // wait until conversion finished
values[channel_i] = adc_read_regular(ADC1); // read voltage value (clears flag)
}
float to_return = NAN; // voltage to return
switch (channel) { // get converted value and calculate according to the voltage divider on this channel
case BUSVOODOO_5V_CHANNEL:
to_return = values[1]/(10.0/(10.0+10.0));
break;
case BUSVOODOO_3V3_CHANNEL:
to_return = values[1]/(10.0/(10.0+10.0));
break;
case BUSVOODOO_LV_CHANNEL:
to_return = values[1]/(10.0/(10.0+10.0));
break;
case BUSVOODOO_HV_CHANNEL:
to_return = values[1]/(1.5/(10.0+1.5));
break;
default: // unknown channel
to_return = NAN;
break;
}
if (!isnan(to_return)) {
to_return *= 1.2/channels[0]; // calculate voltage from converted values using internal 1.2V voltage reference
to_return *= 1.2/values[0]; // calculate voltage from converted values using internal 1.2V voltage reference
}
return to_return;
}