51 return adcToVolts(getAdcValue(msg, hwChannel));
57 #ifndef ADC_BUF_DEPTH_FAST
58 #define ADC_BUF_DEPTH_FAST 4
68 #if ADC_MAX_CHANNELS_COUNT > 16
78 #ifndef ADC_FAST_DEVICE
79 #define ADC_FAST_DEVICE ADCD2
88 #ifndef ADC_SAMPLING_FAST
89 #define ADC_SAMPLING_FAST ADC_SAMPLE_28
102 .cr2 = ADC_CR2_SWSTART,
110 ADC_SMPR1_SMP_AN10(ADC_SAMPLING_FAST) |
111 ADC_SMPR1_SMP_AN11(ADC_SAMPLING_FAST) |
112 ADC_SMPR1_SMP_AN12(ADC_SAMPLING_FAST) |
113 ADC_SMPR1_SMP_AN13(ADC_SAMPLING_FAST) |
114 ADC_SMPR1_SMP_AN14(ADC_SAMPLING_FAST) |
115 ADC_SMPR1_SMP_AN15(ADC_SAMPLING_FAST),
118 ADC_SMPR2_SMP_AN0(ADC_SAMPLING_FAST) |
119 ADC_SMPR2_SMP_AN1(ADC_SAMPLING_FAST) |
120 ADC_SMPR2_SMP_AN2(ADC_SAMPLING_FAST) |
121 ADC_SMPR2_SMP_AN3(ADC_SAMPLING_FAST) |
122 ADC_SMPR2_SMP_AN4(ADC_SAMPLING_FAST) |
123 ADC_SMPR2_SMP_AN5(ADC_SAMPLING_FAST) |
124 ADC_SMPR2_SMP_AN6(ADC_SAMPLING_FAST) |
125 ADC_SMPR2_SMP_AN7(ADC_SAMPLING_FAST) |
126 ADC_SMPR2_SMP_AN8(ADC_SAMPLING_FAST) |
127 ADC_SMPR2_SMP_AN9(ADC_SAMPLING_FAST),
133 #if ADC_MAX_CHANNELS_COUNT > 16
145 if (adcp->state == ADC_COMPLETE) {
166 if ((ADC_FAST_DEVICE.state != ADC_READY) &&
167 (ADC_FAST_DEVICE.state != ADC_COMPLETE) &&
168 (ADC_FAST_DEVICE.state != ADC_ERROR)) {
175 chSysUnlockFromISR();
223 criticalError(
"Too many ADC channels configured");
232 size_t channelAdcIndex = hwChannel - EFI_ADC_0;
235 if (logicChannel < 6) {
236 hwConfig->sqr3 |= channelAdcIndex << (5 * logicChannel);
237 }
else if (logicChannel < 12) {
238 hwConfig->sqr2 |= channelAdcIndex << (5 * (logicChannel - 6));
239 }
else if (logicChannel < 18) {
240 hwConfig->sqr1 |= channelAdcIndex << (5 * (logicChannel - 12));
242 #if ADC_MAX_CHANNELS_COUNT > 16
243 else if (logicChannel < 24) {
244 hwConfig->sqr4 |= channelAdcIndex << (5 * (logicChannel - 18));
246 else if (logicChannel < 30) {
247 hwConfig->sqr5 |= channelAdcIndex << (5 * (logicChannel - 24));
254 int numChannels =
size();
257 for (
size_t i = 0; i < bufDepth; i++) {
263 if (sample > ADC_MAX_VALUE) {
265 criticalError(
"fast ADC unexpected sample %d. Please report and use skipADC12bitAssert to disable", sample);
269 sample = sample & ADC_MAX_VALUE;
273 index += numChannels;
277 return static_cast<adcsample_t>(result / bufDepth);
281 for (
size_t idx = EFI_ADC_0; idx < EFI_ADC_TOTAL_CHANNELS; idx++) {
300 if ((channel < EFI_ADC_NONE) || (channel >= EFI_ADC_TOTAL_CHANNELS)) {
301 efiPrintf(
"Invalid ADC channel %d", channel);
305 float volts = adcToVoltsDivided(value, (
adc_channel_e)channel);
306 efiPrintf(
"adc %d voltage : %.3f", channel, volts);
314 int adcValue = getAdcValue(
"print", hwChannel);
318 efiPrintf(
" %s ch[%2d] @ %s%d ADC%d 12bit=%4d %.3fV (input %.3fV)",
320 hwChannel - EFI_ADC_0 + 1,
321 adcValue, volts, voltsDivided);
329 for (
int internalIndex = 0; internalIndex <
fastAdc.
size(); internalIndex++) {
338 for (
int internalIndex = 0; internalIndex < ADC_MAX_CHANNELS_COUNT; internalIndex++) {
353 chThdSleepMilliseconds(1);
444 efiPrintf(
"initAdcInputs()");
461 gptStartContinuous(EFI_INTERNAL_FAST_ADC_GPT, GPT_PERIOD_FAST);
466 efiPrintf(
"ADC disabled");
uint8_t internalAdcIndexByHardwareIndex[EFI_ADC_TOTAL_CHANNELS]
adcsample_t getAvgAdcValue(adc_channel_e hwChannel, size_t bufDepth)
adc_channel_e getAdcChannelByInternalIndex(int index) const
void enableChannel(adc_channel_e hwChannel)
FastAdcToken getAdcChannelToken(adc_channel_e hwChannel)
AdcDevice(ADCConversionGroup *p_hwConfig, adcsample_t *p_buf)
ADCConversionGroup * hwConfig
static void UpdateSubscribers(efitick_t nowNt)
TunerStudioOutputChannels outputChannels
Base class for a controller that needs to run periodically to perform work.
virtual void PeriodicTask(efitick_t nowNt)=0
Called periodically. Override this method to do work for your controller.
void addConsoleActionI(const char *token, VoidInt callback)
Register a console command with one Integer parameter.
void setAdcChannelOverrides()
bool readSlowAnalogInputs(adcsample_t *convertedSamples)
float getMcuTemperature()
int getAdcChannelPin(adc_channel_e hwChannel)
ioportid_t getAdcChannelPort(const char *msg, adc_channel_e hwChannel)
const char * portname(ioportid_t GPIOx)
bool warning(ObdCode code, const char *fmt,...)
adcerror_t
Possible ADC failure causes.
uint16_t adcsample_t
ADC sample data type.
gptfreq_t frequency
Timer clock in Hz.
GPIO_TypeDef * ioportid_t
Port Identifier.
static FIL FDLogFile NO_CACHE
@ CUSTOM_OBD_ANALOG_INPUT_NOT_CONFIGURED
engine_configuration_s * engineConfiguration
void protectedGpio_check(efitick_t nowNt)
float getAnalogInputDividerCoefficient(adc_channel_e hwChannel)
Driver configuration structure.
Structure representing a GPT driver.
air_pressure_sensor_config_s sensor
float analogInputDividerCoefficient
adc_channel_e hipOutputChannel
adc_channel_e auxFastSensor1_adcChannel
uint8_t fastAdcErrorsCount
uint16_t unexpectedAdcSample