Подписаться YouTube

Arduino омметр, или как подключить терморезистор к Arduino

В этой статье речь пойдет про то, как сделать простой измеритель сопротивления на базе АЦП преобразователя популярных микроконтроллеров, таких как Arduino, WeMos, всяких микроконтроллеров на базе ESP8266, ESP32. На самом деле даже не важно, какой именно микроконтроллер вы возьмете, важнее то какой АЦП преобразователь там будет установлен.

Но в качестве примера я буду использовать плату Arduino UNO.

Итак, прибор для измерения электрического сопротивления называется омметр. Работа цифрового омметра, так же как и работа любого другого цифрового измерительного прибора основана на аналогово-цифровом преобразователе.

АЦП в микроконтроллерах

Аналогово-цифровой преобразователь – это устройство, которое в соответствии с уровнем напряжения на входе возвращает цифровое значение на выходе. Т.е. по сути дела, это и есть вольтметр.

В Arduino UNO есть 6 пинов, которые содержат АЦП преобразователь. Это контакты с номерами от A0 до A5. Чтобы их задействовать, достаточно в блоке кода setup() установить для них режим INPUT. pinMode(A0, INPUT);

Arduino UNO АЦП

После этого в программном цикле loop можно будет получить значение с этого входа при помощи вызовы функции analogRead(A0).

В Arduino UNO установлен, 10 битный АЦП с уровнем логики 5 вольт, поэтому на выходе получаются 2 в десятой степени значений, что соответствует напряжению от 0 до 5 вольт с шагом примерно 0.005 вольт. В других микроконтроллерах может быть другой уровень логики АЦП, и другая разрядность. Вот таблица с некоторыми популярными микроконтроллерами.

Плата (Board)Рабочее напряжение (Working voltage )Каналы (Channels)Разрядность (Bit depth)
Arduino Uno (ATmega328)5 VA0 .. A510 bit
Arduino Mini, Nano (ATmega168)5 VA0 .. A710 bit
Arduino Mega (Mega2560)5 VA0 .. A1410 bit
Arduino Micro (ATmega32u4)5 VA0 .. A1110 bit
Arduino Leonardo (ATmega32u4)5 VA0 .. A1110 bit
Arduino Zero (ATSAMD21G18)3.3 VA0 .. A512 bit
Arduino Due (AT91SAM3X8E)3.3 VA0 .. A1112 bit
Arduino MKR Family boards3.3 VA0 .. A612 bit
WeMos (ESP8266)3.3 VA010 bit
NodeMCU (ESP8266)3.3 VA010 bit
ESP323.2 V0 .. 1512 bit

Так же есть отдельные Arduino модули, которые реализуют АЦП. Они могут пригодиться, если стандартный АЦП вас чем-то не устраивает или их недостаточно много.

В Arduino можно менять значение опорного напряжения АЦП.

Для этого существует функция analogReference. В качестве аргумента ей могут быть переданы константы. Вот список этих констант.

Arduino UNO АЦП

Эта функция меняет уровень опорного напряжения сразу на всех АЦП входах.

Отдельное внимание заслуживает константа EXTERNAL. Дело в том, что на некоторых платах Arduino есть специальный контакт, который нужен для подачи на него опорного напряжения. Таким образом, можно изменить значение опорного напряжения на такое как вам будет удобно. Но я бы не стал использовать этот контакт для повышения напряжения, он больше подходит для понижения напряжения.

Подавление радиопомех на входе АЦП

Входной сигнал часто содержит высокочастотные помехи. Поэтому на входе лучше подключить фильтр нижних частот (ФНЧ). Он фильтрует помехи выше определенной частоты.

Фильтр нижних частот (ФНЧ)

Частота среза рассчитывается следующим образом

Частота среза рассчитывается следующим образом

f - Частота среза, Гц

R - Сопротивление резистора, Ом

C - Ёмкость конденсатора, Ф(Фарады)

Например, если емкость конденсатора 10 микрофарад, сопротивление резистора 1 килоом, то частота среза будет 16 герц.

Частота среза, пример

Уменьшить шум можно так же программно. Например, вместо того, чтобы делать одно измерение, можно сделать несколько десятков измерений подряд, а затем рассчитать среднее значение. Число измерений, и паузу между ними лучше подбирать экспериментально.

Делитель напряжения, вывод формулы для измерения сопротивления

Аналогово-цифровой преобразователь измеряет напряжение, а для измерения сопротивления нужно придумать, как измерив, напряжение можно рассчитать сопротивление.

Обычно используют делитель напряжения. Он используется для измерения сопротивления даже в заводских омметрах.

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

Давайте немного поговорим о том, что такое делитель напряжения и вспомним школьные формулы для последовательного соединения.

Делитель напряжения это два резистора соединенных последовательно. Эти резисторы я обозначу Rx и Rref. Rx это резистор с неизвестным сопротивлением, а Rref это референсный, или опорный резистор, его сопротивление нам известно.

Делитель напряжения

Через эти резисторы протекают одинаковые токи, а разности потенциалов или, проще говоря, напряжение на них разные. Разность потенциалов на резисторе Rx я обозначу как Ux, разность потенциалов на резисторе Rref, обозначу как Uref. Общее напряжение цепи обозначу как U.

Проще всего найти любые неизвестные параметры делителя напряжения из равенства токов и закона ома.

Равенство токов в делители напряжения

Напряжение в делители напряжения

Через два резистора на рисунке протекает один и тот же ток. Ток это напряжение, деленное на сопротивление. Ток, протекающий через резистор 1 равен разности потенциалов на этом резисторе деленное на сопротивление резистора. Аналогично и для второго резистора.

А общий ток будет равен напряжению, на концах делителя напряжения деленному на сумму сопротивлений.

Rx проще всего выразить вот из этого уравнения.

Rx проще всего выразить вот из этого уравнения

Получается, что формула для нахождения неизвестного сопротивления выглядит вот так.

Формула для нахождения неизвестного сопротивления

Сигнал с АЦП преобразователя можно получить с помощью функции analogRead(A0). При этом если опорное напряжение для АЦП выбрано 5 вольт, то значению 1023 будет соответствовать напряжение на входе A0 в 5 вольт. Значит, чтобы найти напряжение на входе A0 нужно 5 вольт разделить на 1023 и умножить на значение, полученное с analogRead(A0).

Референсное напряжение

Vadc = analogRead(A0)

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

Формулу для измерения неизвестного сопротивления в АЦП делителя напряжения

Это и есть конечная формула, которую я буду использовать для нахождения неизвестного сопротивления. Как видно она зависит только от сопротивления R, опорное напряжение из нее исчезло.

Минимальный код, для получения этого сопротивления написанный в Arduino IDE, выглядит вот так.

float Rref = 100.0f;

void setup() {
  Serial.begin(9600);
  pinMode(A0, INPUT);
}

void loop() {
  float Vadc = float(analogRead(A0));
  float Rx = Rref * (1023.0f / Vadc - 1.0f);
  Serial.print("Rx: ");
  Serial.println(Rx);
  delay(1000);
}

Это еще не все. Я пойду дальше и рассмотрю еще несколько очень важных вопросов.

Вывод формулы для оптимального значения референсного сопротивления

Возникает вопрос, каким же выбрать опорное сопротивление Rref.

Для ответа на него нужно проанализировать последнюю формулу и заодно оценить погрешности измерений.

Вначале я хочу посмотреть, как меняется цена деления нашего измерительного прибора в зависимости от показаний с АЦП. Для этого из предыдущих показаний нужно вычесть следующие за ними. Опорное сопротивление Rref выберу равным 100 Ом.

Формула для вычисления цены деления АЦП выглядит вот так.

Формула для вычисления цены деления АЦП

Эта величина прямо пропорциональна абсолютной погрешности и совпадает с числовым дифференциалом от данной формулы вычисленным с шагом 1.

График этой зависимости выглядит вот так. Если опорное сопротивление выбрать другим, то измениться только масштаб графика, а его форма останется прежней.

График цены деления АЦП

Он так резко возрастает, что я исключил из него точки вблизи нуля. Вот его значения вблизи нуля.

Значения АЦПЦена деления
10930,00
20243,57
30110,00
4062,38
5040,12
6027,95
7020,58
8015,79
9012,49
10010,13
1108,38
1207,05
1306,01
1405,18
1504,52

Теперь я хочу оценить относительную погрешность измерений.

Формула для вычисления относительной погрешности в процентах выглядит вот так.

Формула для вычисления относительной погрешности АЦП

Ее график выглядит вот так.

График относительной погрешности АЦП

На этот раз график симметричен относительно центра. Относительная погрешность больше 5% вблизи точек 23 и 1000. Значения АЦП ниже 23 или выше 1000 лучше не учитывать при измерениях, потому что относительная погрешность в них будет большой.

Глядя на эти графики, можно понять какое именно референсное сопротивление нужно выбрать для тех или иных случаев.

Для измерений важна относительная погрешность, и я хочу получить прибор, теоретическая точность которого не ниже 5%. Тогда получается, что минимальная величина сопротивления которое сможет измерить этот прибор будет вычисляться вот по этой формуле, а максимальная вот по этой формуле.

Rmin

Rmax

Реальные погрешности, конечно, будут выше из-за шумов АЦП. Но шумы АЦП величина постоянная.

Код при этом немного усложняется. Точнее говоря совсем немного.

float Rref = 100.0f;

void setup() {
  Serial.begin(9600);
  pinMode(A0, INPUT);
}

void loop() {
  delay(1000);
  float Vadc = float(analogRead(A0));
  if (Vadc < 23.0f || Vadc > 100.0f) {
    Serial.println("Недостаточная точность измерений");
    return;
  }

  float Rx = Rref * (1023.0f / Vadc - 1.0f);
  Serial.print("Rx: ");
  Serial.println(Rx);
}

Если нужна теоретическая точность измерений выше 1%, то интервал нужно снизить еще и использовать вот эти формулы

Rmax 1%

Rmax 1%

Это минимальное и максимальное сопротивление, которое можно измерить с заданным опорным сопротивлением в пределах погрешности 1%.

Вывод формулы для оптимального значения референсного сопротивления

Если вы знаете максимальное и минимальное значение интервала сопротивлений, и хотите найти оптимальное значение для референсного сопротивления, то это можно сделать, используя вот эту формулу.

Rref

Это решение не сложно получить, выразив из вот такой, системы уравнений переменные Rref и n. 1023 это константа, равная максимальному значению которое выдает АЦП. Для других АЦП она может быть другой.

Система уравнений

Величина отступа, т.е. n при этом будет равна

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

Смысл этого n в том, чтобы точно попасть в диапазон от Rmin до Rmax, на деле его лучше выбирать исходя из относительной погрешности, а не из желания попасть в какой-то конкретный диапазон.

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

Зная n, можно легко найти число различных значений в этом диапазоне. Обозначу его N заглавное.

Число различных значений

Это все замечательно, но есть способ для вычисления опорного сопротивления гораздо проще.

Если мне нужно будет измерять точно сопротивление вблизи какой-то одной точки, так чтобы относительная погрешность была мала, то я выберу Rref равным этому сопротивлению. Тогда значения АЦП будут всегда вблизи 512, где относительная погрешность мала.

Кстати, вблизи точки, Rmax будет равен Rmin и как следует из формулы, в которой Rref выражается через Rmax и Rmin все это будет равно Rref.

В общем, все это значит, что если у вас есть терморезистор и вы хотите очень точно измерять температуру вблизи какого-то одного значения, то нужно измерить сопротивление этого терморезистора вблизи этой температуры и взять Rref равным этому сопротивлению. Все, что было выше это математическое доказательство этого утверждения.

Но если вы сейчас подумали, что с тем же успехом можно взять середину диапазона, который вам интересен, то вы ничего не поняли. Диапазон нужно рассчитывать не так.

Пример, решения задачи

Приведу пример. Допустим, у меня есть диапазон сопротивлений от 10 Ом до 20 кОм. Каким нужно брать опорное сопротивление, чтобы захватить весь этот диапазон?

Rmin = 10, Rmax = 10k

Rref = 470

Получилось всего 470 Ом, а не 10 килоом как можно было подумать. Посчитаю отступы и число различных значений

n = 22

N = 980

Сделаю проверку, потому, что резистора с номиналом 447 Ом нет в природе, и он был заменен на резистор 470 Ом.

Rmin, Rmax

Полученные значения достаточно близки к изначальным условиям. Значит, резистор на 470 Ом подойдет.

Обратите внимание, что 10-битный АЦП будет различать 980 различных значений, что не так уж и много на таком широком диапазоне. Но точность измерения каждого отдельного значения будет в пределах 5%. Вот это сложнее всего осмыслить. Чтобы это понять еще раз взгляните на то, как выглядит цена деления АЦП.

Следует задуматься об использовании 12-битного АЦП. Тогда число различных значений уже будет примерно 3900, если он конечно не шумит.

n = 90

N = 3916

А если бы вы использовали опорный резистор на 10К, то у вас получился бы эффективный диапазон измерений от 230 Ом до 435 кОм. В изначальный диапазон при этом попадало бы 659 различных значений, значит, точность измерений снизилась бы в полтора раза.

Rmin, Rmax, error

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

Само собой точность измерений можно повысить, если измерить точный номинал опорного резистора и использовать в программе именно его.

Пример электрической схемы, сборка, тестирование

Комментарии пользователей