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
<alp/adc.h>reference<alp/dsp.h>— FIR / IIR / FFT chains for streaming- Examples overview
Questions about this page? Discuss in Community Forum