Определенные порты на Teensy 3.6 не считывают правильное битовое разрешение с помощью библиотеки ADC?
У меня есть базовая схема, в которой я считываю аналоговые значения с 14 инфракрасных приемников.
Я установил 16-битное разрешение, но некоторые порты возвращают 10-битные значения (от 0 до 1024) вместо 16-битных значений (от 0 до 65536).
Я могу подтвердить, что это не проблема с моей схемой, потому что, когда я тестировал считывание каждого отдельного датчика с портом, который «работает», и каждый раз возвращается правильный диапазон.
Вот мой код:
#include <ADC.h>
ADC *adc = new ADC();
const int* RECIEVERS = (int[14])
{
A15, A16, A17, A19, A20, A21, A22, A1, A2, A3, A6, A7, A8, A9
};
void setup() {
Serial.begin(4608000);
adc->setAveraging(16); // устанавливаем количество средних
adc->setResolution(16); // устанавливаем биты разрешения
adc->setConversionSpeed(ADC_CONVERSION_SPEED::HIGH_SPEED_16BITS);
adc->setSamplingSpeed(ADC_SAMPLING_SPEED::VERY_HIGH_SPEED);
for (int i = 0; i < 14; i++) pinMode(RECIEVERS[i], INPUT);
}
void loop() {
for (int i = 0; i < 14; i++) {
Serial.print(adc->analogRead(RECIEVERS[i]));
Serial.print(" | ");
delay(1);
}
Serial.println("");
}
Есть ли проблема с моим кодом или мой Teensy поврежден?
@Ietpt123, 👍1
1 ответ
Лучший ответ:
Kinesis 66 (чип в Teensy 3.6) имеет два модуля АЦП. Каждый из них взаимодействует с разными контактами.
По умолчанию функции конфигурации в этой библиотеке настраивают ADC0, поэтому, если вы не укажете иное, вы будете настраивать только половину контактов ADC.
Вы должны вызвать каждую из функций конфигурации дважды, один раз для ADC0 и один раз для ADC1:
adc->setAveraging(16, 0); // устанавливаем количество средних
adc->setResolution(16, 0); // устанавливаем биты разрешения
adc->setConversionSpeed(ADC_CONVERSION_SPEED::HIGH_SPEED_16BITS, 0);
adc->setSamplingSpeed(ADC_SAMPLING_SPEED::VERY_HIGH_SPEED, 0);
adc->setAveraging(16, 1); // устанавливаем количество средних
adc->setResolution(16, 1); // устанавливаем биты разрешения
adc->setConversionSpeed(ADC_CONVERSION_SPEED::HIGH_SPEED_16BITS, 1);
adc->setSamplingSpeed(ADC_SAMPLING_SPEED::VERY_HIGH_SPEED, 1);
- Шумный analogRead
- Расширенная настройка АЦП на Due (SAM3X8E) для повышения точности
- Ardunio Mega/ATmega2560: использование порта F или K как для аналоговых входов, так и для цифровых выходов.
- Выход AnalogRead() колеблется, даже если контакт заземлен
- Как прочитать значение АЦП без общего заземления? (Возможно или нет!)
- Потенциометр отображает только аналоговое значение напряжения 1023 в proteus
- Когда АЦП снимает показания?
- Печать результата функции AnalogRead() приводит к сбою Arduino
Именно это. Спасибо., @Ietpt123
В новой версии библиотеки это должны быть adc->adc0->xy и adc->adc1->xy., @heimi