Определенные порты на 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 поврежден?

, 👍1


1 ответ


Лучший ответ:

2

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);
,

Именно это. Спасибо., @Ietpt123

В новой версии библиотеки это должны быть adc->adc0->xy и adc->adc1->xy., @heimi