BV: only read ADC measurement for channel selected
This commit is contained in:
parent
2327a3b5f2
commit
fdff675c67
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue