Проблема с потенциометром ESP32: несоответствие разрешения потенциометра с неограниченным разрешением и считывание значений с помощью Wire.h

У меня проблема в том, что потенциометр переходит из диапазона от 0 Вольт до 3,3 вольт. Но в пределах этого диапазона измеренное значение изменяется примерно от 0 до 65535 несколько раз (более 10 циклов).

Когда я меняю код из моей библиотеки АЦП на 32-разрядный, я получаю 32-разрядные значения (0 - 4294967296), но возникает одна и та же ошибка с началом в 0 несколько раз в пределах диапазона потенциометра.

Аппаратное обеспечение:

Плата: ESP32 АЦП: MAX11613 (12-битный АЦП) https://www.mouser.de/datasheet/2/256/MAX11612-MAX11617-1508955.pdf Потенциометр: 3046L - 3 - 203 https://www.mouser.de/datasheet/2/54/3046-776396.pdf

Часть кода, которая считывает значения АЦП:

uint8_t MAX11613::MAX11613_ADC_Read(structMAX11613* chip, uint8_t channel, uint16_t* val){
    
    uint8_t configurationByte = ( (channel<<1) & 0x0e) | 0x61;
    MAX11613_Configuration(chip, configurationByte);

    Wire.beginTransmission(chip->devAddress);
    Wire.requestFrom(chip->devAddress, (byte) 2);    // запросить 2 байта с проводного устройства ведомого устройства
    while (Wire.available()) { // ведомое устройство может отправлять меньше запрошенного
    //char c = Wire.read(); // получить байт в качестве символа
    
    uint16_t value = 0;
    value =  Wire.read();
    value |= Wire.read() << 8;

    //Это тоже работает:
    /*uint32_t buf1;
    size_t actually_read = Wire.readBytes((uint8_t*)&buf1, 2);
    *val = actually_read;
    //Serial.println(значение);*/

    *val = value;
    }
    if (Wire.endTransmission() != 0){
    return 1;
    }
    return 0;
    
}

, 👍0


1 ответ


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

1

MAX1161x - это 12-разрядные АЦП, поэтому проблема не связана с переполнением uint16, как вы, кажется, предполагаете. АЦП сначала передает наиболее значимые биты (MSB), как показано на рисунке 10 на стр. 17. Чтобы учесть это, вам нужно изменить

value =  Wire.read();
value |= Wire.read() << 8;

Для

value = Wire.read() << 8;
value |=  Wire.read();
,

Вы абсолютно правы. Кроме того, мне пришлось отредактировать первый переданный байт, потому что он передает только первые 4 цифры (4 бита + 8 бит = 12 бит).:, @schnecktec

значение = (Wire.read() & 0x000f) << 8; значение |= (Wire.read() & 0x00ff);, @schnecktec