терморезистор, неправильное чтение данных

igorlab
Offline
Зарегистрирован: 11.11.2015

Доброй ночи, люди уже волосы на голове рву... подключаю 10 кОм терморезистор на ардуино уно, мерит температуру с точностью до второго знака, подмышкой показывает 36.63!!! подключаю точно ТАК ЖЕ к ардуино нано или  ESP8266 через ADS1115 I2C и вместо 36.6 появляется 49, комнатная - вместо 25 показывает 27, пробовал разные библиотеки результат не меняется :( что делать, куда копать?...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Спросите у того, кто видел Ваши схему подключения и скетч.

igorlab
Offline
Зарегистрирован: 11.11.2015

схема стандартная, 

скетчи перебробовал штук 20 из инета - результат один и тот же, правльное измерение только на уно

#include <math.h>		// библиотека для выполнения простых математических операций

double Thermister(int RawADC) {
	double Temp;
	Temp = log(((10240000/RawADC) - 10000));
	Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
	Temp = Temp - 273.15;		// Kelvin to Celcius
	//Temp = (Temp * 9.0)/ 5.0 + 32.0;		// 1 способ Convert Celcius to Fahrenheit 
	//Temp = (Temp * 1.8) + 32.0;		// 2 способ Convert Celcius to Fahrenheit
	return Temp;
}

void setup() {
	Serial.begin(9600);		// открывает последовательный порт, на скорости 9600 бит/c
}

void loop() {
	Serial.print("Sensor_1: ");
	Serial.println(float(Thermister(analogRead(0))), 1);		// выводим показание 1 датчика
	//Serial.print("Sensor_2: ");
	//Serial.println(float(Thermister(analogRead(1))), 1);		// выводим показание 2 датчика
	//Serial.println(int(Thermister((analogRead(0))* 1.8) + 32.0));		// выводим показание 1 датчика в фаренгейтах
	delay(1000);		// ждем 1 секунду
}

или же этот


#include "thermistor.h"
#include "HardwareSerial.h"


// Analog pin used to read the NTC
#define NTC_PIN               A1

// Thermistor object
THERMISTOR thermistor(NTC_PIN,        // Analog pin
                      10000,          // Nominal resistance at 25 ºC
                      3950,           // thermistor's beta coefficient
                      10000);         // Value of the series resistor

// Global temperature reading
uint16_t temp;

/**
 * setup
 *
 * Arduino setup function
 */
void setup()
{
  Serial.begin(9600);
}

/**
 * loop
 *
 * Arduino main loop
 */
void loop()
{
  temp = thermistor.read();   // Read temperature

  Serial.print("Temp in 1/10 ºC : ");
  Serial.println(temp);

  delay(5000);
}

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

А где у вас в скетчах присутствует фиговина которую вы обозвали ADS1115?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

1скетч строка 19, читаете с цифрового пина 0 ?, может надо A0

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Valera19701 пишет:

1скетч строка 19, читаете с цифрового пина 0 ?, может надо A0


Можно и так если это аналоговый вход.
Именно нулевой аналоговый вход.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

trembo пишет:
Valera19701 пишет:

1скетч строка 19, читаете с цифрового пина 0 ?, может надо A0

Можно и так если это аналоговый вход.

особенно точность до 2 знака :)

sadman41
Онлайн
Зарегистрирован: 19.10.2016

В одном скетче он читает с A0, в другом с A1, Wire не используется, но анонсировано применение ADS1115. Сдается мне, что мы проходим какой-то квест.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

скорее всего у него нет УНО :)

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Valera19701 пишет:

trembo пишет:
Valera19701 пишет:

1скетч строка 19, читаете с цифрового пина 0 ?, может надо A0

Можно и так если это аналоговый вход.

особенно точность до 2 знака :)


Там вообще-то Thermister с точностью до одного знака, смотрите внимательней, пожалуйста.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

trembo пишет:
Valera19701 пишет:

trembo пишет:
Valera19701 пишет:

1скетч строка 19, читаете с цифрового пина 0 ?, может надо A0

Можно и так если это аналоговый вход.

особенно точность до 2 знака :)

Там вообще-то Thermister с точностью до одного знака, смотрите внимательней, пожалуйста.
а что , смайлик не заметен?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

надо подождать когда схему и скетч с ADS1115 выложит

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Valera19701 пишет:

надо подождать когда схему и скетч с ADS1115 выложит


Все 20 скетчей мы не переживём. ;)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

igorlab, а откуда Вы взяли константы в 5 и 6 строках скетча?

И еще: насколько я понял, Вы выложили схему, которая работает. А где схема, которая не работает?

Да, и еще: Ваша схема при таком подключении работать не будет. Ни одна схемиа не может работать, если на нее не подать питание. Только не надо говрить, что это само собой разщумеется. Совершанно очевидно, что Вы где-то допустили глупую ошибку, а где именно - можно понять только если обладать всей информацией, а не только той, которую Вы сочли нужным опубликовать. Если бы Вы знали, что нужно публиковать, а что нет - Вы бы сами справились с задачей без посторонней помощи.

Например, вполне вероятно, что Вы питаете делитель не от 5 Вольт, а от Vin, или еще что-нибудь подобное.

spa-sam
Offline
Зарегистрирован: 14.12.2012

Особо не вникал в тему... Вот навскидку что нашёл, может поможет. 

http://www.14core.com/wiring-the-ads1115-analog-to-digital-converter-with-thermistor-on-microcontroller/

http://www.instructables.com/id/16-bit-I2C-Temperature-Monitor-Using-Ard...

 

nik182
Offline
Зарегистрирован: 04.05.2015

Какой конкретно терморезистор у вас? Например здесь параметры. 

https://static.chipdip.ru/lib/051/DOC000051122.pdf

Судя по приведённой в #2 картинке точность мах 5% , т.е. без калибровки кривой нагрева точность со знаками после запятой не получить. Коэффициенты в скетчах либо некое среднее по больнице, либо подобранные под конкретные экземпляры. Если второе,то на других детальках ошибка может быть ещё больше. На форуме уже обсуждалось как калибровать терморезистор. По крайней мере по точкам 100, 36.6, 0 градусов можно довольно точно построить кривую нагрева. Тогда и ошибки будут минимальными.    

igorlab
Offline
Зарегистрирован: 11.11.2015

спасибо за ответы! :)

разные пины потому что сейчас вокруг меня 4 контролера и на них пытаюсь что-то померить,

для АЦП изменил библиотеку #include "thermistor.h"

#include "thermistor_ADS1115.h"
#include "HardwareSerial.h"
#include <Adafruit_ADS1015.h>
Adafruit_ADS1115 ads1(0x48); //Здесь указываем адрес устройства

// Temperature for nominal resistance (almost always 25 C)
#define TEMPERATURENOMINAL 25

// Number of ADC samples
#define NUMSAMPLES         5 

// ADC resolution
#ifdef PANSTAMP_NRG
#define ADC_RESOLUTION 32768
#else
#define ADC_RESOLUTION 32768
#endif
//#define VERBOSE_SENSOR_ENABLED 0
/**
 * THERMISTOR
 * 
 * Class constructor
 *
 * @param adcPin Analog pin where the thermistor is connected
 * @param nomRes Nominal resistance at 25 degrees Celsius
 * @param bCoef beta coefficient of the thermistor
 * @param serialRes Value of the serial resistor
 */
THERMISTOR::THERMISTOR(uint16_t adcPin, uint16_t nomRes, uint16_t bCoef, uint16_t serialRes) 
{
  analogPin = adcPin;
  nominalResistance = nomRes;
  bCoefficient = bCoef;
  serialResistance = serialRes;
}

/**
 * read
 *
 * Read temperature from thermistor
 *
 * @return temperature in 0.1 ºC
 */
float THERMISTOR::read()
{
  uint8_t i;
  uint16_t sample;
  float average = 0;

  //analogReference(DEFAULT);

  // take N samples in a row, with a slight delay
  for (i=0; i< NUMSAMPLES; i++)
  {
    sample = ads1.readADC_SingleEnded(analogPin);//VoltageNTC;//analogRead(analogPin);
    average += sample;
    delay(10);
  }
  average /= NUMSAMPLES;

  #ifdef VERBOSE_SENSOR_ENABLED  
  Serial.print("Average analog reading "); 
  Serial.println(average);
  #endif
 
  // convert the value to resistance
  average = ADC_RESOLUTION / average - 1;
  average = serialResistance * average;

  #ifdef VERBOSE_SENSOR_ENABLED
  Serial.print("Thermistor resistance "); 
  Serial.println(average);
  #endif
 
  float steinhart;
  steinhart = average / nominalResistance;     // (R/Ro)
  #ifdef PANSTAMP_NRG
  steinhart = logf(steinhart);                 // ln(R/Ro)
  #else
  steinhart = log(steinhart);                  // ln(R/Ro)
  #endif
  steinhart /= bCoefficient;                   // 1/B * ln(R/Ro)
  steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
  steinhart = 1.0 / steinhart;                 // Invert
  steinhart -= 273.15;                         // convert to C
 
  #ifdef VERBOSE_SENSOR_ENABLED
  Serial.print("Temperature "); 
  Serial.print(steinhart);
  Serial.println(" *C");
  #endif
  
  return (float)(steinhart);
}

прикол в том что все скетчи работают на уно! :( на нано и есп8266 читает но не правильно показывает температуру :(

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

igorlab пишет:

схема стандартная, 

А стандартная здесь никому не нужна. Нужна та, которая у Вас не работает (с ADS1115).

А это не схема - это Ваша ленивая задница, которой лень нарисовать свою схему и сделать фото своей сборки. 

Но если Вам лень решать свою проблему, какие у Вас основания ожидать, что кому-то не лень решать Вашу?

igorlab
Offline
Зарегистрирован: 11.11.2015

Евгений, схема действительно стандартная :) не работает и с ардуино нано,

в RO впаян обычный 10 кОм резистор, в разъем RT вставляется штекер терморезистора

nik182
Offline
Зарегистрирован: 04.05.2015

Можно померить тестером +5 вольт и напряжение на А0?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

nik182 пишет:

Можно померить тестером +5 вольт и напряжение на А0?

Это тяжело.
Почти невозможно.
Точно также как и поменять терморезистор на 10кОм постоянный
и искать почему показания не равны 25 градусов.
Проще подмышку как эталон температуры использовать.

Ну и на десерт, 1115, 1015 -. какая разница.........

Впечатление что скетч никто и не запускал.......

#include "thermistor_ADS1115.h"
#include "HardwareSerial.h"
#include <Adafruit_ADS1015.h>
Adafruit_ADS1115 ads1(0x48); //Здесь указываем адрес устройства

 

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

trembo пишет:

Проще подмышку как эталон температуры использовать.

...подмышку мамки. о_О

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

igorlab, приведенная Вами схема не дает представления, ка4к именно у Вас разведены питение и земля, но похоже, что Ваша проблема связана с тем, что Вы на Vin подаете 5 Вольт.

Измерьте, какое на самом деле напряжение на контакте Ардуино, подписанном "5V" (27 нога).

igorlab
Offline
Зарегистрирован: 11.11.2015

trembo пишет:

Ну и на десерт, 1115, 1015 -. какая разница.........

Впечатление что скетч никто и не запускал.......

#include "thermistor_ADS1115.h"
#include "HardwareSerial.h"
#include <Adafruit_ADS1015.h>
Adafruit_ADS1115 ads1(0x48); //Здесь указываем адрес устройства
​

разница в рязрядности АЦП, запускал и он даже работал, но температуру показывал неправильно.

СПАСИБО ЗА ПОДСКАЗКИ, с нано РАЗОБРАЛСЯ! проблема была в том что на терморезистор подавалось стабилизированное напряжение от БП, а на ардуине после линейника было 4.68, когда на терморезистор стал подавать напряжение с ноги +5 ардуино, то температура начала читаться правильно аж до десятых! идею ЕСП с АЦП забросил... 

Делаю, не пинайте ногами, очередной контроллер для аквариума, он будет следить за температурой воды в акве, температурой и влажностью в тумбе с сампом, при необходимости вентилировать тумбу кулером, вкл и откл УФ для обеззараживания воды, измерять рН, автоматически доливать испарившийся объем воды и следить за уровнем воды в емкости автодолива, оповещть о заполнении емкости скимера. Оповещать планирую по с помощью бота телеграма. Идея такова - нано отправляет в порт Тх Rx строку со всеми параметрами, ЕСП ее читает и парсит, в случае недопусимых параметров - к примеру сработал датчик низкого уровня воды в емкости автодолива бот отправляет сообщение. формирование строки на нано сделал, парсинг строки на ЕСП тоже работает, но вот с порта пока  читать не хочет, так что у меня будет еще много вопросов :)

пршу прощения - тему создал без необходимых деталей, постараюсь дальше так не туканить :)

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Вот блокирнут телеграм, и как рыбки будут привет передавать :(

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

igorlab пишет:
он будет следить за температурой воды в акве, температурой и влажностью в тумбе с сампом, при необходимости вентилировать тумбу кулером, вкл и откл УФ для обеззараживания воды, измерять рН, автоматически доливать испарившийся объем воды и следить за уровнем воды в емкости автодолива, оповещть о заполнении емкости скимера.

А корованы? Не?

igorlab
Offline
Зарегистрирован: 11.11.2015

Не заблокируют, 

gtandrey
Offline
Зарегистрирован: 04.11.2016

Добрый вечер!

К сожалению, решение так и не нашлось. Как подключить термистор к ESP8266 через ADS1115, поэтому хочется возобновить тему.

У меня задача подключить 3 датчика к ESP8266. При подключении к А0 на ESP проблем нет, но вот с ADS1115 не могу подружиться.

ESP8266+ADS1115+термистор

Термисторы использую

https://aliexpress.ru/item/1885494206.html?spm=a2g0s.9042311.0.0.264d33edrgNwFT

#include <Wire.h>
#include <Adafruit_ADS1015.h>
#include "SSD1306Wire.h"

SSD1306Wire display(0x3c, SDA, SCL);   // ADDRESS, SDA, SCL  -  SDA and SCL usually populate automatically based on your board's pins_arduino.h
Adafruit_ADS1115 adc;

#define PIN_T1 A0

#define THERMISTORNOMINAL 10000 // сопротивление при 25 градусах по Цельсию
#define TEMPERATURENOMINAL 25 // temp. для номинального сопротивления (практически всегда равна 25 C)
#define KOL_IZMER 10  // сколько показаний используем для определения среднего значения
#define BCOEFFICIENT 3950 // бета коэффициент термистора (обычно 3000-4000)
#define SERIESRESISTOR1 10000 // сопротивление второго резистора
uint32_t mas_temp1[KOL_IZMER];
float temp1=0;
uint32_t mas_temp2[KOL_IZMER];
float temp2=0;
uint32_t mas_temp3[KOL_IZMER];
float temp3=0;

uint8_t cc=0;



float measure_temp1(){
   uint8_t i;
   uint32_t sum=0;
   uint8_t count=0;
   uint16_t value;
   for (i = 0; i < 9; i++){
     if (mas_temp1[i+1]!=0){
       sum+=mas_temp1[i+1];
       count++;
     }
     mas_temp1[i]=mas_temp1[i+1];
   }
   value=analogRead(PIN_T1);

   mas_temp1[9]=value;
   sum+=value;
   count++;
   return 1/(log(SERIESRESISTOR1/(1024/(float)(sum/count)-1)/10000)/BCOEFFICIENT+(1.0/(25+273.15)))-273.15;
}

float measure_temp2(){
   uint8_t i;
   uint32_t sum=0;
   uint8_t count=0;
   uint16_t value;


   int16_t Results;
   float temp, R, Vo, average;
   float Vcc = 3300; // Vin represented in millivolts
   float To = 298.15; // Nominal temperature in Kelvin
   float Ro = 10000; // Nominal Resistance of Thermistor
   float Rs = 10000; // Value of fixed resistor
   float multiplier = 0.0625F; // multiplier to convert ADS1115 into millivolts


   for (i = 0; i < 9; i++){
     if (mas_temp2[i+1]!=0){
       sum+=mas_temp2[i+1];
       count++;
     }
     mas_temp2[i]=mas_temp2[i+1];
   }
   value = adc.readADC_SingleEnded(0);
   //Serial.println(value);
   mas_temp2[9]=value;
   sum+=value;
   count++;
   value=sum / count;
   Vo = sum / count *multiplier;
   //Serial.println(Vo);
   R = (Rs*(Vcc-Vo))/Vo; 

   temp = R/Ro;
   temp = log(temp);
   temp /= BCOEFFICIENT;
   temp += 1.0 / To;
   temp = 1 / temp;
   temp -= 273.15;
   
   return temp;
   //return 1/(log(SERIESRESISTOR1/(65536/(float)(sum/count)-1)/10000)/3950+(1.0/(25+273.15)))-273.15;
}

float measure_temp3(){
  uint8_t i;
  uint32_t sum=0;
  uint8_t count=0;
  uint16_t value;

  float Voltage = 0.0;
  int thermistor_25 = 10000;
  float refCurrent = 0.0001;

   for (i = 0; i < 9; i++){
     if (mas_temp3[i+1]!=0){
       sum+=mas_temp3[i+1];
       count++;
     }
     mas_temp3[i]=mas_temp3[i+1];
   }
   value = adc.readADC_SingleEnded(0);
   mas_temp3[9]=value;
   sum+=value;
   count++;
   value=sum/count;

   Voltage = value * (3.3 / 65535); // Replace 5.0 with whatever the actual Vcc of your Arduino is
   float resistance = (Voltage / refCurrent); // Using Ohm's Law to calculate resistance of thermistor
   float ln = log(resistance / thermistor_25); // Log of the ratio of thermistor resistance and resistance at 25 deg. C
   float kelvin = 1 / (0.0033540170 + (0.00025617244 * ln) + (0.0000021400943 * ln * ln) + (-0.000000072405219 * ln * ln * ln)); // Using the Steinhart-Hart Thermistor Equation to calculate temp in K
   float temp = kelvin - 273.15; // Converting Kelvin to Celcuis
   return temp;
}

void setup(){
  Serial.begin(9600);
  //adc.setGain(GAIN_TWO);
  adc. begin();
  display.init();
  display.setFont(ArialMT_Plain_24);
}

void loop(){
  cc++;
  temp1=measure_temp1();
  temp2=measure_temp2();
  temp3=measure_temp3();
  
  if (cc>10){
    cc=0;
    Serial.print("TEMP1=");
    Serial.print(temp1);
    Serial.print("C");
    Serial.print("\tTEMP2=");
    Serial.print(temp2);
    Serial.println("C");
    Serial.print("\tTEMP3=");
    Serial.print(temp3);
    Serial.println("C");

    display.clear();
    display.drawString(0, 0, String(temp1));
    display.drawString(0, 20, String(temp2));
    display.drawString(60, 20, String(temp3));
    display.display();
  }
  delay(100);
}

При комнатной температуре приблизительно 23 градуса

temp1 показывает 23 (analogRead(А0)

temp2 показывает -9.8

temp3 показывает 47.7

adc.readADC_SingleEnded(0)     считывает 7750

напряжение с ADS на A0  1.43В

Напряжение с пина 3.3 - 3 Вольта при подключённом дисплее

и 3.2 В при выключенном

 

Множество скетчей перепробовал, но без результатно. ПОМОГИТЕ кто чем может.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

А зачем же вы 123 строку-то закоментировали? В итоге по умолчанию gain ставится 2/3, а при питании от 3В это вообще-то недопустимо.

gtandrey
Offline
Зарегистрирован: 04.11.2016
  // ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  // ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.0078125mV

меня смутило +/- 2.048V при GAIN_TWO

Спасибо за подсказку, убрал коммент и всё заработало :)

правда показания немного отличаются в 0.6 градуса, но это я уже сам разберусь.

Ещё раз спасибо

 

svm
Offline
Зарегистрирован: 06.11.2016

При измерении температуры термистором, фактически происходит измерение сопротивления термистора. Для того чтобы получить адекватные измерения с помощью внешнего АЦП необходимо знать точное значение напряжения питания делителя и постоянного резистора. Принимать его 3,3 В - это заведомо ошибочно. Мало того что стабилизаторы 3,3 В имеют значительный разброс по напряжению, оно еще и во времени болтается, внося хаотичное изменение показаний. Максимальная стабильность  показаний возможна только если AREF = напряжению питания делителя термистора. Так как при вычислении сопротивления термистора не важны абсолютные значения напряжения питания и напряжение на термисторе. Важно их соотношение. В формулах расчета напряжение питания уничтожается. Поэтому лучшую стабильность даст схема, когда делитель подключен напрямую к источнику питания, и AREF тоже выбран от источника питания. Я пробовал для увеличения разрядности брать опорное 1,1В , а делитель (даже из двух постоянных резисторов) питать от отдельного стабилизатора, но ни разу не получил одинаковых показаний, тогда как питание от 5В и опорное 5В при одном и том-же делителе на любой ардуинке дает одно и то-же значение.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

svm пишет:

При измерении температуры термистором, фактически происходит измерение сопротивления термистора. Для того чтобы получить адекватные измерения с помощью внешнего АЦП необходимо знать точное значение напряжения питания делителя и постоянного резистора. Принимать его 3,3 В - это заведомо ошибочно. Мало того что стабилизаторы 3,3 В имеют значительный разброс по напряжению, оно еще и во времени болтается, внося хаотичное изменение показаний. Максимальная стабильность  показаний возможна только если AREF = напряжению питания делителя термистора. Так как при вычислении сопротивления термистора не важны абсолютные значения напряжения питания и напряжение на термисторе. Важно их соотношение. В формулах расчета напряжение питания уничтожается. Поэтому лучшую стабильность даст схема, когда делитель подключен напрямую к источнику питания, и AREF тоже выбран от источника питания. Я пробовал для увеличения разрядности брать опорное 1,1В , а делитель (даже из двух постоянных резисторов) питать от отдельного стабилизатора, но ни разу не получил одинаковых показаний, тогда как питание от 5В и опорное 5В при одном и том-же делителе на любой ардуинке дает одно и то-же значение.

 

Это все абсолютно правильно. Проблема только в том, что у ADS11x5 нет пина Аref. А также нельзя выбрать напряжение питания в качестве опорного.напряжение . При использовании этого АЦП можно завести напряжение питания через делитель на один из входов и испозовать в рассчетах для компенсации.

svm
Offline
Зарегистрирован: 06.11.2016

asam пишет:

Это все абсолютно правильно. Проблема только в том, что у ADS11x5 нет пина Аref. А также нельзя выбрать напряжение питания в качестве опорного.напряжение . При использовании этого АЦП можно завести напряжение питания через делитель на один из входов и испозовать в рассчетах для компенсации.

Это наверное будет самое оптимальное решение. Больше никак.