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

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

Параметры входных сигналов:
ток I = 25mka — 2a
напряжение U = 0 – 5в
температура t = -30 — +120грС
время задаётся внутренними встроенными кварцевыми часами

Питание:
от источника 12в/0,3а
Iпотребления < 70ma

Конструкция:
Измеритель собран на двух модулях Arduino Nano, связанных по протоколу ModBus, смотри схему. Один Arduino установлен на переходную плату с клеммными колодками. Модули подключены через разъёмы. Провода и сами модули изолированы от замыкания термо-кембриком.

Входные сигналы подводятся через винтовые клеммы

На лицевой панели жидко-кристаллический индикатор измеряемых параметров и светодиоды индикации переключения диапазона или вне диапазона.

Измеритель собран в корпусе 145х85х40.
Датчик температуры вынесен наружу через разъём. Передача сигнала организована по двухпроводной линии. Подпитывающий резистор в разъёме.

Для удобства программирования USB разъёмы Arduino вынесены наружу.

Схема

Схему можно скачать из файла Измеритель.rar

Два Arduino выбраны по двум причинам: в наличии были Arduino Nano и на одном памяти маловато, и планируется далее добавлять датчики. Кроме того хотелось освоить объединение Arduino, для этого выбран сетевой протокол ModBus. ModBus задаёт один ведущий процессор — Master и несколько ведомых – Slave. В данной работе один Slave, на нём измерение температуры, напряжения и тока. На Master – часы и запись в файл. Flesh память должна быть менее 4Гб и отформатирована в FAT.

Так как планировалось измерять токи от мкА до А, токи измеряются в 4-х диапазонах (см. таблицу Диапазонов), за переходом с одного диапазона на другой следит Arduino Slave, формируя соответствующий код шунта по текущему измеренному току с М1-2. При подходе к границе диапазона, включается следующий диапазон, то есть отключается действующий ключ из Т1-1 —Т2-2 и включается следующий. При этом максимальный шунт = 100ом включен постоянно. Если произошло превышение значения в диапазоне, засвечиваются светодиоды D8, D9.

Разбиение измерения тока на диапазоны
Uвых_макс=5в КусОУ=20 Δ=Iш/1024

Коэффициент усиления операционного усилителя М1-2 установлен = 20 и далее не меняется. (На переднюю панель он смонтирован ошибочно).
Напряжение измеряется через повторитель на ОУ М1-1. Входные цепи ОУ и Arduino защищены диодами (в Arduino стоят стабилитроны, но параметры не знаю, посему лучше перебдеть).

В качестве индикатора выбран LCD1602. Он подключен к Arduino Master. Причем индикатор можно подключать к обеим Arduino просто переключая разъёмы Arduino. (При выключенном питании.) Подключение к Arduino Slave показано пунктиром (что и использовалось при написании программ). При основном подключении (к Master) на LCD1602 можно вывести 4-ре экрана переключая движки микропереключателя п1-п2.

Экран1: сверху служебная информация обмена между Arduino: С- число обменов между Arduino, Е- число ошибок в процессе обмена Sh- №шунта;
внизу день – месяц время.

Экран2: U1, I1, №шунта, (0,00 внизу справа-резерв)

Экран3: U2, температура, (ui- резерв)

Экран4: SD- запись включена, время записи в часах, № строки в файле,
00- состояние диапазона тока1 0-нормально 1-вне диапазона, состояние диапазона напряжения1, зафиксированная мощность внешнего источника

При подключении к Slave – 2 экрана. Переключатель п3 включает запись в Micro Flesh память.
Питание выбрано 12в, чтобы получить линейные характеристики ОУ (избежать завалов по краям диапазона). По этой же причине использовано отрицательное напряжение от формирователя на КР1006ВИ1. Использование генератора от Arduino даёт менее стабильное напряжение. Для формирования питания 5в использован понижающий преобразователь, но можно обойтись без него, подав +12в на входы VIN Arduino Nano.
Совместное программирование Arduino имеет особенности, так как связь с компьютером занята протоколом ModBus. Для загрузки скетча в один из Arduino, на другом нужно включить сигнал сброса RST. Для этого используются перемычки Блок S, Блок M. Или нажатие и удерживание кнопок сброса на модулях Arduino до окончания загрузки, что менее удобно и есть шанс повредить загрузку. Поскольку я планирую наращивать сеё устройство разъёмы USB Arduino я вытащил наружу корпуса.

Транзистор Т5 (FR024N) предполагается использовать для включения/отключения какого либо процесса, например заряда-разряда аккумулятора. Пока он не задействован.

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

Библиотеки и коды программ находятся в файле Izmeritel PRO.rar.
Скетч для мастера ModBus_Master10_SD_T_10_2. Скетч для ведомого ModBus-Slave10_T_UI_10_2. Остальное библиотеки.
Программировал в среде Arduino1.6.0. В ней находятся библиотеки SD, LiquidCrystal, Wire скачивать не надо.

Установка времени в часах осуществляется в Setup так. Задать реальное время и загрузить скетч. Затем закомментировать строки задания даты и времени и снова загрузить скетч.

Результатом работы программы будет индикация времени и даты (часы), тока, напряжения, температуры на LCD1602 и запись этих параметров в файл IZMER1.TXT в Micro Flesh память. В файле будет находится таблица такого вида:

0; 13.04.2019; 00:11:10; Zap(h)=0.05; tc=29.31; U1=1.71; I1=0.00; P1=0.00; U2=0.14; DiaI norma; DiaU norma; C=762
1; 13.04.2019; 00:11:16; Zap(h)=0.05; tc=29.38; U1=1.79; I1=0.00; P1=0.00; U2=0.19; DiaI norma; DiaU norma; C=788
2; 13.04.2019; 00:11:22; Zap(h)=0.05; tc=29.38; U1=1.54; I1=0.00; P1=0.00; U2=0.16; DiaI norma; DiaU norma; C=813
3; 13.04.2019; 00:11:28; Zap(h)=0.05; tc=29.31; U1=1.30; I1=0.00; P1=0.00; U2=0.17; DiaI norma; DiaU norma; C=839
4; 13.04.2019; 00:11:34; Zap(h)=0.05; tc=29.31; U1=1.90; I1=0.00; P1=0.00; U2=0.17; DiaI norma; DiaU norma; C=864
5; 13.04.2019; 00:11:40; Zap(h)=0.05; tc=29.25; U1=1.53; I1=0.00; P1=0.00; U2=0.16; DiaI norma; DiaU norma; C=890
6; 13.04.2019; 00:11:46; Zap(h)=0.05; tc=29.19; U1=2.03; I1=0.00; P1=0.00; U2=0.18; DiaI norma; DiaU norma; C=915
7; 13.04.2019; 00:11:52; Zap(h)=0.05; tc=29.13; U1=1.81; I1=0.00; P1=0.00; U2=0.18; DiaI norma; DiaU norma; C=941
8; 13.04.2019; 00:11:58; Zap(h)=0.05; tc=29.00; U1=1.30; I1=0.00; P1=0.00; U2=0.16; DiaI norma; DiaU norma; C=966
9; 13.04.2019; 00:12:04; Zap(h)=0.07; tc=28.94; U1=1.25; I1=0.00; P1=0.00; U2=0.17; DiaI norma; DiaU norma; C=992
10; 13.04.2019; 00:12:10; Zap(h)=0.07; tc=29.00; U1=1.85; I1=0.00; P1=0.00; U2=0.16; DiaI norma; DiaU norma; C=1017
11; 13.04.2019; 00:12:16; Zap(h)=0.07; tc=29.00; U1=1.21; I1=0.00; P1=0.00; U2=0.18; DiaI norma; DiaU norma; C=1043
12; 13.04.2019; 00:12:23; Zap(h)=0.07; tc=28.94; U1=1.55; I1=0.00; P1=0.00; U2=0.18; DiaI norma; DiaU norma; C=1068
13; 13.04.2019; 00:12:29; Zap(h)=0.07; tc=28.88; U1=1.82; I1=0.00; P1=0.00; U2=0.16; DiaI norma; DiaU norma; C=1094
14; 13.04.2019; 00:12:35; Zap(h)=0.07; tc=28.88; U1=1.30; I1=0.00; P1=0.00; U2=0.18; DiaI norma; DiaU norma; C=1119

где столбцами расположены №п/п; дата; время; время записи в часах; температура; измеряемое напряжение U1; измеряемый ток I1; второе измеряемое напряжение U2; информация о выходе/невыходе за пределы диапазона измерения; служебная информация о количестве обменов между Arduino.

Интервал записи измерений выбран 6 сек, его легко изменить заменив значение константы #define CYCLE_TIME_F 3000 на другое по формуле Тсек=Константа(мс)*2/1000 в Master.
Далее эту таблицу можно представить в виде симпатичных графиков.

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

Источник: usamodelkina.ru

Понравилась статья? Поделиться с друзьями: