ca13734bf0
Add kernel (Cortex-M0/M3/M4, Tricore, S32K, RISC-V ports), drivers, middleware (CAN stack, diagnostics, safety), applications, board support, build/test tooling, and documentation.
115 lines
3.2 KiB
C
115 lines
3.2 KiB
C
/**
|
|
* @file adc_driver.h
|
|
* @brief ADC driver interface
|
|
*/
|
|
|
|
#ifndef ADC_DRIVER_H
|
|
#define ADC_DRIVER_H
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#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 */
|