Working through the dev academy exercise, it appears that the sample code does not wait for the conversion to complete before reading out the sample:
/* STEP 7.1 - Implement timer callback handler function */ void battery_sample_timer_handler(struct k_timer *timer) { /* STEP 7.2 - Trigger the sampling */ nrfx_err_t err = nrfx_saadc_mode_trigger(); if (err != NRFX_SUCCESS) { printk("nrfx_saadc_mode_trigger error: %08x", err); return; } /* STEP 7.3 - Calculate and print voltage */ int battery_voltage = ((600*6) * sample) / ((1<<12)); printk("SAADC sample: %d\n", sample); printk("Battery Voltage: %d mV\n", battery_voltage); }
Would it not be more appropriate to get a call back from the nrfx_saadc_irq_handler when the conversion is complete?
When using the Zephyr ADC driver on the same exact board, it appears the ADC measurements are ~30 mV different.
Can you please confirm if we should be waiting for the conversion to complete here?