File syn_adc.h¶
File List > drivers > syn_adc.h
Go to the documentation of this file
#ifndef SYN_ADC_H
#define SYN_ADC_H
#include "../common/syn_defs.h"
#include "../dsp/syn_filter.h"
#include "../dsp/syn_signal.h"
#include "../port/syn_port_adc.h"
#include <stdbool.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/* ── Filter type ────────────────────────────────────────────────────────── */
typedef enum {
SYN_ADC_FILTER_NONE = 0,
SYN_ADC_FILTER_MA = 1,
SYN_ADC_FILTER_EMA = 2,
SYN_ADC_FILTER_MEDIAN = 3,
} SYN_ADC_FilterType;
/* ── ADC configuration ──────────────────────────────────────────────────── */
typedef struct {
uint8_t channel;
uint8_t oversample;
/* Optional filter */
void *filter;
SYN_ADC_FilterType filter_type;
/* Calibration: result = (raw + cal_offset) * cal_scale >> cal_scale_shift */
int16_t cal_offset;
uint16_t cal_scale;
uint8_t cal_scale_shift;
} SYN_ADC_Config;
/* ── ADC instance ───────────────────────────────────────────────────────── */
typedef struct {
SYN_ADC_Config cfg;
int32_t raw;
int32_t filtered;
int32_t calibrated;
SYN_Signal *stats;
} SYN_ADC;
/* ── API ────────────────────────────────────────────────────────────────── */
SYN_Status syn_adc_init(SYN_ADC *adc, const SYN_ADC_Config *cfg);
int32_t syn_adc_read(SYN_ADC *adc);
int32_t syn_adc_read_mv(SYN_ADC *adc);
static inline int32_t syn_adc_raw(const SYN_ADC *adc)
{
return adc->raw;
}
static inline int32_t syn_adc_filtered(const SYN_ADC *adc)
{
return adc->filtered;
}
static inline int32_t syn_adc_calibrated(const SYN_ADC *adc)
{
return adc->calibrated;
}
void syn_adc_set_calibration(SYN_ADC *adc, int16_t offset, uint16_t scale, uint8_t shift);
void syn_adc_set_stats(SYN_ADC *adc, SYN_Signal *stats);
#ifdef __cplusplus
}
#endif
#endif /* SYN_ADC_H */