/** * @file adc_driver.h * @brief ADC driver interface */ #ifndef ADC_DRIVER_H #define ADC_DRIVER_H #include #include #include "kernel.h" /* ADC Configuration Constants */ #define ADC_MAX_INSTANCES 3 #define ADC_MAX_CHANNELS 16 #define ADC_MAX_SEQUENCES 8 /* ADC Resolution */ typedef enum { ADC_RESOLUTION_6BIT = 6, ADC_RESOLUTION_8BIT = 8, ADC_RESOLUTION_10BIT = 10, ADC_RESOLUTION_12BIT = 12, ADC_RESOLUTION_14BIT = 14, ADC_RESOLUTION_16BIT = 16 } AdcResolution_t; /* ADC Conversion Modes */ typedef enum { ADC_MODE_SINGLE = 0, ADC_MODE_CONTINUOUS = 1, ADC_MODE_SCAN = 2, ADC_MODE_DISCONTINUOUS = 3 } AdcConversionMode_t; /* ADC Trigger Sources */ typedef enum { ADC_TRIGGER_SOFTWARE = 0, ADC_TRIGGER_TIMER = 1, ADC_TRIGGER_EXTERNAL = 2 } AdcTriggerSource_t; /* ADC Reference Voltage */ typedef enum { ADC_REFERENCE_INTERNAL = 0, ADC_REFERENCE_EXTERNAL = 1, ADC_REFERENCE_VDD = 2 } AdcReference_t; /* ADC Sampling Time */ typedef enum { ADC_SAMPLING_1_5_CYCLES = 0, ADC_SAMPLING_7_5_CYCLES = 1, ADC_SAMPLING_13_5_CYCLES = 2, ADC_SAMPLING_28_5_CYCLES = 3, ADC_SAMPLING_41_5_CYCLES = 4, ADC_SAMPLING_55_5_CYCLES = 5, ADC_SAMPLING_71_5_CYCLES = 6, ADC_SAMPLING_239_5_CYCLES = 7 } AdcSamplingTime_t; /* ADC Callbacks */ typedef void (*AdcConversionCompleteCallback_t)(uint16_t* values, uint8_t count); /* ADC Channel Configuration */ typedef struct { uint8_t channel; AdcSamplingTime_t sampling_time; bool enable_watchdog; uint16_t watchdog_high_threshold; uint16_t watchdog_low_threshold; } AdcChannelConfig_t; /* ADC Configuration */ typedef struct { AdcResolution_t resolution; AdcConversionMode_t mode; AdcTriggerSource_t trigger_source; AdcReference_t reference; bool enable_dma; uint32_t conversion_frequency; AdcChannelConfig_t channels[ADC_MAX_CHANNELS]; uint8_t channel_count; AdcConversionCompleteCallback_t conversion_complete_callback; } AdcConfig_t; /* ADC Statistics */ typedef struct { uint32_t conversions_completed; uint32_t conversions_failed; uint32_t watchdog_events; uint32_t overrun_errors; uint32_t dma_transfers; uint32_t average_conversion_time_us; } AdcStatistics_t; /* ADC Driver Interface */ KernelStatus_t adc_init(uint8_t instance, AdcConfig_t* config); KernelStatus_t adc_deinit(uint8_t instance); KernelStatus_t adc_start_conversion(uint8_t instance); KernelStatus_t adc_stop_conversion(uint8_t instance); KernelStatus_t adc_read_channel(uint8_t instance, uint8_t channel, uint16_t* value, uint32_t timeout_ms); KernelStatus_t adc_read_channels(uint8_t instance, uint16_t* values, uint8_t count, uint32_t timeout_ms); KernelStatus_t adc_start_dma(uint8_t instance, uint16_t* buffer, uint16_t length); KernelStatus_t adc_stop_dma(uint8_t instance); KernelStatus_t adc_calibrate(uint8_t instance); KernelStatus_t adc_get_statistics(uint8_t instance, AdcStatistics_t* stats); float adc_convert_to_voltage(uint16_t adc_value, AdcResolution_t resolution, float reference_voltage); void adc_process_interrupt(uint8_t instance); #endif /* ADC_DRIVER_H */