Проблема с потенциометром 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;
}
@schnecktec, 👍0
1 ответ
Лучший ответ:
MAX1161x - это 12-разрядные АЦП, поэтому проблема не связана с переполнением uint16, как вы, кажется, предполагаете. АЦП сначала передает наиболее значимые биты (MSB), как показано на рисунке 10 на стр. 17. Чтобы учесть это, вам нужно изменить
value = Wire.read();
value |= Wire.read() << 8;
Для
value = Wire.read() << 8;
value |= Wire.read();
- Ускорение двигателя постоянного тока с помощью ШИМ
- ESP32 ADC <-> Проблема с WIFI
- Потенциометр отображает только аналоговое значение напряжения 1023 в proteus
- Если я уменьшу частоту дискретизации АЦП, получу ли я среднее значение за период времени?
- Интерфейс SPI (MCP3903)
- Соединение АЦП при создании миди-контроллера (множество потенциометров)
- Избегайте шума 1-LSB в показаниях АЦП
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
Вы абсолютно правы. Кроме того, мне пришлось отредактировать первый переданный байт, потому что он передает только первые 4 цифры (4 бита + 8 бит = 12 бит).:, @schnecktec
значение = (Wire.read() & 0x000f) << 8; значение |= (Wire.read() & 0x00ff);, @schnecktec