Получение неверных аналоговых показаний с использованием 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
@KamelK, 👍1
Обсуждение1 ответ
Не полный ответ, а только направление для рассмотрения:
АЦП ESP32, по-видимому, поставляется с допуском калибровки АЦП ± 6%, как указано в техническом описании ESP32, глава 4.1.2. Вот документы по калибровке.
Похоже, вы все еще отстаете более чем на эти 6% (не просчитали это до конца). Может быть, ваш источник питания немного слабоват, что приводит к снижению внутреннего опорного напряжения?
- esp32 Stack canary watchpoint срабатывает
- ESP32S v1.1 NodeMCU vs ESP32 DevKitV1
- esp32-cam публикует изображение в mqtt
- WindowsError(31, "Устройство, подключенное к системе, не функционирует") в arduino
- Как очистить кучу памяти в esp32
- ESP-NOW и Wi-Fi, и OTA одновременно на Отправителе и Получателе
- PN532 не обнаруживает RFID-карту при подключении к ESP32 в режиме I2C, но отлично работает с Arduino Uno
- AsyncWebServer дает сброс wdt
посмотрите, действительно ли ваш код 4095 равен 3,3 В, а не 3,15 В или что-то в этом роде. Имейте в виду, что плечи и пальцы АЦП esp32 тоже немного вялые. `0,851 В / (895/4095)" - это 3,89 В, значит, на потолке что-то не так, @dandavis