Андрей Смирнов
Время чтения: ~12 мин.
Просмотров: 22

Делаем амперметр с использованием Ардуино

—>
—>Главная—> » —>Статьи—> » Мои статьи

Вольт-ампер-energy-метр на Arduino. Часть 2. Амперметр

Исходные данные и доработка

Итак к этому момент у нас есть вольтметр постоянного напряжения с пределом 0..20в  (смотрите предыдущую часть). Теперь мы добавляем к нему амперметр 0..5а. Для этого немного модифицируем схему — она станет проходной, то есть имеет как вход так и выход.

s17384038.jpg

Часть касающуюся отображения на LCD я убрал — она не будет меняться. Впринципе основной новый элемент — шунт Rx на 0.1 Ом. Цепочка R1-C1-VD1 служит для защиты аналогового входа. Такую же имеет смысл поставить и по входу A0. Поскольку мы предполагаем достаточно большие токи, есть требования к монтажу — силовые линии должны быть выполнены достаточно толстым проводом и соединяться с выводами шунта непосредственно (проще говоря, припаяны), иначе показания будут далеки от реальности. Есть так же замечание по току — впринципе опорное напряжение 1.1в позволяет регистрировать на шунте 0.1 Ом ток до 11 ампер с точностью немного хуже 0.01а, но при падении на Rх такого напряжения выделяемая мощность превысит 10 Вт, что совсем не весело. Для решения проблемы можно было бы использовать усилитель с коэффициентом усиления 11 на качественном ОУ  и шунт на 10 мОм (0.01Ом). Но пока мы не будем усложнять себе жизнь и просто ограничимся в токе до 5а (при этом мощность Rx можно выбрать порядка 3-5 Вт).

На этом этапе меня ждал сюрприз — оказалось что АЦП контроллера имеет достаточно большое смешение нуля — около -3мВ. То есть АЦП просто не видит сигналы менее 3мВ, а сигналы чуть большего уровня видны с характерной неточностью -3мВ, что портит линейность в начале диапазона. Беглый поиск не дал явных ссылок на такую проблему (смещение нуля это нормально, но оно должно быть существенно меньше), поэтому вполне возможно это проблема конкретного экземпляра Atmega 328. Решение я выбрал двоякое — по напряжению — программную ступеньку в начале диапазона (отображение начинается с 0.06 вольт), по току — подтягивающий резистор на шину 5в. Резистор обозначен пунктиром.

Исходный код

Полную версию этого вольт-ампер-метра (в варианте с I2C) можно скачать по ссылке в конце статье. Далее я покажу изменения в исходном коде.  Добавилось чтение аналогового входа A1 с таким же усреднением как и для вольтметра. По сути это тот же вольтметр, только без делителя, а амперы мы получаем по формуле Ома: I = U/Rx (например, если падение напряжения на Rx = 0.01 В, то ток равен 0.1А). Также я ввел константу усиления по току AmpMult — на будущее. Константу AmpRx с сопротивлением шунта вероятно придется подобрать — учесть неточность резистора шунта. Ну и раз уже это это вольт-ампер-метр и на дисплее 1602 еще осталось место, то осталось вывести текущую потребляемую мощность в ваттах, получив не сложный дополнительный функционал.

 .... // Аналоговый вход #define PIN_VOLT A0 #define PIN_AMP A1 // Внутреннее опорное напряжение (подобрать) const float VRef = 1.10; // Коэффициент входного резистивного делителя (Rh + Rl) / Rl. IN <-[ Rh ]--(analogInPin)--[ Rl ]--|GND const float VoltMult = (180.0 + 10.0) / 10.0; // Усиление по току const float AmpMult = 1.0; // Сопротивление шунта в омах (подобать) const float AmpRx = 0.098;  .... void loop() {  unsigned long CalcStart = millis();  float InVolt = 0;  float InAmp = 0;  int ReadCnt = 0;  // Чтение из порта с усреднением  while ((millis() - CalcStart) < REFRESH_TIME) {  InVolt += analogRead(PIN_VOLT);  InAmp += analogRead(PIN_AMP);  ReadCnt++;  }  InVolt = InVolt / ReadCnt;  InAmp = InAmp / ReadCnt;  // Компенсация смещения 0 АЦП (подобрать)  if (InVolt > 0.2) InVolt += 3;  // Перевод в вольты (In: 0..1023 -> (0..VRef) scaled by Mult)  float Volt = InVolt * VoltMult * VRef / 1023;  float Amp = InAmp * VRef / AmpMult / AmpRx / 1023 ;  // Для учета падения на шунте раскомментировать 2 строки  //float RxVolt = InAmp * VRef / 1023 / AmpMult;  // Volt -= RxVolt;  float Watt = Volt * Amp;  // Вывод данных  lcd.setCursor (8, 0);  lcd.print(Watt);  lcd.print("W ");  lcd.setCursor (0, 1);  lcd.print(Volt);  lcd.print("V ");  lcd.setCursor (8, 1);  lcd.print(Amp);  lcd.print("A "); } 

s69521693.jpg

Ссылки

Железо

  • Arduino Pro Mini
  • Дисплей 1602 и Модуль I2C
  • Макетные платы
  • Комплект резисторов
  • Резисторы на 0.1 ом (в качестве шунта)
  • USB-TTL конвертер 
  • Готовый многофункциональный вольт-ампер-метр
  • Отличный мультиметр UNI-T UT-61E (не дешевый)
—>Категория—>:Мои статьи | —>Добавил—>:alexeevd (07.02.2016)
—>Просмотров—>:23881 | | |
—>Всего комментариев—>: 24 12»
<label>Порядок вывода комментариев:</label>
24Евнений   (05.12.2019 10:59) [Материал] Здравствуйте добавьте в скэтч функцию на определенный пин включение по заданному напряжению реле,и выключение реле при другом напряжении, заранее спасибо.
23jambrail   (10.06.2019 07:19) [Материал]
22mrsamtakoy   (02.04.2019 19:25) [Материал]
21Александр Алекснадрович   (03.09.2018 14:31) [Материал] На IN мы подключаем нагрузку, которая общитывается МК и этим же МК отправляется на ЛСД-дисплей. Что такое OUT? Что туда отправляется?
20Дмитрий   (12.06.2018 19:35) [Материал]
19Дмитрий   (17.04.2018 10:34) [Материал] Доброе время суток, а не подскажете чайнику, куда какие контакты подключаются? Исходя из первой части понятно что IN это на клеммы АКБ, а Out’ы куда?
17Павел   (20.03.2017 22:10) [Материал]
18alexeevd   (25.03.2017 17:56) [Материал]
14Николай   (03.03.2017 12:41) [Материал]
15alexeevd   (04.03.2017 21:34) [Материал]
16alexeevd   (04.03.2017 21:43) [Материал]
13Владимир   (05.02.2017 12:18) [Материал] Интересует измерени тока заряда — разряда аккумулятора
11Владимир   (04.02.2017 16:34) [Материал] Можно ли по этому принципу измерять ток в двух направлениях?
12alexeevd   (05.02.2017 11:46) [Материал]
1-1011-16

—>

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

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

ampermetr.jpg

Введение

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

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

V = IR

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

I = V / R

Поэтому, чтобы узнать ток, нам нужны некоторые данные:

  • напряжение,
  • сопротивление.

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

Как и на приведенном выше рисунке, мы должны найти два напряжения, протекающие через резистор. Разница между напряжениями (V1-V2) на двух концах резисторов дает нам падение напряжения на резисторе (R), и мы делим падение напряжения на величину резистора, мы получаем ток (I) через устройство. Вот как мы можем вычислить текущее значение, проходящее через него.

Необходимые инструменты и периферия для реализации проекта «Амперметр» на базе микроконтроллера Arduino

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

  1. База, в которой будет находиться весь программный код. Ею выступит стандартная Arduino nano (можно и Uno), выбранная, не в последнюю очередь, благодаря своему размеру. Раз уж мы создаём что-то своё, почему не собрать измеритель силы тока, который вы не найдёте в магазине. Останется лишь подобрать соответствующий корпус.
  2. Оболочка, в которую конечный результат будет всунут. Здесь всё зависит исключительно от вас. Кому-то привычнее видеть голые провода и платы, а кто-то хочет эстетики. Использовать можно как уже готовые квадратные боксы, в которых останется пропаять пару дырочек, так и специальные, вырезанные на 3-д принтере корпуса, если он у вас есть. Всё зависит исключительно от вашей фантазии.
  3. Чтобы амперметр на Аrduino не был бесполезным набором проводов и выводил какую-то информацию, нам потребуется экран. Можете взять любой простой LCD экранный шилд, который найдёте у себя на балконе. А для особо заинтересованных в программной части подойдёт набор диодов, которые необходимо будет подключить комбинированным способом. Мы рассмотрим вариант с шилдом, так как он проще в реализации.
  4. Несколько резисторов, один на 56 Ом, второй на 100 кОм, ведь нам нужно быть готовым к любому току, который подадут на наше устройство. Вместе с ними стоит прикупить и конденсатор на 10 мКф.
  5. В зависимости от ваших потребностей, подберите датчик тока. Они бывают под различные номинальные и максимальные измерения, мы же возьмём простейший CT – Talema AC103, на 30 и 75 А соответственно. Его достоинством является небольшая стоимость и испытанное не одним проектом качество.

Здесь у любого инженера закрадётся вопрос, а что же собой представляет этот датчик тока? На деле, такой модуль – это просто магнитопровод с небольшим зазором и обмоткой для компенсации. Всё это можно было бы собрать самостоятельно, если бы не встроенные датчики Холла и плата для управления.

  1. Место или специальный стол для пайки.
  2. Припой и олово.
  3. Паяльник.
  4. Плоскогубцы.

Всё это – стандартный набор инструментов для соединения Ардуино со вспомогательными модулями и датчиками.

Схема подключения и алгоритм работы в проекте «Амперметр» на базе МК Arduino

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

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

Также не забудьте откалибровать нагрузочный резистор, для этого подойдёт специальная формула расчёта:

R=N/I ,

в которой N – является опорным напряжением платы, а силу тока мы подставляем такую, какую потребляет ваша плата в активном режиме работы. Это позволит скомпенсировать все возможные отклонения и добиться максимально точных показаний, что полезно при измерении мощностей аккумуляторов и различных устройств.

Ближе всего при подстановке чисел, в нашем случае, окажется резистор на 56 Ом, его мы и возьмём. А вот, чтобы делить основное напряжение, подаваемое на питание платы, необходимо будет поставить пару одинаковых резисторов.

Кодирование МК Arduino для работы амперметра

Это самый важный момент, ведь без программного кода собранная конструкция останется просто грудой металлолома. Вы можете воспользоваться уже готовыми библиотеками, но в них есть весомый недостаток – придётся долго искать ПО, подходящее под ваши модули и резисторы. С другой стороны, для тех, кто никогда не занимался программированием и не знает даже основ алгоритмизации – это оптимальное решение.

Но можно и самостоятельно написать небольшую программку на С++, в ней будет пара функций для вывода на экран силы тока и вспомогательных параметров. Вам потребуется подключить библиотеку LiquidCrystal.h к проекту, чтобы код смог обрабатывать сигналы, поступающие с датчика тока.

#include  LiquidCrystal lcd (7,8,9,10,11,12);     void setup() {  // put your setup code here, to run once:  Serial.begin(9600);  lcd.begin(16,2);  lcd.clear();  }     void loop() {  // put your main code here, to run repeatedly:  int voltage_value0 = analogRead(A0);  int voltage_value1 = analogRead(A1);      int subraction_value =(voltage_value0 - voltage_value1) ;   float temp_val = (subraction_value*0.00488);      float current_value = (temp_val/22);   Serial.print(current_value);   lcd.setCursor(0,0);   lcd.print("current value=");   lcd.setCursor(0,1);   lcd.print (current_value);   lcd.print("A");   delay(1000);  }

После написания кода остаётся лишь калибровка получившейся установки, и здесь всё лучше делать при известной заранее нагрузке и мощности тока. Можете воспользоваться заготовленным амперметром или использовать простые лампы накаливания. Достаточно взять лампочку на 100 Ватт и воспользоваться школьной программой физики, чтобы рассчитать необходимую силу тока.

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

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

Используемые источники:

  • http://alexeevd.narod.ru/publ/arduino_vametr/1-1-0-9
  • https://arduinoplus.ru/delaem-ampermetr-arduino/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации