34 return adcRawValueToRawVoltage(adcGetRawValue(msg, hwChannel));
47#ifndef ADC_FAST_DEVICE
48#define ADC_FAST_DEVICE ADCD2
52#ifndef ADC_BUF_DEPTH_FAST
53#define ADC_BUF_DEPTH_FAST 4
57#ifndef ADC_SAMPLING_FAST
58#define ADC_SAMPLING_FAST ADC_SAMPLE_28
70#if ADC_MAX_CHANNELS_COUNT > 16
81#if defined(EFI_INTERNAL_FAST_ADC_PWM)
83#elif defined (EFI_INTERNAL_FAST_ADC_GPT)
91#if defined(EFI_INTERNAL_FAST_ADC_PWM)
95 .cr2 = ADC_CR2_EXTEN_0 | (13 << ADC_CR2_EXTSEL_Pos),
96#elif defined (EFI_INTERNAL_FAST_ADC_GPT)
98 .cr2 = ADC_CR2_SWSTART,
107 ADC_SMPR1_SMP_AN10(ADC_SAMPLING_FAST) |
108 ADC_SMPR1_SMP_AN11(ADC_SAMPLING_FAST) |
109 ADC_SMPR1_SMP_AN12(ADC_SAMPLING_FAST) |
110 ADC_SMPR1_SMP_AN13(ADC_SAMPLING_FAST) |
111 ADC_SMPR1_SMP_AN14(ADC_SAMPLING_FAST) |
112 ADC_SMPR1_SMP_AN15(ADC_SAMPLING_FAST),
115 ADC_SMPR2_SMP_AN0(ADC_SAMPLING_FAST) |
116 ADC_SMPR2_SMP_AN1(ADC_SAMPLING_FAST) |
117 ADC_SMPR2_SMP_AN2(ADC_SAMPLING_FAST) |
118 ADC_SMPR2_SMP_AN3(ADC_SAMPLING_FAST) |
119 ADC_SMPR2_SMP_AN4(ADC_SAMPLING_FAST) |
120 ADC_SMPR2_SMP_AN5(ADC_SAMPLING_FAST) |
121 ADC_SMPR2_SMP_AN6(ADC_SAMPLING_FAST) |
122 ADC_SMPR2_SMP_AN7(ADC_SAMPLING_FAST) |
123 ADC_SMPR2_SMP_AN8(ADC_SAMPLING_FAST) |
124 ADC_SMPR2_SMP_AN9(ADC_SAMPLING_FAST),
130#if ADC_MAX_CHANNELS_COUNT > 16
144 if (adcIsBufferComplete(adcp)) {
146 efitick_t diff = nowTick -
lastTick;
165#if defined(EFI_INTERNAL_FAST_ADC_PWM)
170 .
frequency = GPT_FREQ_FAST * ADC_BUF_DEPTH_FAST,
171 .period = GPT_PERIOD_FAST,
174 {PWM_OUTPUT_ACTIVE_HIGH,
nullptr},
175 {PWM_OUTPUT_ACTIVE_HIGH,
nullptr},
176 {PWM_OUTPUT_ACTIVE_HIGH,
nullptr},
177 {PWM_OUTPUT_ACTIVE_HIGH,
nullptr}
184#elif defined (EFI_INTERNAL_FAST_ADC_GPT)
206 #error Please define EFI_INTERNAL_FAST_ADC_PWM or EFI_INTERNAL_FAST_ADC_GPT for Fast ADC
218#if defined(EFI_INTERNAL_FAST_ADC_PWM)
220 pwmStart(EFI_INTERNAL_FAST_ADC_PWM, &
pwmcfg);
221 pwmEnableChannel(EFI_INTERNAL_FAST_ADC_PWM, 0, 1);
223#elif defined (EFI_INTERNAL_FAST_ADC_GPT)
225 gptStartContinuous(EFI_INTERNAL_FAST_ADC_GPT, GPT_PERIOD_FAST);
231 criticalError(
"Too many ADC channels configured");
240 size_t channelAdcIndex = hwChannel - EFI_ADC_0;
243 if (logicChannel < 6) {
244 hwConfig->sqr3 |= channelAdcIndex << (5 * logicChannel);
245 }
else if (logicChannel < 12) {
246 hwConfig->sqr2 |= channelAdcIndex << (5 * (logicChannel - 6));
247 }
else if (logicChannel < 18) {
248 hwConfig->sqr1 |= channelAdcIndex << (5 * (logicChannel - 12));
250#if ADC_MAX_CHANNELS_COUNT > 16
251 else if (logicChannel < 24) {
252 hwConfig->sqr4 |= channelAdcIndex << (5 * (logicChannel - 18));
254 else if (logicChannel < 30) {
255 hwConfig->sqr5 |= channelAdcIndex << (5 * (logicChannel - 24));
259 return channelAdcIndex;
274 chSysUnlockFromISR();
279 int numChannels =
size();
282 criticalError(
"Fast ADC attempt to read unconfigured input %d.", hwChannel);
286 for (
size_t i = 0; i <
depth; i++) {
288 if (sample > ADC_MAX_VALUE) {
290 criticalError(
"ADC unexpected sample %d at %ld uptime.",
295 index += numChannels;
303 for (
size_t idx = EFI_ADC_0; idx < EFI_ADC_TOTAL_CHANNELS; idx++) {
void startConversionI(void)
uint8_t internalAdcIndexByHardwareIndex[EFI_ADC_TOTAL_CHANNELS]
adc_channel_e getAdcChannelByInternalIndex(int index) const
AdcToken getAdcChannelToken(adc_channel_e hwChannel)
int enableChannel(adc_channel_e hwChannel)
ADCConversionGroup * hwConfig
adcsample_t getAvgAdcValue(adc_channel_e hwChannel)
AdcDevice(ADCDriver *p_adcp, ADCConversionGroup *p_hwConfig, volatile adcsample_t *p_buf, size_t p_depth)
volatile adcsample_t * samples
TunerStudioOutputChannels outputChannels
efitimesec_t getTimeNowS()
Current system time in seconds (32 bits)
static EngineAccessor engine
adcerror_t
Possible ADC failure causes.
uint16_t adcsample_t
ADC sample data type.
gptfreq_t frequency
Timer clock in Hz.
static union @47 NO_CACHE
float getAnalogInputDividerCoefficient(adc_channel_e hwChannel)
Driver configuration structure.
Structure representing a GPT driver.
Type of a PWM driver configuration structure.
uint32_t frequency
Timer clock in Hz.
uint8_t fastAdcErrorCount
uint16_t fastAdcConversionCount
uint8_t fastAdcOverrunCount