Skip to content

Commit

Permalink
drivers: adc: sam0: Adjust resolution with the oversampling factor
Browse files Browse the repository at this point in the history
The old SAM0 adc drivers forces you to put 12 bits when using oversampling.
The adc_raw_to_millivolts_dt function is not working properly because if
we uses an oversampling of 8, we get 16 bits of resolution.
The function uses directly the resolution in the DT,
 so the voltage will not be correct.
To counter this, i forced the user to put the right resolution for his
oversampling factor.
Fixes: #74607
Signed-off-by: Robin Carrupt <[email protected]>
  • Loading branch information
Robibobo1 committed Dec 21, 2024
1 parent 1159c2a commit 0e49a16
Showing 1 changed file with 33 additions and 7 deletions.
40 changes: 33 additions & 7 deletions drivers/adc/adc_sam0.c
Original file line number Diff line number Diff line change
Expand Up @@ -343,26 +343,52 @@ static int start_read(const struct device *dev,
switch (sequence->resolution) {
case 8:
if (sequence->oversampling) {
LOG_ERR("Oversampling requires 12 bit resolution");
LOG_ERR("Oversampling requires minimum 13 bit resolution");
return -EINVAL;
}

ADC_RESSEL(adc) = ADC_RESSEL_8BIT;
break;
case 10:
if (sequence->oversampling) {
LOG_ERR("Oversampling requires 12 bit resolution");
LOG_ERR("Oversampling requires minimum 13 bit resolution");
return -EINVAL;
}

ADC_RESSEL(adc) = ADC_RESSEL_10BIT;
break;
case 12:
if (sequence->oversampling) {
ADC_RESSEL(adc) = ADC_RESSEL_16BIT;
} else {
ADC_RESSEL(adc) = ADC_RESSEL_12BIT;
LOG_ERR("Oversampling requires minimum 13 bit resolution");
return -EINVAL;
}
ADC_RESSEL(adc) = ADC_RESSEL_12BIT;
break;
case 13:
if (sequence->oversampling != 2U) {
LOG_ERR("13 bit resolution requires an oversampling of 2");
return -EINVAL;
}
ADC_RESSEL(adc) = ADC_RESSEL_16BIT;
break;
case 14:
if (sequence->oversampling != 4U) {
LOG_ERR("14 bit resolution requires an oversampling of 4");
return -EINVAL;
}
ADC_RESSEL(adc) = ADC_RESSEL_16BIT;
break;
case 15:
if (sequence->oversampling != 6U) {
LOG_ERR("15 bit resolution requires an oversampling of 6");
return -EINVAL;
}
ADC_RESSEL(adc) = ADC_RESSEL_16BIT;
break;
case 16:
if (sequence->oversampling != 8U) {
LOG_ERR("16 bit resolution requires an oversampling of 8");
return -EINVAL;
}
ADC_RESSEL(adc) = ADC_RESSEL_16BIT;
break;
default:
LOG_ERR("ADC resolution value %d is not valid",
Expand Down

0 comments on commit 0e49a16

Please sign in to comment.