Версия 78-15 (схема 15 esp8266)

SH15-ESP8266-INA219-P-180915

13.11.18 Версия 78

Интерфейс облачный, через Народный мониторинг строятся графики в реальном времени с дискретностью 5мин., через Blynk выводятся значения каждую секунду и регулируются изменяемые параметры Ur, KIZ.

Алгоритм адаптивный, без контроля пороговых значений. Дельта — функция от изменения R, с регулируемым коэффициентом: delta = KIZ * Rmin / (Rimp — Rmin);

Вначале разряд постоянным током до касания регулируемого порогового напряжения Ur, каждые 100с измерение R двумя методами (зарядными импульсами и по ГОСТ).

Далее заряд с контролем Дельты и периодическим измерением R двумя методами.

Скетч:


#include <Wire.h>
////
#include <ArduinoOTA.h>
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <BlynkSimpleEsp8266.h>
#define BLYNK_PRINT Serial
#define postingInterval 330000 // интервал между отправками данных в миллисекундах (5 минут)
unsigned long lastConnectionTime = 0; // время последней передачи данных
#define debug true // вывод отладочных сообщений
String Hostname; //имя железки — выглядит как ESPAABBCCDDEEFF т.е. ESP+mac адрес.
char auth[] = » код Blynk «;
char ssid[] = » точка доступа»;
char pass[] = » пароль «;
////
unsigned long tim;
unsigned long t;
unsigned long t2;
unsigned long t0;
unsigned long ti;
unsigned long tp;
unsigned long tr; //время разряда
unsigned long tz; //время заряда
int pin = 16 ; // на затвор мосфета заряд
int pinr = 14 ; // на затвор мосфета разряд
int pinR67 = 14;
int pinR6 = 15;
int pinR24 = 14;
int pinR5 = 15;
int pause = 1 ; //Пауза в мc
float UK = 0; //Контрольное напряжение перед зарядом (НРЦ)
float UK0 = 0;
float UAK = 0; //Напряжение АКБ
float UAKM = 0; //Напряжение АКБ MAX за секунду
float MAX = 0; // MAX Напряжение АКБ
float MAXK = 0; // MAX Напряжение АКБ между калибровками
float MAXP = 0; // MAX Напряжение АКБ в пачке
boolean kalibr = 0; //Необходимость калибровки
float dU0 = 0; // dU/dT
long sec = 0; // Время работы в сек.
long sec_h = 0; // Время работы в сек.
float kvasec = 0; // Коэффициент заполнения %
float temp = 20; // Температура радиатора мосфета
float KD1 = 1; // Коэф. корр. Дельты по температуре
float KD2 = 1; // Коэф. корр. Дельты по перекалибровкам
float KI = 1; // Коэф. корр. imp по перекалибровкам
int rekalibr = 0; // Счетчик повторных калибровок
boolean flag_UK = 0;
boolean flag_R = 0;
float Uimp = 0;
float Uimp2 = 0;
float Iimp = 0;
float Rimp = 1;
float U0 = 0;
float U1 = 0;
float U2 = 0;
float I = 0;
float R = 0;
float C = 0; //емкость усредн.
float CR = 0; //емкость raz
float CI = 0; //емкость интегр.
float Rmin = 1;
float R0 = 0;
float Rlast = 0;
int ii = 0;
int iii = 10;
boolean flag1 = 1;
float K01 = 0.000127;
int ppp = 100;
float Vbus = 0;
float Vsh = 0;
int shuntvolt = 0;
int busvolt = 0;
float Uakb = 0;
float Iakb = 0;
float I1 = 0;
float I2 = 0;
float Rg = 0;

// Изменяемые параметры:

float Ur = 12.3; //Порог разряда
float KIZ = 0.09; // Коэф. интенсивности заряда
float RR = 24; // Резистор разряда
boolean lm35 = 1; //Наличие градусника
boolean rezim = 0; //Режим работы — заряд 1 / разряд 0
int imp = 32 ; //Импульс в мc
int dop_pause = 2 ; //Добавка к паузе
float delta0 = 1.2; // Дельта — увеличение напряжения в импульсе, В
float delta = 1.2;
// Delta6012 — 0,4 8V
// GS1,3-6 — 0,3 8V
// Delta401 — 0,3 6V
float dUdT = 4; // dU/dT, mV

BLYNK_WRITE(V6) // получаем значение от сервера
{
Ur = param.asFloat(); // assigning incoming value from pin V6 to a variable

}
BLYNK_WRITE(V7) //
{
KIZ = param.asFloat();
}

void setup() {
Wire.begin();
Serial.begin(115200);
pinMode(pin, OUTPUT); // — на затвор мосфета заряда
digitalWrite(pin, LOW); //
pinMode(pinR24, OUTPUT); // — на затвор мосфета разряда
digitalWrite(pinR24, LOW);
pinMode(pinR6, OUTPUT); // — на затвор мосфета разряда
digitalWrite(pinR5, LOW);

for (int j = 1; j <= 10; j++) {
if (lm35 == 1) { //Измеряем температуру при наличии градусника
temp = 0;
for (int j = 1; j <= 10; j++) {
// temp += analogRead(A2);
}
temp = temp * 0.0488;
}
Serial.print(temp); Serial.println(«, 0, 0, 0, 0, 0, 0, 0, 0»);
delay2(500);
delay2(500);
}
if (temp > 50) KD1 = 0.5; else KD1 = 1; //Температурная компенсация

Serial.print(«KIZ «); Serial.println(KIZ);
Serial.print(«imp «); Serial.println(imp);
Serial.print(«dop_pause «); Serial.println(dop_pause);
Serial.print(«delta «); Serial.println(delta);
Serial.print(«dUdT «); Serial.println(dUdT);
Serial.println(«7 , 7, 1, 5, 8, 1, 1, 1, 3»); //v7715 81113
Serial.println(«0 , 0, 0, 0, 0, 0, 0, 0, 0»);
////
Blynk.begin(auth, ssid, pass);
Hostname = «ESP» + WiFi.macAddress();
Hostname.replace(«:», «»);
WiFi.hostname(Hostname);
// wifimanstart();
Serial.println(WiFi.localIP()); Serial.println(WiFi.macAddress()); Serial.print(«Narodmon ID: «); Serial.println(Hostname);

ArduinoOTA.begin();
}

bool SendToNarodmon() { // Собственно формирование пакета и отправка Народный мониторинг
WiFiClient client;
// DeviceAddress tempDeviceAddress;
String buf;
buf = «#» + Hostname + «\r\n»; // заголовок
buf = buf + «#UAKM#» + String(UAKM) + «\r\n»; //Максимальное напряжение за секунду
buf = buf + «#UK#» + String(UK) + «\r\n»; //НРЦ
buf = buf + «#Iimp#» + String(Iimp) + «\r\n»;
buf = buf + «#Rg#» + String(Rg) + «\r\n»;
buf = buf + «#Rimp#» + String(Rimp) + «\r\n»;
buf = buf + «#CR#» + String(CR) + «\r\n»;
buf = buf + «#C#» + String(C) + «\r\n»;
buf = buf + «#Delta#» + String(delta) + «\r\n»;
buf = buf + «#Ur#» + String(Ur) + «\r\n»;
buf = buf + «#KIZ#» + String(KIZ) + «\r\n»;
buf = buf + «##\r\n»; // закрываем пакет

if (!client.connect(«narodmon.ru», 8283)) { // попытка подключения
Serial.println(«connection failed»);
return false; // не удалось;
} else
{
client.print(buf); // и отправляем данные
if (debug) Serial.print(buf);
while (client.available()) {
String line = client.readStringUntil(‘\r’); // если что-то в ответ будет — все в Serial
Serial.print(line);
}
}
return true; //ушло
}
////

void loop() {
////
Blynk.run();
Blynk.syncVirtual(V6, V7); // синхронизация значений с сервером
////
ArduinoOTA.handle();

//Разряд

if (rezim == 0) {
digitalWrite(pin, LOW);
digitalWrite(pinR24, HIGH);
ina_write(0x00, 0x8000);
ina_write(0x00, 0x3E67);
delay2(20);
busvolt = ina_read(0x02); busvolt >>= 3;
UK = (float)busvolt / 1000 * 4; // LSB=4mv
shuntvolt = ina_read(0x01);
if (shuntvolt > 32000) shuntvolt = (65535 — shuntvolt);
I = (float)shuntvolt / 1000000 * 10 / 0.025; //LSB=10mkv Rsh=0.025 Ohm
// ina_write(0x00, 0x3E67);
Serial.println(UK);
while (UK > Ur) { // Разряд до 1.8В на банку, Li до 3,1В
t = micros();
sec++;
ii++;
tr = millis();

Serial.print(» U = «);
Serial.print(UK);
Serial.print(» , Ur = «);
Serial.print(Ur);
Serial.print(» ,99, I = «);
Serial.print(I);
Serial.print(» A, C = «);
Serial.print(I * sec / 3600);
Serial.print(» Ah, Rg = «);
Serial.print(R, 3);
Serial.print(» Ohm, CR = «);
Serial.print(CR);
Serial.print(» Ah, T = «);
Serial.print(tr / 1000 / 3600, 1);
Serial.print(» h, Rimp = «);
Serial.print(Rimp, 3);
Serial.println(» Ohm «);
ina_write(0x00, 0x3E67);
delay2(1000);
busvolt = ina_read(0x02); busvolt >>= 3;
UK = (float)busvolt / 1000 * 4; // LSB=4mv
shuntvolt = ina_read(0x01);
if (shuntvolt > 32000) shuntvolt = (65535 — shuntvolt);
I = (float)shuntvolt / 1000000 * 10 / 0.025; //LSB=10mkv Rsh=0.025 Ohm
Iimp = I;
t = micros() — t;
CR = CR + I * t / 1000000 / 3600;
UAKM = UK;
////
Blynk.virtualWrite(V0, UAKM); //U Имп
Blynk.virtualWrite(V1, UK); //U НРЦ
Blynk.virtualWrite(V2, Iimp); //ток
Blynk.virtualWrite(V3, Rimp); //R ИМП
Blynk.virtualWrite(V4, CR); // Емкость слитая
Blynk.virtualWrite(V5, C); // Емкость залитая

if (millis() — lastConnectionTime > postingInterval) { // ждем 5 минут и отправляем
if (WiFi.status() == WL_CONNECTED) { // ну конечно если подключены
if (SendToNarodmon()) {
lastConnectionTime = millis();
} else {
lastConnectionTime = millis() — postingInterval + 15000; //следующая попытка через 15 сек
}
} else {
lastConnectionTime = millis() — postingInterval + 15000; //следующая попытка через 15 сек
Serial.println(«Not connected to WiFi»);
}
}
////

if (ii > 100) {
ii = 0;

digitalWrite(pinR24, LOW);
delay2(1000);
Rimp = 0;
for (int j = 1; j <= 100; j++) { // Измерение R зарядными импульсами
ina_write(0x00, 0x8000);
ina_write(0x00, 0x399B);
delayMicroseconds2(950);
busvolt = ina_read(0x02); busvolt >>= 3;
UAK = (float)busvolt / 1000 * 4; // LSB=4mv
digitalWrite(pin, HIGH); //
t = micros();
ina_write(0x00, 0x8000);
ina_write(0x00, 0x399B);
delayMicroseconds2(950);
busvolt = ina_read(0x02); busvolt >>= 3;
shuntvolt = ina_read(0x01);
digitalWrite(pin, LOW); //
t = micros() — t;
U1 = (float)busvolt / 1000 * 4; // LSB=4mv
if (shuntvolt > 32000) shuntvolt = (65535 — shuntvolt);
I = (float)shuntvolt / 1000000 * 10 / 0.025; //LSB=10mkv Rsh=0.025 Ohm
Rimp += (U1 — UAK) / I;
CR = CR — I * t / 1000000 / 3600;
}
Rimp = Rimp / 100;
digitalWrite(pinR24, HIGH); // Измерение R постоянным током
t = micros();
ina_write(0x00, 0x3E67);
delay2(2000);
busvolt = ina_read(0x02); busvolt >>= 3;
shuntvolt = ina_read(0x01);
U1 = (float)busvolt / 1000 * 4; // LSB=4mv
if (shuntvolt > 32000) shuntvolt = (65535 — shuntvolt);
I1 = (float)shuntvolt / 1000000 * 10 / 0.025; //LSB=10mkv Rsh=0.025 Ohm
t = micros() — t;
CR = CR + I1 * t / 1000000 / 3600;
digitalWrite(pinR5, HIGH); //
t = micros();
ina_write(0x00, 0x3E67);
delay2(1000);
busvolt = ina_read(0x02); busvolt >>= 3;
shuntvolt = ina_read(0x01);
digitalWrite(pinR5, LOW); //
t = micros() — t;
U2 = (float)busvolt / 1000 * 4; // LSB=4mv
if (shuntvolt > 32000) shuntvolt = (65535 — shuntvolt);
I2 = (float)shuntvolt / 1000000 * 10 / 0.025; //LSB=10mkv Rsh=0.025 Ohm
R = (U1 — U2) / (I2 — I1);
Rg = R;
CR = CR + I2 * t / 1000000 / 3600;
// Serial.print(U1, 3); Serial.print(» U1, V «);
// Serial.print(I1, 3); Serial.print(» I1, A «);
// Serial.print(U2, 3); Serial.print(» U2, V «);
// Serial.print(I2, 3); Serial.print(» I2, A «);
// Serial.print(R, 6); Serial.println(» R, Ohm «);
}
}
digitalWrite(pin, LOW);
digitalWrite(pinR24, LOW);
Serial.println(» delay «);
delay2(100000);
// CR = UK / RR * sec / 3600;
rezim = 1;
}
//Заряд

else {

//Калибровка импульса

if ( kalibr == 1 ) {

MAXK = 0;
Serial.println(» , , , , , , , , «);

do {
dop_pause = dop_pause / 2;
if (dop_pause < 2) {
dop_pause = 2;
imp = imp * 2;
}
ina_write(0x00, 0x8000);
ina_write(0x00, 0x399B);
delayMicroseconds2(950);
busvolt = ina_read(0x02); busvolt >>= 3;
UK = (float)busvolt / 1000 * 4; // LSB=4mv
tim = millis();
sec = 0;
do {
digitalWrite(pin, HIGH); //
delay2(imp); //Импульс длительностью imp
digitalWrite(pin, LOW); //
// delayMicroseconds(520);
//UAK = readU0(); //Пауза длительностью 1ms
ina_write(0x00, 0x8000);
ina_write(0x00, 0x399B);
delayMicroseconds2(950);
busvolt = ina_read(0x02); busvolt >>= 3;
UAK = (float)busvolt / 1000 * 4; // LSB=4mv
for (int p = 1; p <= dop_pause; p++) delay2(min2(imp, 16)); //Добавка к паузе
if (UAKM < UAK) UAKM = UAK; //Максимальное напряжение за секунду
if ( (millis() — tim) >= 1000 ) { // Выводим значение каждую сек.
sec++;
tz = millis() — tr;
pause = 1 + dop_pause * (min2(imp, 16));
Serial.print(UAKM); // график
Serial.print(» , «);
Serial.print(UK);
Serial.print(» , «);
Serial.print(UK + delta);
Serial.print(» , «);
Serial.print(sec);
Serial.print(» , «);
Serial.print(imp);
Serial.print(» , «);
Serial.print(pause);
Serial.print(» , «);
Serial.print(C);
Serial.print(» , «);
Serial.print(tz / 1000 / 3600, 1);
Serial.print(» , «);
Serial.println(Rimp, 3);
tim = millis();
UAKM = 0;
}
}

while ( ((UAK — UK) < (delta)) && sec < 10 && imp < 64) ;
for (float j = 1; j <= 5; j++) {
Serial.println(» , , , , , , , , «);
delay2(500);
delay2(500);
}
}
while ( ((UAK — UK) < (delta)) && imp < 64) ;
kalibr = 0; //Конец калибровки
flag_UK = 1;
Serial.println(» , , , , , , , , «);

}

//Начало пачки импульсов
t0 = millis();
if (flag_UK == 1) {
ina_write(0x00, 0x8000);
ina_write(0x00, 0x399B);
delayMicroseconds2(950);
busvolt = ina_read(0x02); busvolt >>= 3;
UK = (float)busvolt / 1000 * 4; // LSB=4mv Напряжение НРЦ
}
flag_UK = 0;
UK0 = UK;
tim = millis();
MAXP = 0;
sec = 0;
long timp = 0;
long tpause = 0;
do { //Пачка импульсов
digitalWrite(pin, HIGH); // Импульс imp
t = micros();
ina_write(0x00, 0x8000);
ina_write(0x00, 0x399B);
delayMicroseconds2(950);
busvolt = ina_read(0x02); busvolt >>= 3;
shuntvolt = ina_read(0x01);
if (shuntvolt > 32000) shuntvolt = (65535 — shuntvolt);
UAK = (float)busvolt / 1000 * 4; // LSB=4mv
Iimp = (float)shuntvolt / 1000000 * 10 / 0.025; //LSB=10mkv Rsh=0.025 Ohm

for (int im = 1; im < imp ; im++) {
ina_write(0x00, 0x399B);
delayMicroseconds2(950);
busvolt = ina_read(0x02); busvolt >>= 3;
shuntvolt = ina_read(0x01);
if (shuntvolt > 32000) shuntvolt = (65535 — shuntvolt);
UAK += (float)busvolt / 1000 * 4; // LSB=4mv
Iimp += (float)shuntvolt / 1000000 * 10 / 0.025; //LSB=10mkv Rsh=0.025 Ohm
}

timp = micros() — t;
digitalWrite(pin, LOW); //
t = micros();
UAK = UAK / imp;
Iimp = Iimp / imp;
C += Iimp * timp / 3600000000;
if (flag_R == 1) {
//delayMicroseconds(520);
//UAK = readU0(); //Пауза длительностью 1ms
ina_write(0x00, 0x8000);
ina_write(0x00, 0x399B);
delayMicroseconds2(950);
busvolt = ina_read(0x02); busvolt >>= 3;
UAK = (float)busvolt / 1000 * 4; // LSB=4mv
}
else {
delayMicroseconds2(1000);
}

for (int p = 1; p <= dop_pause; p++) delay2(min2(imp, 16)); //Добавка к паузе
tpause = micros() — t;
if (UAK > UAKM) UAKM = UAK; //Максимальное напряжение за секунду
if (UAK > MAX) MAX = UAK; //Фиксируем максимальное напряжение заряда
if (UAK > MAXK) MAXK = UAK; //Фиксируем максимальное напряжение заряда
if (UAK > MAXP) MAXP = UAK; //Фиксируем максимальное напряжение пачки
if ( (millis() — tim) >= 1000 ) { // Выводим значение каждую сек.
sec++;
sec_h++;
tz = millis() — tr;
pause = 1 + dop_pause * (min2(imp, 16));
Serial.print(UAKM); // график
Serial.print(» , «);
Serial.print(UK);
Serial.print(» , «);
Serial.print(UK0 + delta);
Serial.print(» , «);
Serial.print(timp / 1000, 1);
Serial.print(» , «);
Serial.print(tpause / 1000, 1);
Serial.print(» , «);
Serial.print(Iimp);
Serial.print(» , «);
Serial.print(C);
Serial.print(» , «);
Serial.print(tz / 1000 / 3600, 1);
Serial.print(» , «);
Serial.println(Rimp, 3);
tim = millis();
// UAKM = 0;
}
if ( sec > 12 ) {
dop_pause— ; //Уменьшаеи добавку к паузе
if (dop_pause < 1) {
if (imp < 64) imp++;
dop_pause = 2;
}
break;
}
}
while ( (UAK — UK) < (delta) ) ; //Выходим из цикла при достижении Дельты
if ( sec < 3 ) { // Если пачка короче XXX sec
dop_pause++ ; //Увеличиваеи добавку к паузе
if (dop_pause > 6 && imp > 1) {
imp = imp / 2;
dop_pause = 1;
}
}

ti = millis() — t0;
t0 = millis();

//Конец пачки импульсов, Начало паузы между пачками, измерение Rвн
flag1 = 1;
ina_write(0x00, 0x8000);
ina_write(0x00, 0x3E67);
delay2(500);
busvolt = ina_read(0x02); busvolt >>= 3;
shuntvolt = ina_read(0x01);
float dU0K = (float)busvolt / 1000 * 4; // LSB=4mv
// = readU016();
UK = dU0K;
for (int h = 1; h <= 10; h++) { //Пачка импульсов — пауза
// delay2(520);
// UAK = readU016(); //1c
delay2(1000);
busvolt = ina_read(0x02); busvolt >>= 3;
shuntvolt = ina_read(0x01);
UAK = (float)busvolt / 1000 * 4; // LSB=4mv

if (UAK < UK) UK = UAK; // min UK
float dU0 = (dU0K — UAK) * 1000; //mV
dU0K = UAK;
sec_h++;
Serial.print(UAK); // график
Serial.print(» , «);
Serial.print(UK);
Serial.print(» , «);
Serial.print(KIZ);
// Serial.print(«999″);
Serial.print(» , «);
Serial.print(Rg, 3);
Serial.print(» , «);
Serial.print(Rmin, 3);
Serial.print(» , «);
Serial.print(delta);
Serial.print(» , «);
Serial.print(CR);
Serial.print(» , «);
Serial.print(ti);
Serial.print(» , «);
Serial.print(tp);

Serial.println(» pause»);

if (flag1 == 1) {

Rimp = 0;
for (int j = 1; j <= 100; j++) { //Измерение R импульсами
ina_write(0x00, 0x8000);
ina_write(0x00, 0x399B);
delayMicroseconds2(950);
busvolt = ina_read(0x02); busvolt >>= 3;
UAK = (float)busvolt / 1000 * 4; // LSB=4mv
digitalWrite(pin, HIGH); //
t = micros();
ina_write(0x00, 0x8000);
ina_write(0x00, 0x399B);
delayMicroseconds2(950);
busvolt = ina_read(0x02); busvolt >>= 3;
shuntvolt = ina_read(0x01);
digitalWrite(pin, LOW); //
t = micros() — t;
U1 = (float)busvolt / 1000 * 4; // LSB=4mv
if (shuntvolt > 32000) shuntvolt = (65535 — shuntvolt);
I = (float)shuntvolt / 1000000 * 10 / 0.025; //LSB=10mkv Rsh=0.025 Ohm
Rimp += (U1 — UAK) / I;
C = C + I * t / 1000000 / 3600;
}
Rimp = Rimp / 100;

if ( Rmin == 1) {
Rmin = Rimp;
Rlast = Rimp;
}
if (Rimp / Rlast > 1.02) Rimp = Rimp * 1.02;
if (Rimp / Rlast < 0.98) Rimp = Rimp * 0.98;
if (Rmin > Rimp) Rmin = Rimp;
if (Rimp > Rmin) delta = KIZ * Rmin / (Rimp — Rmin);
Rlast = Rimp;
// if (Rmin > Rimp || Rmin == 1) Rmin = Rimp;
// if ( (Rimp — Rmin) > 0.001 && (Rimp — Rmin) < 0.1 ) delta0 = 0.015 / (Rimp — Rmin); // delta0=0,15 .. 15
// if ( delta > delta0 ) delta = delta0; // минимизация
flag_R = 0;
if ( Rimp < 0 || Rimp > 1 ) { // R у дохлых АКБ
Rmin = 1;
delta = 2;
flag_R = 1; //раскачка
}

iii ++;

}
flag1 = 0;
if (dU0 <= dUdT) break ;// Если скорость падения напряжения ниже XXмВ — уменьшаем паузу
}
dU0 = 0;
tp = millis() — t0;

////
Blynk.virtualWrite(V0, UAKM); //U Имп
Blynk.virtualWrite(V1, UK); //U НРЦ
Blynk.virtualWrite(V2, Iimp); //ток
Blynk.virtualWrite(V3, Rimp); //R ИМП
Blynk.virtualWrite(V4, CR); // Емкость слитая
Blynk.virtualWrite(V5, C); // Емкость залитая

if (millis() — lastConnectionTime > postingInterval) { // ждем 5 минут и отправляем
if (WiFi.status() == WL_CONNECTED) { // ну конечно если подключены
if (SendToNarodmon()) {
lastConnectionTime = millis();
} else {
lastConnectionTime = millis() — postingInterval + 15000; //следующая попытка через 15 сек
}
} else {
lastConnectionTime = millis() — postingInterval + 15000; //следующая попытка через 15 сек
Serial.println(«Not connected to WiFi»);
}
}
////
UAKM = 0;

if (iii > 100) {
iii = 0;
digitalWrite(pinR24, HIGH); // Измерение R постоянным током
t = micros();
ina_write(0x00, 0x8000);
ina_write(0x00, 0x3E67);
delay2(2000);
busvolt = ina_read(0x02); busvolt >>= 3;
shuntvolt = ina_read(0x01);
U1 = (float)busvolt / 1000 * 4; // LSB=4mv
if (shuntvolt > 32000) shuntvolt = (65535 — shuntvolt);
I1 = (float)shuntvolt / 1000000 * 10 / 0.025; //LSB=10mkv Rsh=0.025 Ohm
t = micros() — t;
C = C — I1 * t / 1000000 / 3600;

digitalWrite(pinR5, HIGH); //
t = micros();
ina_write(0x00, 0x8000);
ina_write(0x00, 0x3E67);
delay2(1000);
busvolt = ina_read(0x02); busvolt >>= 3;
shuntvolt = ina_read(0x01);
digitalWrite(pinR24, LOW); //
digitalWrite(pinR5, LOW); //
t = micros() — t;
U2 = (float)busvolt / 1000 * 4; // LSB=4mv
if (shuntvolt > 32000) shuntvolt = (65535 — shuntvolt);
I2 = (float)shuntvolt / 1000000 * 10 / 0.025; //LSB=10mkv Rsh=0.025 Ohm

C = C — I2 * t / 1000000 / 3600;
Rg = (U1 — U2) / (I2 — I1);

flag_UK = 1;
// Serial.print(U1, 3); Serial.print(» U1, V «);
// Serial.print(I1, 3); Serial.print(» I1, A «);
// Serial.print(U2, 3); Serial.print(» U2, V «);
// Serial.print(I2, 3); Serial.print(» I2, A «);
// Serial.print(Rg, 6); Serial.println(» Rgost, Ohm «);
}
//Конец паузы между пачками

}
}
int min2(int x, int y) {
int res;
if (x < y) res = x;
else res = y;
return res;
}

void delay2(long mill) {
unsigned long tim = millis();
do {
yield();
}
while (millis() — tim < mill);
}

void delayMicroseconds2(long micr) {
unsigned long tim = micros();
do {
yield();
}
while (micros() — tim < micr);
}
// функция записи в конфигурационные регистры INA2xx
void ina_write(byte adr, int cfg) {
Wire.beginTransmission(0x40);
Wire.write(adr);
Wire.write((cfg >> 8) & 0xFF);
Wire.write(cfg & 0xFF);
Wire.endTransmission();
}

//функция чтения данных из регистров INA2xx
int ina_read(byte adr) {
Wire.beginTransmission(0x40);
Wire.write(adr);
Wire.endTransmission();
Wire.requestFrom(0x40, 2);
int value = ((Wire.read() << 8) | Wire.read());
return value;
}

 

 

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