Skip to main content

adc-voltmeter

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

Source: examples/adc-voltmeter/.

board.yaml

schema_version: 2

som:
sku: E1M-AEN701

carrier:
name: E1M-EVK

cores:
m55_hp:
os: zephyr
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 = E1M_ADC0_CH0,
.resolution_bits = 12,
.reference_mv = 3300,
});
if (adc == NULL) {
printk("[adc] open failed: err=%d\n", (int)alp_last_error());
return -1;
}

uint32_t raw;
alp_adc_read(adc, &raw);
uint32_t millivolts = (raw * 3300u) / ((1u << 12) - 1u);
printk("[adc] raw=%u 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