Электрификация

Справочник домашнего мастера

Измерение сопротивления на ардуино

Резистивные датчики

Одним из основных элементов электроники является Резистор. Для того чтобы понять, что такое Резистор, нужно знать, что определенный химический элемент проводит ток по-разному. Следовательно, Резистор — это материал, ограничивающий ток, который проходит через него.

Так выглядит резистор в жизни и на схеме:

Основными характеристиками резистора являются:

  • сопротивление (Ом)
  • мощность (Ватт)

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

Переменный резистор

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

Такие резисторы имеют 3 вывода: 1 и 3- контакты питания, 2 — средний контакт служит для снятия показаний с резистора. Вращая ручку мы подстраиваем сопротивление. Последовательное и параллельное подключение резисторов При последовательном соединении резисторов сумма сопротивления всех резисторов в участке цепи складывается. Получаем формулу.

Rобщ =R1 + R2 +R3 +…+Rn

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

1/Rобщ= 1/R1 + 1/R2 +1/R3 +…1/+Rn

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

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

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

По закону Ома найдет напряжение на резисторе R2.

Делаем вывод: если R1 и R2 одинаковы (200 Ом), то напряжение на Vout будет в 2 раза меньше, чем на Vcc.

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

Терморезистор (Термистор)

Терморезистор — думаю исходя из названия все понятно. Данный датчик меняет свое сопротивление в зависимости от его температуры.

Фоторезистор

Изменяет свое сопротивление, при попадании света на его «змейку».

Мы дали вам общее представление данного радиоэлемента. Этих знаний хватит чтобы собирать принципиальные схемы.

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

Принцип работы потенциометра

Переменный резистор или потенциометр – это электрическое устройство, значение уровня сопротивления которого можно задать в определенных пределах. Таким образом мы можем менять параметры электрических схем, гибко подстраивая их под определенные условия: например, регулировать чувствительность датчика или громкость звука в динамике. Потенциометры получили широкое распространение в схемах регулировки громкости, напряжения, контрастности и т.д., за свою простоту и практичность.

В зависимости от своего строения потенциометры делятся на два больших класса: цифровые и аналоговые. Основным элементом цифрового потенциометра является резистивная лестница, где на каждом шаге схемы имеются электронные переключатели. В конкретный момент времени происходит закрытие только одного электронного выключателя, что задает определенную величину сопротивления. За счет количества шагов в лестнице определяется диапазон разрешения потенциометра. Аналоговый потенциометр может изменять свое значение непрерывно, но, как правило, в более узком диапазоне и сам резистор будет иметь большие габариты.

В подавляющем большинстве случаев в проектах ардуино используются цифровые потенциометры. Чаще всего они являются интегральными схемами с положением цифрового указателя по центру шкалы.

Подключение потенциометра к платам Ардуино

Схема подключения

Подключение потенциометра к ардуино выполняется в соответствии со схемой, представленной на рисунке:

Для этого три вывода потенциометра необходимо соединить с указанными выводами платы:

  • Черный – GND;
  • Красный – питание 5В;
  • Средний – от центрального вывода к аналоговому входу А0.

Изменяя положение вала подключенного потенциометра, происходит изменение параметра сопротивления, которое вызывает изменение показателя на нулевом пине платы ардуино. Считывание полученного значения напряжения аналогового импульса происходит в скетче с помощью команды analogRead ().

В плату Ардуино встроен аналого-цифровой преобразователь, способный считывать напряжение и переводить его в цифровые показатели со значением от нуля до 1023. При повороте указателя до конечного значения в одном из двух возможных направлений, напряжение на пине равно нулю, и, следовательно, напряжение, которое будет генерироваться составляет 0 В. При повороте вала до конца в противоположном направлении на пин поступает напряжение величиной 5В, а значит числовое значение будет составлять 1023.

Пример проекта

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

Для проведения работ следует подготовить такие детали:

  • 1 плату Arduino Uno
  • 1 беспаячную макетную плату
  • 1 светодиод
  • 1 резистор с сопротивлением 220 Ом
  • 6 проводов «папа-папа»
  • 1 потенциометр.

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

Пример скетча

В этом примере важно понимать, что яркость свечения светодиода управляется не напряжением подаваемым с потенциометра, а кодом.

#define PIN_LED 11 #define PIN_POT A0 void setup() { // Пин, к которому подсоединяется светодиод определяем как выход pinMode(PIN_LED, OUTPUT); // Пин с переменным резистором является входом pinMode(PIN_POT, INPUT); } void loop(){ // Определяем 2 переменные типа int int rotat, brightn; // Считывание в переменную rotat напряжения с переменного резистора: // микроконтроллер будет выдавать числа от 0 до 1023 // пропорциональны положению поворота вала rotat = analogRead(PIN_POT); // Преобразуем значение в яркость. Для этого делим rotat на 4, что с учетом округления даст нам число от 0 до 255. Именно это число мы подадим на шим-выход, с помощью которого можно управлять яркостью. brightn = rotat / 4; // Запись шим значения яркости на светодиод analogWrite(PIN_LED, brightn); }

Данная статья является первой в серии статей про измерение с помощью Arduino параметров различных компонентов и физических величин, используемых в радиоэлектронике. Начнем с самого простого – с измерения сопротивления.

Определение сопротивления резистора по цветовому коду может вызывать некоторые трудности. Чтобы преодолеть эту сложность, мы собираемся с помощью Arduino построить простой измеритель сопротивления. Основным принципом данного проекта является использование схемы делителя напряжения. Значение неизвестного сопротивления будет отображаться на LCD дисплее 16×2. Данный проект также служит примером взаимодействия Arduino с символьным LCD дисплеем.

Измеритель сопротивления на Arduino

Необходимые компоненты

  • плата Arduino Uno;
  • LCD дисплей 16×2;
  • потенциометр 1 кОм;
  • резисторы;
  • макетная плата;
  • перемычки.

Принципиальная схема

Принципиальная схема измерителя сопротивления на Arduino

Arduino Uno

Arduino Uno – это открытая микроконтроллерная плата на базе микроконтроллера ATmega328p. Она имеет 14 цифровых выводов (из которых 6 выводов можно использовать в качестве выходов ШИМ), 6 аналоговых входов, встроенные стабилизаторы напряжения и так далее. Arduino Uno имеет 32 КБ флэш-памяти, 2 КБ SRAM и 1 КБ EEPROM. Она работает с тактовой частотой 16 МГц. Для связи с другими устройствами Arduino Uno поддерживает последовательный интерфейс, I2C, SPI. В таблице ниже приведены технические характеристики Arduino Uno (более подробное техническое описание можно посмотреть ).

Микроконтроллер ATmega328P
Рабочее напряжение 5 В
Входное напряжение (рекомендуемое) 7-12 В
Цифровые входные/выходные выводы 14
Аналоговые входные выводы 6
Флэш-память 32 Кбайт, из которых 0,5 Кбайт используются загрузчиком
Оперативная память SRAM 2 Кбайт
Энергонезависимая память EEPROM 1 Кбайт
Тактовая частота 16 МГц

LCD дисплей 16×2

LCD дисплей 16×2 – это широко используемый во встраиваемых приложениях дисплей. Ниже приведено краткое описание выводов и работы LCD дисплея. В нем используется два важных регистра. Это регистр данных и регистр команд. Регистр команд используется для отправки таких команд как очистка дисплея, перемещение курсора и так далее. Регистр данных используется для отправки данных, которые должны быть отображены на LCD дисплее. Ниже приведена таблица описания выводов символьного LCD дисплея 16×2.

Назначение выводов LCD дисплея на HD44780

Номер вывода Обозначение Вход/выход Назначение вывода
1 Vss Земля
2 Vdd Питание +5В
3 Vee Средний вывод потенциометра (для регулировки контрастности)
4 RS вход Выбор регистра (RS=0 для регистра команд, RS=1 для регистра данных)
5 RW вход Чтение/Запись (RW=0 для записи, RW=1 для чтения)
6 E вход/выход Включение
7 D0 вход/выход 8-разрядная шина данных (младший значащий бит)
8 D1 вход/выход 8-разрядная шина данных
9 D2 вход/выход 8-разрядная шина данных
10 D3 вход/выход 8-разрядная шина данных
11 D4 вход/выход 8-разрядная шина данных
12 D5 вход/выход 8-разрядная шина данных
13 D6 вход/выход 8-разрядная шина данных
14 D7 вход/выход 8-разрядная шина данных (старший значащий бит)
15 A +4.2–5 В для подсветки
16 K земля

Концепция цветового кода резисторов

Чтобы определить сопротивление резистора, мы можем использовать следующую формулу:

\(R = AB \cdot 10^C \pm T\%\)

где

  • A – значение для цвета первой полосы
  • B – значение для цвета второй полосы
  • C – значение для цвета третьей полосы
  • T – значение для цвета четвертой полосы

Таблица ниже показывает цветовой код резисторов.

Цветовая маркировка резисторов

Цвет Числовое значение кода Степень десяти (10C) Точность (T)
черный 0 100
коричневый 1 101 ± 1%
красный 2 102 ± 2%
оранжевый 3 103
желтый 4 104
зеленый 5 105
синий 6 106
фиолетовый 7 107
серый 8 108
белый 9 109
золотой 10-1 ± 5%
серебряный 10-2 ± 10%
нет полосы ± 20%

Например, если цветовые коды на резисторе будут коричневый – зеленый – красный – серебряный, то номинал резистора рассчитывается следующим образом:

коричневый = 1 зеленый = 5 красный = 2 серебряный = ±10%

Первые три полосы соответствуют R = AB*10C

\(R = 15 \cdot 10^{+2}\)

R = 1500 Ом

Четвертая полоса указывает на точность ±10%

10% от 1500 = 150 Для +10%, значение составляет 1500 + 150 = 1650 Ом Для -10%, значение составляет 1500 — 150 = 1350 Ом

Таким образом, сопротивление реального резистора может быть где-то между 1350 Ом и 1650 Ом.

Расчет сопротивления с помощью измерителя сопротивления на Arduino

Работа измерителя сопротивлений довольно проста и может быть объяснена с помощью формулы для простого резисторного делителя напряжения, который показан на схеме измерителя сопротивления (рисунок выше).

Выходное напряжение делителя напряжения из резисторов R1 и R2 составляет

\

Из этой формулы мы можем вывести R2:

\

где

  • R1 – известное сопротивление;
  • R2 – неизвестное сопротивление;
  • Vвх – напряжение, создаваемое на выводе 5V Arduino;
  • Vвых – напряжение на резисторе R2 относительно земли.

Примечание: значение известного резистора (R1) выбрано 3,3 кОм, но пользователи могут заменить его резистором с другим номиналом.

Измеритель сопротивления на Arduino в действии

Поэтому, если мы получим значение напряжения на неизвестном сопротивлении (Vвых), мы сможем легко рассчитать неизвестное сопротивление R2. В данном случае мы считывали значение напряжения Vвых, используя аналоговый вывод A0 (смотрите принципиальную схему), и преобразовывали эти цифровые значения в напряжение, как описано в приведенном ниже коде.

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

Объяснение кода

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

В данном фрагменте кода мы собираемся определить выводы, к которым на Arduino подключен LCD дисплей 16×2. Вывод RS LCD дисплея подключен к цифровому выводу 2 Arduino. Вывод включения LCD дисплея подключен к цифровому выводу 3 Arduino. Выводы данных (D4-D7) LCD дисплея подключены к цифровым выводам 4, 5, 6 и 7 Arduino.

LiquidCrystal lcd(2,3,4,5,6,7); //rs,e,d4,d5,d6,d7

В этом фрагменте кода мы определяем некоторые переменные, которые используются в программе.

  • Vin – это напряжение, обеспечиваемое на выводе 5V Arduino;
  • Vout – это напряжение на резисторе R2 относительно земли;
  • R1 – значение известного сопротивления;
  • R2 – значение неизвестного сопротивления.

int Vin=5; // напряжение на выводе 5V arduino float Vout=0; // напряжение на выводе A0 arduino float R1=3300; // значение известного сопротивления float R2=0; // значение неизвестного сопротивления

В этом фрагменте кода мы собираемся инициализировать LCD дисплей 16×2. На LCD дисплей передаются команды таких настроек, как очистка дисплея, отображение и мигание курсора и так далее.

lcd.begin(16,2);

В этом фрагменте кода аналоговое напряжение на резисторе R2 (вывод A0) преобразуется в цифровое значение (от 0 до 1023) и сохраняется в переменной.

a2d_data = analogRead(A0);

В этом фрагменте кода цифровое значение (от 0 до 1023) преобразуется в значение напряжения для будущих расчетов.

buffer=a2d_data*Vin; Vout=(buffer)/1024.0;

В следующем фрагменте кода с помощью процедуры, объясненной ранее, рассчитывается реальное значение неизвестного сопротивления.

buffer=Vout/(Vin-Vout); R2=R1*buffer;

В следующем фрагменте значение неизвестного сопротивления выводится на LCD дисплей.

lcd.setCursor(4,0); lcd.print(«ohm meter»); lcd.setCursor(0,1); lcd.print(«R (ohm) = «); lcd.print(R2);

Так легко с помощью Arduino мы рассчитали сопротивление неизвестного резистора.

Полный код программы

#include<LiquidCrystal.h> LiquidCrystal lcd(2,3,4,5,6,7); //rs,e,d4,d5,d6,d7 int Vin=5; // напряжение на выводе 5V arduino float Vout=0; // напряжение на выводе A0 arduino float R1=3300; // значение известного сопротивления float R2=0; // значение неизвестного сопротивления int a2d_data=0; float buffer=0; void setup() { lcd.begin(16,2); } void loop() { a2d_data=analogRead(A0); if(a2d_data) { buffer=a2d_data*Vin; Vout=(buffer)/1024.0; buffer=Vout/(Vin-Vout); R2=R1*buffer; lcd.setCursor(4,0); lcd.print(«ohm meter»); lcd.setCursor(0,1); lcd.print(«R (ohm) = «); lcd.print(R2); delay(1000); } }

Видео

Теги

ArduinoArduino UnoИзмерениеИзмеритель сопротивленияСопротивление Сохранить или поделиться

Скетч для измерения сопротивления, и что с ним можно сделать


Автор Instructables под ником CreativeStuff рассказывает, как реализовать на Arduino простейший омметр. Для этого он берёт макетную плату типа breadboard:

Собственно Arduino:

Дисплей на HD44780 (КБ1013ВГ6):

Перемычки «дюпон» или самодельные:

Переменный резистор на 10 кОм с напаянными тонкими жёсткими выводами (для регулировки констрастности изображения на дисплее):

Ничего не напоминает? Правильно, всё новое — хорошо забытое старое. Знатоки вспомнят, что это и где:

Постоянный резистор на 470 Ом:


И всё это соединяет по такой схеме:
Поскольку схемы, составленные в программе Fritzing, не очень информативны, мастер составляет расшифровку:
Вывод дисплея 1 — общий провод
Вывод дисплея 2 — плюс питания
Вывод дисплея 3 — подвижный контакт переменного резистора
Вывод дисплея 4 — вывод D12 Arduino
Вывод дисплея 5 — общий провод
Вывод дисплея 6 —вывод D11 Arduino
Выводы дисплея 7, 8, 9, 10 ни с чем не соединены
Вывод диспеля 11 — вывод D5 Arduino
Вывод дисплея 12 — вывод D4 Arduino
Вывод дисплея 13 — вывод D3 Arduino
Вывод дисплея 14 — вывод D2 Arduino
Вывод дисплея 15 — плюс питания
Вывод дисплея 16 — общий провод
При повторении конструкции необходимо изучить даташит на дисплей, чтобы выяснить, не отличается ли его цоколёвка от стандартной.
Один из неподвижных контактов переменного резистора мастер соединяет с плюсом питания, второй — с общим проводом. Из образцового и проверяемого резистора составляет делитель напряжения: проверяемый резистор одним выводом к плюсу питания, образцовый — одним выводом к общему проводу. Оставшиеся незанятыми выводы обоих резисторов соединяет вместе и подключает к выводу A0 Arduino. Заливает скетч:
#include <LiquidCrystal.h> //LiquidCrystal(rs, sc, d4, d5, d6, d7) LiquidCrystal lcd(12, 11, 5, 4, 3, 2); const int analogPin = 0; int analogval = 0; int vin = 5; float buff = 0; float vout = 0; float R1 = 0; float R2 = 470; void setup() { lcd.begin(16, 2); } void loop() { analogval = analogRead(analogPin); if (analogval) { buff = analogval * vin; vout = (buff) / 1024.0; if (vout > 0.9) { buff = (vin / vout) — 1; R1 = R2 * buff; lcd.setCursor(0, 0); lcd.print(» -Resistance-«); lcd.setCursor(0, 1); if ((R1) > 999) { lcd.print(» «); lcd.print(R1 / 1000); lcd.print(«K ohm»); } else { lcd.print(» «); lcd.print(round(R1)); lcd.print(» ohm»); } delay(1000); lcd.clear(); } else { lcd.setCursor(0, 0); lcd.print(«Insert resistor»); lcd.setCursor(0, 1); } } }
Сопротивление образцового резистора, а также напряжение питания рекомендуется измерить поточнее (конечно, при измерении образцовый резистор надо временно извлечь), а затем внести результаты измерений в соответствующие строки в начале скетча. Источник питания взять с хорошей стабилизацией выходного напряжения. Программа вычисляет сопротивление по формуле:
R2 = Vout * R1 / (Vin – Vout),
выведенной из формулы:
Vout = Vin * R2 / (R1 + R2),
где R1 — образцовое сопротивление, R2 — измеряемое, Vin — напряжение питания, Vout — напряжение на средней точке делителя.
Остаётся удалить breadboard, выполнить все соединения пайкой и перенести самоделку в корпус. Но в таком виде она малопрактична, так как дублирует функцию омметра, имеющуюся в мультиметре. Переделав скетч и применив прецизионные источник питания и образцовый резистор, можно применить конструкцию, например, для сортировки резисторов по точности на их производстве. Чтобы при подключении резистора на экране дисплея сразу появлялась информация о том, к какой из пяти групп отнести компонент: 1, 2, 5, 10 или 20%. Доставка новых самоделок на почту

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

*Заполняя форму вы соглашаетесь на обработку персональных данных

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

В уроке научимся работать с аналоговыми входами Ардуино.

Предыдущий урок Список уроков Следующий урок

Аналоговые входы платы Ардуино.

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

Эти выводы имеют номера от 14 до 19. Изначально они настроены как аналоговые входы, и обращение к ним можно производить через имена A0-A5. В любой момент их можно настроить на режим дискретных выходов.

Чтобы вернуть в режим аналогового входа:

pinMode(A3, INPUT); // установка режима аналогового входа для A3

Аналоговые входы и подтягивающие резисторы.

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

digitalWrite(A3, HIGH); // включить подтягивающий резистор к входу A3

Команду необходимо применять к выводу настроенному в режиме входа.

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

Аналого-цифровой преобразователь платы Ардуино.

Собственно измерение напряжение на входах производится аналого-цифровым преобразователем (АЦП) с коммутатором на 6 каналов. АЦП имеет разрешение 10 бит, что соответствует коду на выходе преобразователя 0…1023. Погрешность измерения не более 2 единиц младшего разряда.

Для сохранения максимальной точности (10 разрядов) необходимо, чтобы внутреннее сопротивление источника сигнала не превышало 10 кОм. Это требование особенно важно при использовании резисторных делителей, подключенных к аналоговым входам платы. Сопротивление резисторов делителей не может быть слишком большим.

Программные функции аналогового ввода.

int analogRead(port)

Считывает значение напряжения на указанном аналоговом входе. Входное напряжение диапазона от 0 до уровня источника опорного напряжения (часто 5 В) преобразовывает в код от 0 до 1023.

При опорном напряжении равном 5 В разрешающая способность составляет 5 В / 1024 = 4,88 мВ.

Занимает на преобразование время примерно 100 мкс.

int inputCod; // код входного напряжения
float inputVoltage; // входное напряжение в В

inputCod= analogRead(A3); // чтение напряжения на входе A3
inputVoltage= ( (float)inputCod * 5. / 1024. ); // пересчет кода в напряжение (В)

void analogReference(type)

Задает опорное напряжение для АЦП. Оно определяет максимальное значение напряжения на аналоговом входе, которое АЦП может корректно преобразовать. Величина опорного напряжения также определяет коэффициент пересчета кода в напряжение:

Напряжение на входе = код АЦП * опорное напряжение / 1024.

Аргумент type может принимать следующие значения:

  • DEFAULT – опорное напряжение равно напряжению питания контроллера ( 5 В или 3,3 В). Для Arduino UNO R3 – 5 В.
  • INTERNAL – внутреннее опорное напряжение 1,1 В для плат с контроллерами ATmega168 и ATmega328, для ATmega8 – 2,56 В.
  • INTERNAL1V1 – внутреннее опорное напряжение 1,1 В для контроллеров Arduino Mega.
  • INTERNAL2V56 – внутреннее опорное напряжение 2,56 В для контроллеров Arduino Mega.
  • EXTERNAL – внешний источник опорного напряжения, подключается к входу AREF.

analogReference(INTERNAL); // опорное напряжение равно 1,1 В

Рекомендуется внешний источник опорного напряжения подключать через токоограничительный резистор 5 кОм.

Двухканальный вольтметр на Ардуино.

В качестве примера использования функций аналогового ввода создадим проект простого цифрового вольтметра на Ардуино. Устройство должно измерять напряжения на двух аналоговых входах платы, и передавать измеренные значения на компьютер по последовательному порту. На примере этого проекта я покажу принципы создания простых систем измерения и сбора информации.

Решим, что вольтметр должен измерять напряжение в пределах не меньше 0…20 В и разработаем схему подключения входов вольтметра к плате Arduino UNO.

Если мы зададим опорное напряжение равным 5 В, то аналоговые входы платы будут измерять напряжение в пределах 0…5 В. А нам надо как минимум 0…20 В. Значит надо использовать делитель напряжения.

Напряжение на входе и выходе делителя связаны соотношением:

Uвыхода = ( Uвхода / (R1 + R2 )) * R2

Коэффициент передачи:

K = Uвыхода / Uвхода = R2 / ( R1 + R2 )

Нам необходим коэффициент передачи 1/4 ( 20 В * 1/4 = 5 В).

Для сохранения максимальной точности (10 разрядов) необходимо, чтобы внутреннее сопротивление источника сигнала не превышало 10 кОм. Поэтому выбираем резистор R2 равным 4,22 кОм. Рассчитываем сопротивление резистора R1.

0,25 = 4,22 / ( R1 + 4,22)
R1 = 4,22 / 0.25 – 4,22 = 12,66 кОм

У меня с ближайшим номиналом нашлись резисторы сопротивлением 15 кОм. С резисторами R1 = 15 кОм и R2 = 4,22 :

5 / (4,22 / (15 + 4,22)) = 22,77 В.

Схема вольтметра на базе Ардуино будет выглядит так.

Два делителя напряжения подключены к аналоговым входам A0 и A1. Конденсаторы C1 и C2 вместе с резисторами делителя образуют фильтры нижних частот, которые убирают из сигналов высокочастотные шумы.

Я собрал эту схему на макетной плате.

Первый вход вольтметра я подключил к регулируемому источнику питания, а второй к питанию 3,3 В платы Ардуино. Для контроля напряжения к первому входу я подключил вольтметр. Осталось написать программу.

Программа для измерения напряжения с помощью платы Ардуино.

Алгоритм простой. Надо:

  • с частотой два раза в секунду считывать код АЦП;
  • пересчитывать его в напряжение;
  • посылать измеренные значения по последовательному порту на компьютер;
  • программой монитор порта Arduino IDE отображать полученные значения напряжений на экране компьютера.

Приведу скетч программы сразу полностью.

// программа измерения напряжения
// на аналоговых входах A0 и A1

#include <MsTimer2.h>

int timeCount; // счетчик времени
float u1, u2; // измеренные напряжения

void loop() {

// период 500 мс
if ( timeCount >= MEASURE_PERIOD ) {
timeCount= 0;

// обработка прерывания 1 мс
void timerInterupt() {
timeCount++;
}

Поясню строчку, в которой пересчитывается код АЦП в напряжение:

// чтение кода канала 1 и пересчет в напряжение
u1= ((float)analogRead(A0)) * 5. / 1024. / R2 * (R1 + R2);

  • Считывается код АЦП : analogRead(A0).
  • Явно преобразуется в формат с плавающей запятой: (float).
  • Пересчитывается в напряжение на аналоговом входе: * 5. / 1024. Точка в конце чисел показывает, что это число с плавающей запятой.
  • Учитывается коэффициент передачи делителя: / R2 * (R1 + R2).

Загрузим программу в плату, запустим монитор последовательного порта.

Два бегущих столбика показывают значения измеренных напряжений. Все работает.

Измерение среднего значения сигнала.

Подключим первый канал нашего вольтметра к источнику напряжения с большим уровнем пульсаций. Увидим такую картину на мониторе.

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

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

Решение – сделать несколько частых выборок и усреднить измеренное значение. Для этого:

  • в обработчике прерывания считываем код АЦП и суммируем его с предыдущими выборками;
  • отсчитываем время усреднения (число выборок усреднения);
  • при достижении заданного числа выборок – сохраняем суммарное значение кодов АЦП;
  • для получения среднего значения сумму кодов АЦП делим на число выборок усреднения.

Задача из учебника математики 8 класса. Вот скетч программы, двух канального вольтметра среднего значения.

// программа измерения среднего напряжения
// на аналоговых входах A0 и A1

#include <MsTimer2.h>

int timeCount; // счетчик времени
long sumU1, sumU2; // переменные для суммирования кодов АЦП
long avarageU1, avarageU2; // сумма кодов АЦП (среднее значение * 500)
boolean flagReady; // признак готовности данных измерения

void loop() {

// обработка прерывания 1 мс
void timerInterupt() {

В формулу пересчета кода АЦП в напряжение добавилось /500 – число выборок. Загружаем, запускаем монитор порта (Cntr+Shift+M).

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

Число выборок надо выбирать, учитывая:

  • число выборок определяет время измерения;
  • чем больше число выборок, тем меньше будет влияние помех.

Основным источником помех в аналоговых сигналах является сеть 50 Гц. Поэтому желательно выбирать время усреднения кратное 10 мс – времени полупериода сети частотой 50 Гц.

Оптимизация вычислений.

Вычисления с плавающей запятой просто пожирают ресурсы 8ми разрядного микроконтроллера. Любая операция с плавающей запятой требует денормализацию мантиссы, операцию с фиксированной запятой, нормализацию мантиссы, коррекцию порядка… И все операции с 32 разрядными числами. Поэтому необходимо свести к минимуму употребление вычислений с плавающей запятой. Как это сделать я расскажу в следующих уроках, но давайте хотя бы оптимизируем наши вычисления. Эффект будет значительный.

В нашей программе пересчет кода АЦП в напряжение записан так:

(float)avarageU1 / 500. * 5. / 1024. / R2 * (R1 + R2)

Сколько здесь вычислений, и все с плавающей запятой. А ведь большая часть вычислений – операции с константами. Часть строки:

/ 500. * 5. / 1024. / R2 * (R1 + R2)

мы можем расчитать на калькуляторе и заменить на одну константу. Тогда наши вычисления можно записать так:

(float)avarageU1 * 0.00004447756

Умные компиляторы сами распознают вычисления с константами и рассчитывать их на этапе компиляции. У меня возник вопрос, насколько умный компилятор Андруино. Решил проверить.

Я написал короткую программу. Она выполняет цикл из 10 000 проходов, а затем передает на компьютер время выполнения этих 10 000 циклов. Т.е. она позволяет увидеть время выполнения операций, размещенных в теле цикла.

// проверка оптимизации вычислений

int x= 876;
float y;
unsigned int count;
unsigned long timeCurrent, timePrev;

void setup() {
Serial.begin(9600);
}

В первом варианте, когда в цикле операции с плавающей запятой закомментированы и не выполняются, программа выдала результат 34 мс.

Т.е. 10 000 пустых циклов выполняются за 34 мс.

Затем я открыл строку:

y= (float)x / 500. * 5. / 1024. / 4.22 * (15. + 4.22);

повторяет наши вычисления. Результат 10 000 проходов за 922 мс или

( 922 – 34 ) / 10 000 = 88,8 мкс.

Т.е. эта строка вычислений с плавающей запятой требует на выполнение 89 мкс. Я думал будет больше.

Теперь я закрыл эту строку комментарием и открыл следующую, с умножением на заранее рассчитанную константу:

y= (float)x * 0.00004447756;

Результат 10 000 проходов за 166 мс или

( 166 – 34 ) / 10 000 = 13,2 мкс.

Потрясающий результат. Мы сэкономили 75,6 мкс на одной строке. Выполнили ее почти в 7 раз быстрее. У нас таких строк 2. Но ведь их в программе может быть и гораздо больше.

Вывод – вычисления с константами надо производить самим на калькуляторе и применять в программах как готовые коэффициенты. Компилятор Ардуино их на этапе компиляции не рассчитает. В нашем случае следует сделать так:

#define ADC_U_COEFF 0.00004447756 // коэффициент перевода кода АЦП в напряжение

Serial.print( (float)avarageU1 * ADC_U_COEFF, 2);

Оптимальный по быстродействию вариант – это передать на компьютер код АЦП, а вместе с ним и все вычисления с плавающей запятой. При этом на компьютере принимать данные должна специализированная программа. Монитор порта из Arduino IDE не подойдет.

О других способах оптимизации программ Ардуино я буду рассказывать в будущих уроках по мере необходимости. Но без решения этого вопроса невозможно разрабатывать сложные программы на 8ми разрядном микроконтроллере.

На сайте появился еще один урок (урок 65) посвященный измерению аналоговых сигналов. В нем рассматривается работа АЦП в фоновом режиме.

Digitrode

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

Как измерить сопротивление с помощью Arduino

Сразу следует отметить, что помимо Arduino также нужен один резистор с известным номиналом. Схема очень проста и основана на делителе напряжения, в котором один резистор является известным, а сопротивление другого следует выяснить. Затем на Arduino мы запустим программу, которая будет вычислять сопротивление по закону Ома. Итак, схема омметра на основе Arduino и делителя напряжения выглядит следующим образом:

Код (скетч) для создания простого омметра на основе Aduino представлен ниже:

int analogPin= 0; int raw= 0; int Vin= 5; float Vout= 0; float R1= 1000; float R2= 0; float buffer= 0; void setup() { Serial.begin(9600); } void loop() { raw= analogRead(analogPin); if(raw) { buffer= raw * Vin; Vout= (buffer)/1024.0; buffer= (Vin/Vout) -1; R2= R1 * buffer; Serial.print(«Vout: «); Serial.println(Vout); Serial.print(«R2: «); Serial.println(R2); delay(1000); } }

Введите значение вашего известного резистора (в омах) в строке 5 приведенного выше кода. В данном случае используется известный резистор со значением 1 КОм (1000 Ом). Поэтому строка 5 должна выглядит так: float R1 = 1000. Программа устанавливает аналоговый вывод A0 для считывания напряжения между известным резистором и неизвестным резистором. Вы можете использовать любой другой аналоговый вывод, но просто измените номер линии в строке 1 и соответствующим образом подключите схему. Когда вы откроете последовательный монитор, вы увидите значения сопротивления, выводимые один раз в секунду. Будут два значения: R2 и Vout. R2: сопротивление вашего неизвестного резистора в Ом. Vout: падение напряжения на вашем неизвестном резисторе.

Насколько же будут точными измерения с помощью Arduino? Ниже приведен экран последовательного порта при измерении резистора номиналом 200 Ом.

Значения довольно точны, ошибка составляет всего лишь 1.6%. Но это справедливо только для тех случаев, когда неизвестный резистор не на порядки отличается от известного, чтобы напряжение было не слишком маленьким, и его можно было считать с помощью АЦП Arduino. Но вот какие значения можно получить, если измерять сопротивление резистора номиналом 220 Ком при эталонном резисторе 1 КОм.

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

admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Наверх