Получение неверных аналоговых показаний с использованием ESP32 devkitc v4

Я знаю, что эта тема не связана с Arduino, но я полностью уверен, что кто-нибудь может помочь мне найти проблему. Я тестирую 6 датчиков температуры (3 цифровых, 3 аналоговых). Цифровые - "DS18B20", которым я доверяю, аналоговые - "MCP9701A", "TC1047A" и "MCP9700A". При считывании аналоговых датчиков с помощью Arduino-UNO или Arduino-mega результаты 6 датчиков практически идентичны, и я не сталкиваюсь с какими-либо проблемами. Но когда я выполняю тест с использованием ESP32-devkitc-v4, я получаю неверные показания от 3 аналоговых датчиков. В коде "последовательный монитор" я получаю значение напряжения, полностью отличное от того, которое я измеряю физически с помощью мультиметра

Например : 3 цифровых датчика a дают значение от 23,56 ° C до 23,81 ° C, но для аналогового датчика "MCP9701A" я получаю 16,26 ° C, а напряжение, получаемое на последовательном мониторе, составляет 0,718 вольт, однако для мультиметра оно составляет 0,851 вольт. И согласно расчетам из спецификации: (0,851-0,4) / (19,5 мВольт) = 23,12 С, что так близко к цифровым датчикам. У меня такая же проблема с другими аналоговыми датчиками, поэтому, если вы поможете мне найти мою ошибку, я буду признателен.

Вот технические характеристики аналоговых датчиков:

MCP9701A и MCP9711A

https://ww1.microchip.com/downloads/en/DeviceDoc/20001942G.pdf

TC1047A

https://ww1.microchip.com/downloads/en/DeviceDoc/21498D.pdf

Вот мой код:

#include <OneWire.h>
#include <DallasTemperature.h>
#include "driver/adc.h"

// GPIO , где DS18B20 подключен к
const int oneWireBus = 4;     
// Настройка экземпляра OneWire для связи с любыми устройствами OneWire
OneWire oneWire(oneWireBus);

// Передайте нашу ссылку OneWire датчику температуры в Далласе 
DallasTemperature sensors(&oneWire);

#define analogInPin0 35
#define analogInPin1 32
#define analogInPin2 33

float analogTempTC1047=0.0;
float analogTempMCP9700=0.0;
float analogTempMCP9701=0.0;

float volt0=0.0;
float volt1=0.0;
float volt2=0.0;

int sensorValue0 = 0;
int sensorValue1 = 0;
int sensorValue2 = 0;

void setup() {
  // Запустите последовательный монитор
  Serial.begin(9600);
  // Запуск датчика DS18B20
  sensors.begin();
}

void loop() {
  // поместите сюда свой основной код для повторного запуска:
  sensorValue0 = analogRead(analogInPin0);
  sensorValue1 = analogRead(analogInPin1);
  sensorValue2 = analogRead(analogInPin2);

  volt0= (3.3/4096.0)*sensorValue0;
  analogTempMCP9701= ((volt0-0.4)/0.0195);

  volt1= (3.3/4096.0)*sensorValue1;
  analogTempTC1047= ((volt1-0.5)/0.01);
  
  volt2= (3.3/4096.0)*sensorValue2;
  analogTempMCP9700= ((volt2-0.5)/0.01);

  sensors.requestTemperatures();
  float temperatureC1 = sensors.getTempCByIndex(0);
  float temperatureC2 = sensors.getTempCByIndex(1);
  float temperatureC3 = sensors.getTempCByIndex(2);
  Serial.print("S1= ");
  Serial.print(temperatureC1);
  Serial.print("ºC");
  Serial.print(", S2= ");
  Serial.print(temperatureC2);
  Serial.print("ºC");
  Serial.print(", S3= ");
  Serial.print(temperatureC3);
  Serial.print("ºC,------- ");

  Serial.print("input sensor1= ");
  Serial.print(sensorValue0);
  Serial.print(", volt1=  ");
  Serial.print("= ");
  Serial.print(volt0, 3);
  Serial.print(", Analog sensor MCP9701 = ");
  Serial.print(analogTempMCP9701);

  Serial.print("----");
  Serial.print("input sensor2= ");
  Serial.print(sensorValue1);
  Serial.print(", volt2=  ");
  Serial.print("= ");
  Serial.print(volt1, 3);
  Serial.print(" --Analog sensor TC1047 = ");
  Serial.print(analogTempTC1047);
  
  Serial.print("----");
  Serial.print("input sensor3= ");
  Serial.print(sensorValue2);
  Serial.print(", volt2=  ");
  Serial.print("= ");
  Serial.print(volt2, 3);
  Serial.print(" --Analog sensor MCP9700 = ");
  Serial.println(analogTempMCP9700);
  delay(4000);
}

А вот вывод последовательного монитора:

S1= 23.56ºC, S2= 23.81ºC, S3= 23.50ºC,------- input sensor1= 895, volt1=  = 0.721, Analog sensor MCP9701 = 16.47----input sensor2= 747, volt2=  = 0.602 --Analog sensor TC1047 = 10.18----input sensor3= 752, volt2=  = 0.606 --Analog sensor MCP9700 = 10.59
S1= 23.56ºC, S2= 23.75ºC, S3= 23.50ºC,------- input sensor1= 894, volt1=  = 0.720, Analog sensor MCP9701 = 16.42----input sensor2= 747, volt2=  = 0.602 --Analog sensor TC1047 = 10.18----input sensor3= 755, volt2=  = 0.608 --Analog sensor MCP9700 = 10.83
S1= 23.56ºC, S2= 23.75ºC, S3= 23.50ºC,------- input sensor1= 905, volt1=  = 0.729, Analog sensor MCP9701 = 16.88----input sensor2= 746, volt2=  = 0.601 --Analog sensor TC1047 = 10.10----input sensor3= 753, volt2=  = 0.607 --Analog sensor MCP9700 = 10.67

, 👍1

Обсуждение

посмотрите, действительно ли ваш код 4095 равен 3,3 В, а не 3,15 В или что-то в этом роде. Имейте в виду, что плечи и пальцы АЦП esp32 тоже немного вялые. `0,851 В / (895/4095)" - это 3,89 В, значит, на потолке что-то не так, @dandavis


1 ответ


0

Не полный ответ, а только направление для рассмотрения:

АЦП ESP32, по-видимому, поставляется с допуском калибровки АЦП ± 6%, как указано в техническом описании ESP32, глава 4.1.2. Вот документы по калибровке.

Похоже, вы все еще отстаете более чем на эти 6% (не просчитали это до конца). Может быть, ваш источник питания немного слабоват, что приводит к снижению внутреннего опорного напряжения?

,