Перейти к содержимому

04s.ru

Только полезные вещи…

Меню
  • Главная
  • Объявления
    • Добавить объявления
    • Мои объявления
  • Полезные ресурсы
    • Другое
  • Генератор QR
  • Карта сайта
  • Контакты
Меню

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

Опубликовано в 05.02.202023.12.2021 от Lis

Идея устройства для измерения напряжения, тока, емкости, разряда, а может и заряда возникла давно и не только у меня. Можно найти немало игрушек под названием USB Tester (Doctor) для тестирования различных устройств с USB. Мне же интересно несколько более универсальное устройство, независимое от интерфейса, а просто рассчитанное на определенные напряжения и токи. Например, 0 — 20.00в, 0 — 5.00а, 0 — 99.99Ач. Что касается функций, то я вижу так

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

Разработка

Для реализации расчетов и измерений нам понадобится контроллер. Я вспомнил эту идею в рамках знакомства с Arduino, поэтому контроллером будет простая популярная Atmega328 и программироваться она будет в среде Arduino. С инженерной точки зрения выбор наверно не самый хороший — контроллер для задачи слегка жирноват, а его АЦП не назовешь измерительными, но… будем пробовать.

  • Паять в этом проекте много не будем. В качестве основы возьмем готовый модуль Arduino Pro Mini, благо китайцы готовы их поставлять по $1.5 в розницу.
  • В качестве устройства отображения будет выступать дисплей 1602 — еще $1.5. У меня вариант с интерфейсным модулем I2C, но в этом проекте он не сильно нужен ($0.7).
  • Для разработки нам понадобиться макетная плата. В моем случае это небольшая BreadBoard за $1.
  • Разумеется понадобятся провода и некоторое количество резисторов разного номинала. Для дисплея 1602 без I2C нужен также подбор контрастности — делается переменным резистором на 2 — 20 кОм.
  • Для реализации амперметра понадобится шунт. В первом приближении им может быть резистор 0.1 Ом, 5 Вт.
  • Для реализации автоматики отключения понадобится реле с контактами рассчитанными на максимальный ток устройства и напряжением равным напряжению питания. Для управления реле нужен npn транзистор и защитный диод.
  • Устройство будет питаться от внешнего источника питания, очевидно, что не менее 5 в. Если питание будет сильно варьироваться, то так же потребуется интегральный стабилизатор типа 7805 — он и определит напряжение реле.
  • В случае Arduino Pro Mini для заливки прошивки потребуется USB-TTL конвертер.
  • Для наладки понадобится мультиметр.

Вольтметр

Я реализую простой вольтметр с одним диапазоном примерно 0 — 20в. Это замечанием важно, тк АЦП нашего контроллера имеет разрядность 10 бит (1024 дискретных значения), поэтому погрешность составит не менее 0.02 в (20 / 1024). Для реализации железно нам нужен аналоговый вход контроллера, делитель из пары резисторов и какой-нибудь вывод (дисплей в законченном варианте, для отладки можно последовательный порт).

Принцип измерения АЦП состоит в сравнении напряжения на аналоговом входе с опорным VRef. Выход АЦП всегда целый — 0 соответствует 0в, 1023 соответствует напряжению VRef. Измерение реализовано путем серии последовательных чтений напряжения и усреднения по периоду между обновлениями значения на экране. Выбор опорного напряжения важен, поскольку по умолчанию оно равно напряжению питания, которое может быть не стабильно. Это нам совершенно не подходит — за основу мы будем брать стабильный внутренний опорный источник напряжением 1.1в, инициализируя его вызовом analogReference(INTERNAL). Затем мы откалибруем его значение по показаниям мультиметра.

На схеме слева — вариант с прямым управлением дисплея (он просто управляется — смотрите стандартный скетч LiquidCrystal\HelloWorld). Справа — вариант с I2C, который я и буду использовать дальше. I2C позволяет сэкономить на проводах (коих в обычном варианте — 10, не считая подсветки). Но при этом необходим дополнительный модуль и более сложная инициализация. В любом случае, отображение символов на модуле надо сначала проверить и настроить контрастность — для этого надо просто вывести после инициализации любой текст. Контрастность настраивается резистором R1, либо аналогичным резистором I2C модуля.

Вход представляет собой делитель 1:19, который позволяет при Vref = 1.1 получить максимальное напряжение около 20в (обычно параллельно входу ставят конденсатор + стабилитрон для защиты, но нам пока это не важно). Резисторы имеют разброс, да и опорное Vref контроллера тоже, поэтому после сборки надо измерить напряжение (хотя бы питания) параллельно нашим устройством и эталонным мультиметром и подобрать Vref в коде до совпадения показания. Так же стоить отметить, что любой АЦП имеет напряжение смещения нуля (которое портит показания в начале диапазона), но мы пока не будем в это углубляться.

Также важным будет разделение питающей и измерительной «земли». Наш АЦП имеет разрешение чуть хуже 1мВ, что может создавать проблемы при неправильной разводке, особенно на макете. Поскольку разводка платы модуля уже сделана и нам остается только выбор пинов. «Земляных» пинов у модуля несколько, поэтому мы должны сделать так, чтобы питание в модуль заходило по одной «земле», а измерения по другой. Фактически для изменений я всегда использую «земляной» пин ближайший к аналоговым входам.

Для управление I2C используется вариант библиотеки LiquidCrystal_I2C — в моем случае указывается специфическая распиновка модуля I2C (китайцы производят модули с отличающимся управлением). Так же отмечу, что I2C в Arduino предполагает использование именно пинов A4, A5 — на плате Pro Mini они находятся не с краю, что неудобно для макетирования на BreadBoard.

Исходный код

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Простой вольтметр с i2c дисплеем 1602. V 16.11

// Настройки i2c дисплея 1602 с нестандартной распиновкой
#define LCD_I2C_ADDR    0x27 
#define BACKLIGHT     3      
#define LCD_EN  2            
#define LCD_RW  1            
#define LCD_RS  0            
#define LCD_D4  4            
#define LCD_D5  5            
#define LCD_D6  6            
#define LCD_D7  7            
 
LiquidCrystal_I2C lcd(LCD_I2C_ADDR,LCD_EN,LCD_RW,LCD_RS,LCD_D4,LCD_D5,LCD_D6,LCD_D7);

// Время обновления показаний, мс (200-2000)
#define REFRESH_TIME  330

// Аналоговй вход
#define PIN_VOLT A0
// Внутреннее опорное напряжение (подобрать)
const float VRef = 1.10;
// Коэффициент входного резистивного делителя (Rh + Rl) / Rl. IN <-[ Rh ]--(analogInPin)--[ Rl ]--|GND
const float VoltMult = (180.0 + 10.0) / 10.0;

float InVolt, Volt;

void setup() {
  analogReference(INTERNAL);
  // Инициализация дисплея 
  lcd.begin (16, 2);
  lcd.setBacklightPin(BACKLIGHT, POSITIVE);
  lcd.setBacklight(HIGH); // включить подсветку
  lcd.clear(); // очистить дисплей
  lcd.print("Voltage");
}

void loop() {
  unsigned long CalcStart = millis();
  int ReadCnt = 0;
  InVolt = 0;
  // Чтение из порта с усреднением
  while ((millis() - CalcStart) < REFRESH_TIME) {
    InVolt += analogRead(PIN_VOLT);
    ReadCnt++;
  }
  InVolt = InVolt / ReadCnt;
  // Смещение 0 для конкретного ADC (подобрать или отключить)
  if (InVolt > 0.2) InVolt += 3;
  // Перевод в вольты (Value: 0..1023 -> (0..VRef) scaled by Mult)
  Volt = InVolt * VoltMult * VRef / 1023;
  // Вывод данных
  lcd.setCursor (0, 1);
  lcd.print(Volt);
  lcd.print("V ");
}
5/5 - (1 голос)
Просмотров: 8 363


Место для продажи

2 комментария для “Вольт-ампер-energy-метр на Arduino. Часть 1. Вольтметр”

  1. Electrobit:
    23.12.2021 в 17:11

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

    Ответить
    1. Lis:
      23.12.2021 в 17:28

      arduino.cc/reference/en/language/functions/communication/serial/print/

      Ответить

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

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

Свежие записи

  • Авто выключатель для мультиметра
  • Индикатор разряда аккумулятора
  • Схема индикатора заряда аккумулятора на светодиодах
  • Linux mint восстановление системы с помощью LiveCD/USB
  • Схема стабилизатора тока на LM358

Популярные записи

  • Металлоискатель пират своими руками подробная инструкция (67 733)
  • Авторегулировка диаметра филамента (66 023)
  • A4988 и Arduino (18 851)
  • DT9205a — ремонт мультиметра (15 637)
  • ШИМ-регулятор 220 В ( IGBT ) (14 160)
  • Пробник для проверки оптопар (13 626)
  • ШИМ-регулятор на Arduino (12 035)
  • Шим регулятор на NE555 (11 082)
  • Схема стабилизатора тока на LM358 (10 775)
  • Linux mint восстановление системы с помощью LiveCD/USB (10 433)

Разделы

3D (1) Android (1) Arduino (14) CCleaner (1) Controller (1) DT9205a (2) LG (1) Linux (3) LM339 (1) LM358 (1) NE555 (9) NTC 100K (2) Power Bank (2) Server (4) SSD (1) SSL (1) Ubuntu (3) USB (2) VPS (1) Windows (8) АКБ (6) Авто (18) Асинхронный (3) Вирусы (1) Датчик (2) Двигатель (5) Индикатор (2) Металлоискатель (2) Мультиметр (2) Оптопара (1) Пластик (2) Полезное (18) Примочка (1) Разное (18) Реле (1) Сабвуфер (2) Симистор (1) Система (12) Схемы (36) Телевизоры (1) Телефон (1) Термистор (2) Тиристор (1) Тюнинг (5) Электроника (57)

Коментарии

  • Lis к записи ШИМ-регулятор 220 В ( IGBT )
  • Hdns Klos к записи ШИМ-регулятор 220 В ( IGBT )
  • Lis к записи Схема индикатора заряда аккумулятора на светодиодах
  • Lis к записи Индикатор разряда аккумулятора
  • Lis к записи Авто выключатель для мультиметра

Форма подписки

Подпишитесь на блог и получайте новые статьи!



QR код

QR код

Telegram канал

И смех и Грех — Тут весело и Интересно))
Красиво, но не факт… — Поделки на лазерном гравёре.