Skip to main content

adc-voltmeter

Single-shot ADC sample on ALP_E1M_ADC0 converted to millivolts. The minimal demo for <alp/adc.h>.

Source: examples/adc-voltmeter/.

board.yaml

som:
sku: E1M-AEN701

preset: e1m-evk

cores:
m55_hp:
app: ./src
peripherals: [adc]

diagnostics:
log_level: info

Source (abbreviated)

#include <alp/adc.h>
#include <alp/e1m_pinout.h>

int main(void) {
alp_adc_t *adc = alp_adc_open(&(alp_adc_config_t){
.channel_id = ALP_E1M_ADC0,
.resolution_bits = 12,
.reference = ALP_ADC_REF_INTERNAL,
});
if (adc == NULL) {
printk("[adc] open failed: err=%d\n", (int)alp_last_error());
return -1;
}

int32_t raw = 0;
alp_adc_read_raw(adc, &raw);
uint32_t millivolts = ((uint32_t)raw * 3300u) / ((1u << 12) - 1u);
printk("[adc] raw=%d mV=%u\n", raw, millivolts);

alp_adc_close(adc);
return 0;
}

Expected output

[adc] raw=2048 mV=1650

Mid-scale on a 12-bit ADC sampling a half-rail input.

Capability validation

Asking for a resolution the SoC doesn't support fails at _open():

alp_adc_open(&(alp_adc_config_t){ .resolution_bits = 16 });
// adc == NULL, alp_last_error() == ALP_ERR_OUT_OF_RANGE

See also

Questions about this page? Discuss in Community Forum