Приветствую Всех !
По сути вопрос уже в заголовке темы.
Небольшие пояснения.
Необходимо мерить значение с датчиков (относительно медленно меняющихся). Для некоторых датчиков диапазон 0 - 5В, для некоторых 0 - 1 В. Что бы не городить дополнительный усилитель, использую переключение опорного напряжения с 5В на 1.1В и наоборот.
Также переписал работу analogRead на прерывание. Кому интересно, тестовый код ниже
#define A0 0
#define A1 1
#define A2 2
#define A3 3
#define A4 4
#define A5 5
#define A6 6
#define A7 7
#define delay_ADC 50
byte chanel_mode_ADC[8] = { 0 };
int chanel_data_ADC[8] = { 0 };
volatile byte i_ADC_new = -1;
volatile byte i_ADC_old = -1;
volatile byte delay_counter_ADC = 0;
void analogReference(byte n, byte m) {
chanel_mode_ADC[n] = (m << 6);
}
int analogRead(byte n) {
if (chanel_mode_ADC[n] == 0) {
chanel_mode_ADC[n] = (DEFAULT << 6);
}
if (i_ADC_new > 7) {
i_ADC_new = n;
ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADATE) | (0 << ADIF) | (1 << ADIE) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
}
return chanel_data_ADC[n];
}
ISR(ADC_vect) {
if (delay_counter_ADC == delay_ADC) {
//чтение преобразования
chanel_data_ADC[i_ADC_old] = ADC;
i_ADC_old = i_ADC_new;
}
if (delay_counter_ADC == 0) {
//чтение преобразования
chanel_data_ADC[i_ADC_old] = ADC;
//определение следующего канала
i_ADC_old = i_ADC_new;
do {
i_ADC_new = (i_ADC_new + 1) & 0x07;
} while (chanel_mode_ADC[i_ADC_new] == 0);
// если изменилось опорное напряжение, то необходима задержка
if ((ADMUX ^ chanel_mode_ADC[i_ADC_new]) & 0xC0) {
delay_counter_ADC = delay_ADC;
}
//настраиваем канал
ADMUX = chanel_mode_ADC[i_ADC_new] + i_ADC_new;
} else --delay_counter_ADC;
}
void setup() {
Serial.begin(115200);
Serial.println("START");
analogReference(A0, INTERNAL);
}
void loop() {
delay(300);
Serial.print(analogRead(A0));
Serial.print("\t");
Serial.print(analogRead(A1));
Serial.print("\t");
Serial.print(analogRead(A2));
Serial.print("\t");
Serial.print(analogRead(A3));
Serial.print("\t");
Serial.println();
}
При переходе с опорного напряжения 5В на 1.1В и обратно необходимо порядка 50 пропущенных измерений, что бы данные стали валидными. Я так понимаю это связанно с 100nF на выводе Aref. Не то что это напрягает, но…
Вопрос, как это количество измерений можно уменьшить ?
ИМХО тут или емкость снизить или резистором конденсатор зашунтировать (предположительно 10 кОм)
Может есть вариант разрядить этот конденсатор как то более изящно ?