avatar_UriBas

Продвинутое самодельное универсальное ЗУ на МК

Автор UriBas, 02 Апр. 2018 в 22:43

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

UriBas

Данная тема является естественным развитием темы "Моргалка на Arduino. Этюды для начинающих"
Здесь предлагается описывать схемы не простых моргалок, а навороченных, с дополнительными функциями - такими как разряд, измерение тока, внутреннего сопротивления, различные дисплеи, органы управления, сбор данных, связь через интернет... и прочее-прочее-прочее, что выходит за рамки простейших моргалок для начинающих.



[b-b]Информация по методам и алгоритмам заряда применяемых в этой теме [/b-b]
Спойлер

Режим хранения -"Качели"
Спойлер
 
Применяется для предотвращения застарелой сульфатации (разряда) и для поддержания АКБ в рабочем состоянии в процессе хранения. 

Принцип работы качелей прост, - когда АКБ разряжается до нижнего порога напряжения = 12,6-12,9В (зависит от состояния и типа АКБ) включается заряд и АКБ заряжается до верхнего порога напряжения = 14,4-14,7В (или выше, также исходя из типа и состояния АКБ).  После того, как напряжение достигает верхнего порога, заряд отключается до момента, пока напряжение на АКБ снова не достигнет нижнего порога и так по кругу (как качели – «туда сюда»)

Пороги могут задаватся жестко  («простые качели») или настраиваться автоматически («адаптивные качели»), что зависит от схемы и от алгоритмов заложенных в зарядное устройство.

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

Саморазряд или «скорость падения напряжения» - определяется исходя из норм саморазряда для свинцовых АКБ
http://www.akb-oil.com.ua/blog/samorazryad-avtomobilnogo-akkumulyatora-pri-hranenii  - https://akkumulyatoravto.ru/zaryadka/samorazryad.html
Саморазряд автомобильного аккумулятора при хранении    от 0,1% и  до 2% в сутки.  У новых АКБ саморазряд не должен быть выше 0,5-1,0%.  по скорости падения напряжения есть график скорости падения напряжения (саморазряда) на разных этапах
Спойлер
"Режим поддержания"
Спойлер

Адаптивный импульсный режим " Дельта"
Спойлер

Адаптивный импульсный режим "Дельта + "
Спойлер

"Капельный разряд"
Спойлер

Адаптивный разряд
Спойлер



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

Существуют разные методы заряда постоянным током, к примеру несколько популярных:
    ---   Метод Вудбриджа - когда на аккумулятор подается напряжение  с верхним порогом 14,4-16В, без ограничения тока - CV , в результате ток вначале заряда имеет максимальное значение, затем постепенно снижается в конце. 
   ---   Классический метод CC-CV.     СС - означает, что сначала заряжают стабилизированным током 0,1-0,3С   CV -в конце стабилизированным напряжением = 14,4-16В.     

Импульсный заряд
Спойлер

         Импульсный заряд, это такой заряд, при котором используется импульсы тока длительностью от микро секунд до несколько десятков секунд.  Между импульсами делаются паузы, длительность которых может быть от долей секунды до нескольких десятков секунд..  здесь не надо путать импульсные ЗУ с простыми зарядными устройствами, которые используют импульсные блоки питания с выпрямлением и стабилизацией тока и напряжения, с сглаживающими фильтрами.. такие ЗУ не считаются импульсными, они просто используют современные импульсные блоки питания.
         Импульсы заряда могут еще заполнятся импульсами более высокой частоты - ШИМ..  в таких случаях импульсы с более высокой частотой будут называться пачками ШИМ, а основные импульсы - модулирующими или модуляцией (зачастую идет путаница в названиях). 

Основные отличия импульсного заряда от заряда непрерывным, постоянным током
Спойлер
Поскольку в импульсном заряде используется пауза, то за время паузы происходит стабилизация (релаксация или рассасывание, к примеру - диссипация тепла в паузе..) химических процессов, что позволяет подавать импульсы с более высоким потенциалом не перегревая аккумулятор и не допуская бурный электролиз в конце заряда.  В свою очередь, импульсы с более высоким потенциалом способствуют более энергичному процессу десульфации, восстановлению, меньше изнашиваются положительные пластины (которые изнашиваются быстрее отрицательных при малых токах заряда)..   и как итог - продлению срока службы аккумулятора. Как правило, там где обычные ЗУ уже не в состоянии нормально заряжать, импульсное ЗУ способно  зарядить и восстановить аккумулятор до рабочего состояния.

Основные методы и алгоритмы импульсного заряда
Спойлер
Поскольку импульсный заряд предполагает очень широкий набор значений таких как - длительность импульса, длительность паузы,  частоты, коэффициента заполнения..  а также значений тока и напряжений, то это налагает бОльшую ответственность за правильный подбор этих параметров, иначе результат может быть непредсказуем, причем как в лучшую, так и в худшую сторону..   Именно из-за неправильного применения характеристик имп. заряда, зачастую люди спотыкаются и разочаровываются в импульсном заряде.. а то и вовсе, - становятся ярыми противниками.
Спойлер
По конструкции ЗУ,  по сложности алгоритмов на форуме применяются следующие терминологии.
"Долбилки" - устройства использующие импульсный заряд с малой длительностью импульсов, но имеющие высокий потенциал до 40 Вольт и током в сотни или больше Ампер..  алгоритм, как правило, простой и схема тоже.
"Моргалки" - прерыватели заряда построенные на реле, либо на микросхемах, к примеру на таймерах LM555 с простым алгоритмом.
"Моргалки на МК" (на микроконтроллерах)  - то же самое, но с применением микроконтроллеров, с несложным алгоритмом.
Импульсные адаптивные зарядные устройства - полноценные ЗУ на микроконтроллерах, с импульсным адаптивным  алгоритмом и расширенными функциями как заряда, так и разряда.   
Адаптивный алгоритм означает, что программа в процессе заряда/разряда сама определяет характеристики импульсов и пауз, а также управляет током и напряжением заряда, исходя из состояния аккумулятора. 

--------------------------------------------------------------------------------------------------------------------------------------------
[b-b]Пользователи, которые поместили свои схемы и скетчи[/b-b]
Спойлер

[user]Dunkel[/user] 
Импульсное зарядное устройство "Моргалка" на модуле esp32 с измерением внутреннего сопротивления 11 апр 2018 в 21:47 
Схема, графики и скетч
Спойлер
Схема
Сначала замеряют ЭДС -V1  (НРЦ в паузе), потом подают определенный ток Y и снова мерят напряжение V2  затем вычисляют вн. сопр.    Rвн =(V2  -V1)/ Y    Сделал по простому - резистор 0,1 Ом в качестве шунта, на нем измеряется ток.
Итак, моргалка на esp32, АКБ 6В 1,2Ач, БП 8В.  Дельта 0,4В
Графики
Заряд около суток:

Длительность импульса и паузы в мс:

Какое-то Rвн.

Напряжение в импульсе:

Скетч
// analogread-esp32
// 12/04/2018
// (c)dunkel
// esp32, питание 5V stab
// Pin32 - заряд, на затвор мосфета
// Pin33 - разряд, на затвор мосфета
// PinА1 - напряжение с делителя АКБ 1k/5.1k
// PinА3 - шунт 0.1Ом

#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
unsigned long t;
int pin = 32;
void setup() {
  Serial.begin(9600);
  SerialBT.begin("ESP32test"); //Bluetooth device name
  pinMode(pin, OUTPUT); // - на затвор мосфета заряда
  digitalWrite(pin, LOW); //
}
void loop() {
  float U0 = 0;
  float U1 = 0;
  float U2 = 0;
  float I = 0;
  float R = 0;
  t = micros();
  //  delay(700);
  U0 = readU016();
  t = micros() - t;
  Serial.print(" 32 000 ar, U0 ");  Serial.print(U0, 4);
  Serial.print("  ,t = ");   Serial.print(t); Serial.print(" us");
  SerialBT.print(",  32 000 ar, U1 ");  SerialBT.print(U0, 4);
  SerialBT.print("  ,t = ");   SerialBT.print(t); SerialBT.print(" us");
  t = micros();
  digitalWrite(pin, HIGH); //
  //  delayMicroseconds(400);
  U1 = 0;
  U2 = 0;
  for (int j = 1; j <= 32; j++) {
    U1 += analogRead(A0);
    U2 += analogRead(A3);
  }
  U1 = U1 * 0.0001816;
  U2 = U2 * 0.0001834;
  digitalWrite(pin, LOW); //
  t = micros() - t;
  I = (U2 - U1) * 10;
  R = (U1 - U0) / I - 0.1;
  Serial.print("  32 ar, U1 "); Serial.print(U1, 4);
  Serial.print("  32 ar, U2 "); Serial.print(U2, 4);
  Serial.print(" , I "); Serial.print(I, 4);
  Serial.print(" , R "); Serial.print(R, 4);
  Serial.print("  ,t = ");   Serial.print(t); Serial.println(" us");
  SerialBT.print("  32 ar, U1 "); SerialBT.print(U1, 4);
  SerialBT.print("  32 ar, U2 "); SerialBT.print(U2, 4);
  SerialBT.print(" , I "); SerialBT.print(I, 4);
  SerialBT.print(" , R "); SerialBT.print(R, 4);
  SerialBT.print("  ,t = ");   SerialBT.print(t); SerialBT.println(" us");
}


// Измерение UAK 32000, длительность 300мс
float readU016() {
  long U1 = 0; //Напряжение на АКБ
  float result = 0.0;
  float V1 = 0.0;
  float K1 = 0.0000001814; // 32000 300ms 5.1k/1k esp32
  for (int j = 1; j <= 32000; j++) {
    U1 += analogRead(A0);
  }
  V1 = U1 * K1;
  result =  V1;
  return result;
}

--------------------------------------------------------------------------------------------------------------------------------------------
[user]Alex_N[/user] 
Долбилка-моргалка_1 « : 06 Апр 2018 в 16:21 »
Спойлер
Схема
Спойлер
   
Выкинул всё что левее транзистора а вместо этого поставил оптопару TLP620  и выход с ардуины
Скетч
Спойлер

const int LedPin =  13;      // the number of the LED pin
int Led_shim1 =9;   // 2kHz
int val_shim1=1;
int led = 13;

void setup() {
  pinMode(Led_shim1,OUTPUT);
  pinMode(led, OUTPUT); 
 
  TCCR1A = TCCR1A & 0xe0 | 1;
  TCCR1B = TCCR1B & 0xe0 | 0x0b;         // 9 pin 1 kHz
 
  analogWrite(Led_shim1, val_shim1);
}

void loop()
{
  digitalWrite(led, HIGH);   
  delay(1000);               
  digitalWrite(led, LOW);   
  delay(1000);             
}
--------------------------------------------------------------------------------------------------------------------------------------------
[user] Кass [/user],   
Проект на базе дисплея Nextion и МК C8051F125 « : 11 Авг 2018 в 20:26 ».
--------------------------------------------------------------------------------------------------------------------------------------------
[user] UriBas [/user],   
"Моргалка по Фибоначи" « : 29 мая 2019 в 9:06 ».
Спойлер
Цитата: UriBas от 29 Май 2019 в 09:06
В свете "космических технологий", под вдохновением фильма на ютубе
Спойлер
решил попробовать числа Фибоначи.  На скорую руку написал программку.  В процессе написания, получилось так, что код вышел не большим, всего около 900 байт, программу делал в Ардуино Иде 1,0 под Тини13, 
Схема стандартная, - сама Тиня13, питание, измерение через делитель 1/4 рассчитан на максимальное входное напряжение 20В, управление через мосфет, одна нога свободна - можно еще что-то придумать, например отключение БП на время паузы.   В схеме и в скетче надо пины переназначить, распределить более рационально на мой взгляд.. но на Тиньке пока не буду заморачиваться, сразу перехожу на мегу328.
Функциональная схема алгоритма
Спойлер
Описание алгоритма
Спойлер
   
Алгоритм
•   В основе БП для ЗУ лежит СС – ограничение тока по паспорту АКБ, напряжение может быть любым, главное, чтобы (хотя бы один раз) был выставлен (вручную) оптимальный ток заряда. В принципе легко сделать, чтобы БП автоматически отключался, когда включается режим КАЧЕЛИ или когда длинная пауза.
•   Сам заряд осуществляется автоматически и основан на саморегуляции среднего тока.  Используется  постепенное увеличение длительности заряда с паузами по принципу чисел Фибоначи.  Также осуществляется контроль верхнего и нижнего порога, контроль скорости снижения НРЦ. Сам заряд условно разбит на три этапа – 1) Раскачка 2) Основной заряд 3) Добивка.  В конце - режим сохранения "КАЧЕЛИ".    Когда АКБ уже не принимает ток заряда менее 2-3% от паспортнной емкости, включаются качели как по нижнему порогу, так и по скорости падения НРЦ..  Тем самым исключается «вечная пауза»..когда, к примеру, - АКБ в хорошем состоянии или с высоким НРЦ = 13,2В и малым падением напряжения.  Контроль по скорости падения НРЦ  позволяет использовать заниженный порог.. для чего? – К примеру, если одна банка сильнее засульфатирована и недозаряжена - тогда НРЦ быстро падает ниже 12,8В.. в результате, качели превращаются в интенсивную добивку и это может повлечь терморазгон в слабых или перезаряженных банках.  Снижение порога даст больше времени отдохнуть банкам (остыть и чтобы ушло расслоение эл-та) перед новым зарядом. 
•   Немного о числах Фибоначи, что это такое и почему взяты в основу? –Ученый Фибоначи заметил, что строение галактик, пчелинных сот, раковин улиток и т.д. построены по определенному принципу выраженному в числах – 0,1,1,2,3,5,8.. т.е. когда каждое последующее число есть сумма двух предыдущих..  Но это не все, между собой эти числа соотносятся как золотое сечение=1,61, которое заложено во всей природе и даже в самом человеке!
•   Об ИНДИКАЦИИ – индикация в простом варианте на трех светодиодах, каждый из которых отображает следующие режимы
o   1) Красный  - мигающий ожидает подключения АКБ, не мигающий – напр ниже 10,8В
o   2) Желтый мигающий – пауза, не мигающий – заряд
o   3) Зеленый – напряжение заряда достигло 14,4В, мигающий -  режим качели
Работа алгоритма[\b]
•   Если  НРЦ менее чем 1В (0,5) то это принимается как нет контакта с АКБ. и тогда Мк в «вечном» ожидании..  когда НРЦ будет выше 1В включается процесс заряда.
•   Если НРЦ больше 1В  включается «заряд РАСКАЧКА  по Фибоначи» – используются числа фибоначи для формирования импульсов заряда, или лучше сказать - временных интервалов заряда ..т.е.  идет «раскачка»  начиная от 100мл.сек.  - ..100, 100, 200, 300, 500, 800, 1300.. и т.д.  Конечная длит имп заряда не ограничена, так что если АКБ в хорошем состоянии и с большой емкостью, то заряд будет идти на максимальном токе, по полной программе, - почти непрерывно (с небольшими паузами).
•   На всем этапе, между интервалами заряда делается пауза в 7 секунд. Почему именно 7?  Ну просто отсечку по скорости падения напр. еще не сделал, + так проще, + и меньше памяти как бы.. а 7 секунд это как раз оптимально, на мой взгляд для раскачки.. Потом, когда длительность итервалов заряда будет несколько минут, по моим расчетам, увеличение времени заряда будет незначительна, зато раскачка (по идее) должна быть эффективная и полезная...
•   Если непрерывная длительность (имп) заряда будет больше 40минут, то делается пауза в 40секунд.. за это время пусть отдохнут  БП, ЗУ и АКБ.. Если к примеру заряд будет длится 12 часов, то паузы составят меньше 20 минут.. это не много.
•   Если напряжение при заряде достигло верхнего порога (14,2В), и при этом длит импульса была больше 500млсек, то заряд каждый раз начинается с РАСКАЧКИ  по числам Фибоначи, т.е. начинаются с интервала 0,1сек.. - т.е. каждый раз, как только достигнут порог, цикл заряда начинается с раскачки.. Можно еще сделать, чтобы верхний порог увеличивался, если длит имп будет (к примеру) меньше чем 1-2 сек.. ведь в таком случае, средний ток будет уменьшен в 7 раз.. т.е. около 0,015С или почти 2% .. что дает эффект выравнивание малым током при повышенном напряжении.
•   Если напряжение при заряде достигло верхнего порога > 14,4-15В) И при этом длительность импульса заряда не превысила 500 млсек (0,5сек) это означает, что АКБ уже "накушался"  и включаются "КАЧЕЛИ". 
           "Качели" хороши тем, что дают достаточное время на  самовыравнивание заряда по площади и по глубине активной массы, на остывание и на  устранение расслоения электролита - что повышает эффективность последующего цикла заряда с раскачкой.    С момента, когда включаются качели" - включается зеленый светодиод и отслеживается нижний порог НРЦ = 12,8 .. 12,4   Как уже говорил выше, можно выставлять пониженный порог без опасения "вечной паузы" или сильного разряда АКБ. потому, что отслеживается скорость падения НРЦ на уровне 60мВ за 24часа.. т.е. если за 24 часа напряжение не упало больше  чем на 0,06В – качели прерываются и заряд начинается с самого начала.. т.е. с раскачки.   
   .. Если аккумулятор в хорошем состоянии, то на уровне 12,8В скорость падения составляет не более чем 10-20мВ за 24 часа (за сутки), поэтому, по любому, качели сработают раньше 12,8В -  где-то на уровне 12,9-13,0В.  Тем самым АКБ будет поддерживаться в 100% готовности "к бою" без опасности перегрева и перезаряда.
      Если  в аккумуляторе есть слабые банки с сильной сульфатацией или после глубокого разряда, то тут как раз порог в 12,4В будет для них лучше, потому что это даст больше времени на их восстановление.  (!!! Возможно надо будет сделать, чтобы в таком случае загорался красный светодиод, - если НРЦ в качелях упало до 12,4В - что показывало бы на неисправность с одной стороны, с другой можно было следить за восставнолением !!)

По поводу аварийных ситуаций
•   Что произойдет, если вдруг отсоединить контакты?  ЗУ быстро перейдет в режим качелей, а потом в начало программы и в режим "вечного" ожидания контакта - заряд не будет включен и будет мигать красный светодиод.
•   От КЗ и переполюсовки (пока) полноценной защиты нет.. лучше не допускать. Но при желании, легко реализовать,  если дополнить схему и скеч соответвтующими (несложными) проверками. ( В последующих разработках надо бы это дело предусмотреть).
Скетч 
Спойлер
   
// 29.05.2019 8:58 При формировании заряда используются числа Фибоначи
// последний размер 28/5/19 20:38  - 878 байт ..
// Теперь качели не только по порогу, но и по скорости саморазряда = 60мВ/24часа если меньше - заряд.

// #include <util/delay.h> // библа для Тини 13 и можно применять  _delay_ms(1000); вместо delay(1000);

// #define ChargePin 5; // Пин для управления зарядом (симистором-оптроном, реле, мосфет)
//#define led1_Pin A7 // пин для мигания светиком - режим заряда
//#define vin_pin A4  // Пин для измерения напряжения до шунта
//#define vinakb_pin A0 // Пин для измерения напр на АКБ (после шунта на клеммах АКБ)
//#define simistor_pin A5  // Пин для управления симистором (оптроном)или реле
//#define knopka1_pin A3 // Пин для кнопки или кнопок (пока одной)
//#define  ChargePin  13    //Пин включения зарядки для Меги328

#define  ChargePin  2    //Пин включения зарядки для Тини13
// #define knopka1_pin A3 // Пин для кнопки 2
//#define   MaxVoltage  794     //Напряжение в конце зарядки, делитель 1/4, 20В = 1023, 15.5В = 794
#define   NormVoltage 736     //Напряжение 14,4 делитель 1/4, 20В = 1023, 14.4В = 736 это для убитых аккумов
//#define   NormVoltage 696     //Напряжение поддержки, делитель 1/4, 20В = 1023, 13.6В = 696 это для нормальных аккумов
#define   MinVoltage  552     //Напряжение в конце разрядки делитель 1/4, 20В = 1023, 10.8В = 552
#define   MinPorogKachel  635     //Нижний порог НРЦ  12,6=645, 12.4В = 635  12,8=655
//#define   break_Voltage  410     //Аварийное напряжение  делитель 1/4, 20В = 1023, 8.0 = 410

#define  VoltagePin 1    //Пин измерения напряжения на АКБ
//#define PauzaRaskachka = 7000;
//int PauzaRaskachka = 7000;

void setup(void){
//Serial.begin(9600); 
//Serial.println("cketch RASKACHKA 26/05/2019 21:15 ");
//pinMode(LoadPin, OUTPUT);  // конфигурация пина как выход
pinMode(ChargePin, OUTPUT); // включает заряд
pinMode(1, INPUT); // вольтметр, делитель из 62 кОм и 15 кОм(земля), значение в 1023 это будет 24.35 В.
//pinMode(2, OUTPUT); // релюха, симистор, мосфет, - включение заряда (отключение само собой тоже)
pinMode(3, INPUT); // кнопка, не тактовая либо будем измерять ток.. если позволит размер
// четвертый пин - земля, восьмой - питание
//  5 – красный, 6- желтый, 7-зеленый (пусть будут)
pinMode(5, OUTPUT); // 1-й светодиод красный, горит значит авария, мигает -отсутсвия контакта с АКБ
pinMode(6, OUTPUT); // 2-й светодиод  желтый - горит, значит идет заряд, часто мигает - пауза
pinMode(7, OUTPUT); // 3-й светодиод зеленый, если горит = КАЧЕЛИ, мигает если V >= 14,4В
// красный + желтый = напр ниже минимального (10,8В)
// зеленый мигающий + желтый = напр достигло порога 14,4 В
// зеленый + желтый = режим КАЧЕЛИ

//digitalWrite(ChargePin, 0);       //Отключаем зарядку
//digitalWrite(LoadPin, 0);         //Отключаем разряд (нагрузку)
//pinMode(Mode1Pin, INPUT_PULLUP);  // подтяжка внутренних резисторов
//pinMode(Mode2Pin, INPUT_PULLUP);
//pinMode(Mode3Pin, INPUT_PULLUP);
}

// функция раскачки по Фибоначи, идет непрерывно, при достижении порога (14,4) все начинается сначала
  void Raskachka () {
// раскачка постепенное увеличение с мин. длит имп 0,1сек  и фикс. паузы 7 сек
// используются глобальные переменные –  ChargePin
  // Serial.println("Raskachka");  // вывод в порт что идет раскачка
//lcd.setCursor(0,0); lcd.print("Raskachka");  // вывод в на экран что идет раскачка !определить курсор
// if (digitalRead(2) == HIGH) { // считывает состояние портов - кнопок
// }
int V =0;   
unsigned long StartTime =0;   //сразу вместо инт прибавило 18 байт
int PauzaRaskachka = 7000;

// ************ ГЛАВНЫЙ №1 ЦИКЛ **************************************************************
do {  // начало главного цикла №1

V = analogRead(VoltagePin);     //Измеряем напряжение
//-- проверка подключен ли АКБ и если напр ниже 1 вольта то крутится цикл и мигает красный 2 Гц ожидая подкл. АКБ

        while(V < 25){   // если НРЦ менее 0,5В
                pinMode(5, HIGH);  // загорается красный
                    delay(500);   
                pinMode(5, LOW);   // гаснет красный
                    delay(500);
                V = analogRead(VoltagePin);
        }     
   
  //digitalWrite(ChargePin, 1);    // Включаем зарядку
  //digitalWrite(6, HIGH);         // вклчючается желтый светодиод - ЗАРЯД
  //StartTime = millis();          // Запоминаем время начала зарядки

   int F =0;   //само число
   int A =100;   // задает начальную длинну импульса (0,1сек)
   int C=0;

// ======== вложенный цикл №2 формирования заряда и пауз до верхнего порога ===========
// =====  ЗАРЯД  ========================
      do {   // начало цикла №2
            F = A + C;  //само число фибоначи в миллисекундах
            C = A;
            A = F;
            digitalWrite(ChargePin, HIGH);    // Включаем зарядку
            digitalWrite(6, HIGH);         // вклчючается желтый светодиод - ЗАРЯД
           
            StartTime = millis();           
            int i = 0;
             do {  // цикл отрабатывает время длит имп = F 
                    // delay(100);                            //Ждем 0.1 сек
                     V = analogRead(VoltagePin);     //Измеряем напряжение при заряде
                   /*  //------------------------------------------ проверка на низкое напр
                      if((V < MinVoltage)&&(i=0)){
                           pinMode(5, HIGH);  // загорается красный
                      }
                      else {
                             pinMode(5, LOW);  // гаснет красный
                      }
                      // ----------------------------------------------------------------------------
                      */
             }  while ((V < NormVoltage) && (StartTime + F > millis()) );

// ========== ПАУЗА ===================================================================
      digitalWrite(ChargePin, LOW);             //Выключаем зарядку
      digitalWrite(6, LOW);  // выклчючам желтый светодиод заряда
    //  StartTime = millis();                   //Запоминаем время начала паузы

// ПРОВЕРКА ЕСЛИ НАПР ВЫШЕ ПОРОГА!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      if( V >= NormVoltage) break ; // выход из цикла №2 - передача для проверки длит имп

// ------- ПАУЗА 40 сек.  если длит имп > 40 минут ------------------------------------

      if(F > 2400000){ //если импульс заряда превышает 40мин.(2400сек =2400000млс)
           // Serial.println("impuls F >40min =   "); Serial.print (F);  // вывод в порт 
       StartTime = millis();
           do {
               digitalWrite(6, HIGH);  // выклч желтый светодиод заряда   
               delay(100);                            //Ждем 1 сек
               digitalWrite(6, LOW);  // выклч желтый светодиод заряда             
               // V = analogRead(VoltagePin);     //Измеряем напряжение в паузе
               //Serial.println("Voltage   ");  Serial.print(V);  // вывод в порт 
               // lcd.setCursor(0,0); lcd.print(Voltage);  // !здесь надо определить куда?
           } while (StartTime + 40000 >= millis());  // пауза 40сек.
      }  // конец if проверкии   

// -------- ПАУЗА 7 сек -----------------------------------------------------------------
      do { 
              digitalWrite(6, HIGH);  // выклч желтый светодиод заряда   
              delay(100);                            //Ждем 1 сек
              digitalWrite(6, LOW);  // выклч желтый светодиод заряда     
              //V = analogRead(VoltagePin);     //Измеряем напряжение в паузе
      } while (StartTime + PauzaRaskachka >= millis()) ;

      //delay(100);                            //Ждем 0.1 сек
      //V = analogRead(VoltagePin);     //Измеряем напряжение
     
   } while (V < NormVoltage );  // Цикл №2 завершение
     
//-------Если СЮДА ПОПАЛИ то V > 14.4v, теперь проверяем длит имп, если меньше 1сек то КАЧЕЛИ,
      if( F < 1000){
        // Если сюда попали, значит АКБ уже накушался и пора делать КАЧЕЛИ
        //StartTime = millis();
       // unsigned long Dt =0;
        int Vs=0; int V1=0; int i =0;
// ====  ПАУЗА В КАЧЕЛЯХ ========================================================
          do{  // цикл формирования паузы
               digitalWrite(7, LOW);  // вклч зел светодиод
               delay(1000);                            //Ждем 1 сек
               digitalWrite(7, HIGH);  // oтключаем зел светодиод
                //V = analogRead(VoltagePin);     //Измеряем напряжение
               for(int i=0; i<=30; i++) {
                  V = analogRead(VoltagePin);    //Измеряем напряжение
                  Vs =Vs + V;
               }
               V = Vs / 30; // вычисляем дейстующее среднее НРЦ на АКБ

   // попробуем вычислить когда скорость саморазряда будет меньше 10мВ за 2-5часов
   // засекаем время и напряжение на АКБ когда напр упало ниже 13,1-1,30 вольт (линейное..)

               if(( V < 675) && (i=0)){ // если НРЦ достигло 13,2V -запоминается (один раз)
                   i = 1;   //фдажок который дает выполнится условию только один раз
                   V1 = V;  // запомнили напряжение 1
                   StartTime = millis();  //запомнили время
               }
               //V2=V; 
               Vs=0; // сбрасываем для следующих измерений
   // Если скорость саморазряда меньше чем 3 АЦП (0,06 В) за 24часа (86400000 мл сек) то выход из цикла
               if((( millis() - StartTime) >86400000 )&& ((V1-V)<3)) break ;
             
         } while(V > MinPorogKachel);
// ===== КОНЕЦ ПАУЗЫ В КАЧЕЛЯХ =====================================================
      }  // выход из условия формирователя паузы в качелях
     
      // А если F (длит имп) больше, то просто идет перезапуск.. или после качели-паузы
     
//===== КОНЕЦ ГЛАВНОГО ЦИКЛА №1
} while ( V = 0 ); // конец - проверка главного цикла

}  // ******  конец функции раскачки

void loop(void){
Raskachka();
}

--------------------------------------------------------------------------------------------------------------------------------------------
[b-b]Краткий путеводитель по теме[/b-b]  Последнее обновление 17.08.2018 0:49
Спойлер

1страница    - методы изм вн. Сопр, схемы и скетчи от Alex_N  и Dunkel
Спойлер
•   ответ №1    Метод измерения вн. Сопр. В режиме заряда, обсуждение.
•   ответ №2    Схема импульсной моргалки-долбилки на транзисторе
•   ответ №5    Про метод Вологина (опр вн. Сопр.) обсуждение
•   ответ №12    Alex_N  скетч долбилки
•   ответ №13   Данные по скорости измерений INA219
•   ответ №14   Dunkel  реализует метод изм вн. Сопр на ESP32 (32 измерения за 0,3мс.)
•   ответ №16   Dunkel  схема и скетч на ESP32

Спойлер

2стр.   
3стр.   
4стр.   
5стр.   
6стр.   
7стр.   
8стр.   
9стр.   
10стр.   
11стр.   
12стр.   
13стр.   
14стр.   
15стр.   
16стр.   
17стр.   
18стр.   
19стр.   
20стр.   
21стр.   
22стр.   
23стр.   
24стр.   
25стр.   
26стр.
37стр - UriBas https://electrotransport.ru/index.php?msg=1643528 исходный скетч, описание алгоритма моргалки с применением чисел Фибоначи и "дельты".    https://electrotransport.ru/index.php?msg=1653798 - логи опытов.   Скетч переделанные под мегу328 скетч переделанные под мегу328
38стр  - функциональные схемы алгоритма заряда и разряда,
39стр -   дебаты по вопросам [user]ДМ[/user] относительно алгоритма,  обсуждение по необходимости изм температуры и т.п.
46стр

Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

UriBas

#1
Цитата: Alex_N от 01 Апр. 2018 в 16:10Кто нибудь может дать совет, как в ардуино лучше всего Rвн мерить. А то я останавливаю ШИМ, подллючаю одну нагрузку, выдерживаю 10 сек, подключаю другую, опять 10 сек, короче долгая музыка получается ( как на Украине говорят ). А если пытаюсь в процессе, то пляшет от скажем 1 до 26. Т.е. даже усреднять бесполезно. А хотелось бы прямо в процессе.
[user]Alex_N[/user],  Есть метод (сам еще не пробовал) примененный [user]dimax[/user] - http://arduino.ru/forum/proekty/poloumnaya-zaryadka-dlya-ni-mh-akkumulyatorov?page=2#comment-141927
Вот выдержка -
ЦитироватьПопробовал сейчас измерять внутреннее сопротивление не  традиционным способом ( с резистором-нагрузкой и без), а под зарядным током. В конце зарядки, перед тем, как отключить зарядный ток измеряю текущий ток (I), и текущее напряжение на аккуме (U1), потом отключаю зарядный ток, измеряю напряжение ничем не нагруженого аккума (U2), далее по формуле Rвн = (U1-U2)/ I ; Получается очень похоже на правду, в принципе я об этот спрособе писал и раньше, но сам ни разу не пробовал )
А вот его скетч - http://arduino.ru/forum/proekty/tester-akkumulyatorov-dlya-lotka#comment-139958
Спойлер
Измеряю пока двумя разными способами.
Первый способ -  коммутирую мосфет к резистору 75 ом, снимаю напряжение,  вычисляю ток. Отключаю резистор мосфетом. Включаю другой резистор 8 ом, тоже измеряю, отключаю. Потом по формуле вычисляю. Второй способ точно как в статье с картинками, описывать не буду. Эти методы дают немного разные результаты, но что точнее не ясно, не с чем сравнить.  Что б улучшить разрешение АЦП работает в оверсемплинге. Вот текущий скетч если интересно:

#define r1 71.78
#define r2 7.645
void setup() {
Serial.begin(9600);
pinMode(9,OUTPUT); //ключ резистора R1
pinMode(8,OUTPUT); //ключ резистора R2
pinMode(A5,INPUT_PULLUP); // START KEY
}

void loop() {
if (digitalRead(A5)==0) {

//metod 1 Метод №1
float volt_zero= adc();
digitalWrite(9,HIGH);
float volt_start= adc();
digitalWrite(9,LOW);
digitalWrite(8,HIGH);
float volt_end= adc();
digitalWrite(8,LOW);
float Rvn= (volt_start-volt_end) / ((volt_end/r2)-(volt_start/r1));
Serial.print("Metod_1 ");
Serial.print("Rv=");
Serial.print(Rvn,3);

//metod 2 Метод №2
volt_zero= adc();  //  вот..  adc();  это функция измерения (внизу которая)
digitalWrite(9,HIGH);
volt_start= adc();
digitalWrite(8,HIGH);
volt_end= adc();
digitalWrite(9,LOW);
digitalWrite(8,LOW);
Rvn= (volt_start-volt_end) / (volt_start/r2);
Serial.print("  Metod_2 ");
Serial.print("Rv=");
Serial.print(Rvn,3);
Serial.println();
} //end if dig.read(a5)
} //end loop


float adc(){ // Это декларируется (создается) функция замера АЦП с оверсемплингом
uint32_t adc_buff=0;
for (int n=0; n<=4095; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=6; // 65472 full scale 16bit
return (float)adc_buff/65472*4.99;
}
Можно еще почитать книжку "ИЗМЕРЕНИЕ ВНУТРЕННЕГО СОПРОТИВЛЕНИЯ СВИНЦОВО-КИСЛОТНОГО АККУМУЛЯТОРА
В РЕЖИМЕ ЕГО ЗАРЯДКИ"  (прикрепил файл)
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

UriBas

#2
Цитата: Alex_N от 05 Апр. 2018 в 17:42Схема базисная отсюда http://akumuliatory.com/desulfatatsii-avtomobilnogo-akumulyatora-svoyimi-rukami/.   Примерно одна из них. (первое что в поиске попалось).
Эта? 
Спойлер
Да, интересно будет посмотреть результат, только скетч и схему приложите, чтобы кому интересно могли повторить без лишних хлопот.
Цитата: Dunkel от 05 Апр. 2018 в 19:09Кто-нибудь может объяснить,  к чему этот поток сознания?
Ну это в свете последних изысканий СанСаныча и Владимира..  - влияние ШИМ частот до 2кГц на эффективность.  Генератор на 555 надо крутить вручную, а на Ардуине можно менять в зависимости от состояния АКБ, может пригодится..
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

Dunkel

Цитата: UriBas от 05 Апр. 2018 в 20:11- влияние ШИМ частот до 2кГц на эффективность. 

А эффективность как меряют?
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

Dunkel

#4
На мой взгляд, попытки управлять процессами в ХИТ с привязкой к фиксированным временным интервалам (частоте ШИМ в данном случае) не совсем уместны.  Это ведь не замкнутая механическая система, там протекают десятки различных химических реакций, они зависят от внешних факторов, которые меняются по времени.
Тут лучше подходит последовательный алгоритм, который адаптивно меняет длительность импульса и паузы в зависимости от реакции АКБ.
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

UriBas

#5
Цитата: Dunkel от 05 Апр. 2018 в 20:43На мой взгляд, попытки управлять процессами в ХИТ с привязкой к фиксированным временным интервалам (частоте ШИМ в данном случае) не совсем уместны.  Это ведь не замкнутая механическая система, там протекают десятки различных химических реакций, они зависят от внешних факторов, которые меняются по времени.  Тут лучше подходит последовательный алгоритм, который адаптивно меняет длительность импульса и паузы в зависимости от реакции АКБ. 
Абсолютно согласен, что нужен гибкий алгоритм, мы как раз и двигаемся  в эту сторону.  Но параллельно идут исследования по изменению вн. сопр.  и по частотам, тем более что [user]SanSanich[/user], в теме "Самодельный измеритель Rвн" https://electrotransport.ru/index.php?topic=53465.0#quickreply достиг успехов в реализации метода изм вн. сопр. переменкой и даже можно мерить во время заряда, есть графики хорошо иллюстрирующие зависимость.   

Как по мне, это конечно здорово отслеживать по вн. сопр., но и "дельта" тоже достаточно точно отображает эту зависимость (что лучше - еще не известно), ведь по сути, размах амплитуды импульсов относительно определенного значения тока и времени - это и есть показатель состояния ХИТ и его вн. сопр.  Интересен и Ваш подход с кварками, когда по сути идет подстройка частоты ШИМ..  а не только скважности.

Кстати, про размах амплитуды (дельта) - метод Вологина как раз так и предполагает изм. вн. сопр.   Сначала замеряют ЭДС -V1  (НРЦ в паузе), потом подают определенный ток Y и снова мерят напряжение V2  затем вычисляют вн. сопр.    Rвн =(V2  -V1)/ Y     Единственно, там еще делают замеры при другом токе, потом еще и при разряде, потом вычисляют среднее.. это конечно точнее, но в принципе у Вас как раз реализован метод измерение напр. в каждом кварке..  если усреднить все кварки, вычесть НРЦ в паузе и поделить на ток,  то получится примерно то же самое, а может и точнее, потому что больше вычислений.
http://chem21.info/page/043252241175073137240123085103234095079153129093/
http://chem21.info/page/026055139030242085200125147108219179192177126029/
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

Alex_N

Цитата: UriBas от 05 Апр. 2018 в 20:11Эта?
Да эта. Только я выкинул всё что левее транзистора а вместо этого поставил оптопару TLP620  и выход с ардуины. Ну и кренка 5В. Я уже написал, что использовал у же ненужные полудохлую ардуину и предыдущий вариант платы, на которой катушки уже были смонтированы.
Для Dunkel повторяю, что это просто попытка посмотреть будет ли этот десульфатор реально помогать.
Скетч ( если нужен ) выложу позже. Он дома, а я на работе. Да там весь скетч из десяти строк (примерно).

Dunkel

Цитата: UriBas от 05 Апр. 2018 в 22:06если усреднить все кварки, вычесть НРЦ в паузе и поделить на ток,

Осталось понять, каким образом измерять ток в коротких импульсах порядка 1мс.  INA219?

PS Все-таки кванты, а не кварки. Так глубоко я еще не залезал.
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

UriBas

Цитата: Alex_N от 06 Апр. 2018 в 07:50Для Dunkel повторяю, что это просто попытка посмотреть будет ли этот десульфатор реально помогать.  Скетч ( если нужен ) выложу позже. Он дома, а я на работе. Да там весь скетч из десяти строк (примерно). 
Вот на сколько будет "помогать" - это зависит от алгоритма, от схемотехники..  поэтому и надо прилагать скетч и схему, чтобы было ясно, ну и (повторяюсь) чтобы можно быстро повторить, кто хочет продолжить эстафету", иначе какой смысл?
Цитата: Dunkel от 06 Апр. 2018 в 10:04Осталось понять, каким образом измерять ток в коротких импульсах порядка 1мс.  INA219? PS Все-таки кванты, а не кварки. Так глубоко я еще не залезал.
Ну да, кванты..  Мерить ток можно и INA219, она сама хорошо усредняет и выдает готовый результат..  по моему, очень хорошо, заодно и емкость мерить получится, что немаловажно.   
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

Dunkel

Цитата: UriBas от 06 Апр. 2018 в 10:35Мерить ток можно и INA219, она сама хорошо усредняет и выдает готовый результат.. 

Так нам нужно мгновенное значение тока в импульсе или усредненное пачки импульсов?
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

UriBas

Цитата: Dunkel от 06 Апр. 2018 в 11:38Так нам нужно мгновенное значение тока в импульсе или усредненное пачки импульсов?
В идеале, надо бы мерить в импульсе ток и напряжение.. выборок побольше, потом усреднять.   Но надо прикинуть по возможностям.
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

Dunkel

Цитата: UriBas от 06 Апр. 2018 в 12:00
В идеале, надо бы мерить в импульсе ток и напряжение.. выборок побольше, потом усреднять.   Но надо прикинуть по возможностям.

Вы вроде пробовали INA219, какая там длительность измерения?
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

Alex_N

Как и обещал, прикладываю скетч.
А вообще насколько меньше деталей у десульфатора получилось, по сравнению с LM555 ! Не нужно никакой обвязки практически.
Прикольная получилась штуковина - цепляешь к АКБ и она себе жужжит. Если толку не будет, то МЧС получится. От той тоже только жужжание.

UriBas

#13
Цитата: Dunkel от 06 Апр. 2018 в 12:23Вы вроде пробовали INA219, какая там длительность измерения?
По даташиту  такие показания
12 bit+1sp    - 532μs  (1 сэмпл -выборка за 0,532мс)
12 bit+2sp    - 1.06ms
12 bit+4sp   - 2.13ms
12 bit+8sp   - 4.26ms (8 сэмплов -выборок за 4,26мс)
12 bit+16sp   - 8.51ms
12 bit+32sp   - 17.02ms
12 bit+64sp   - 34.05ms
12 bit+128sp    -68.10ms
Сломался было у меня модуль, провозился пару дней  пока сделал, еще празник..  На практике в библиотеках не нашел, как выставить к примеру   - 12 bit+8sp   4.26ms .. сейчас уже вычитал по даташитам и сваял в экселе расчеты для записи в регистры, как только сделаю, выложу здесь результаты. 
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

Dunkel

[user]UriBas[/user],  слишком долго.
ESP32 с 12-битным АЦП делает 32 измерения за 0,3мс. Как раз подходит для измерения в импульсе.
Попробовал измерить R моргалкой по Вашей методике:

Цитата: UriBas от 05 Апр. 2018 в 22:06Сначала замеряют ЭДС -V1  (НРЦ в паузе), потом подают определенный ток Y и снова мерят напряжение V2  затем вычисляют вн. сопр.    Rвн =(V2  -V1)/ Y   

Сделал по простому - резистор 0,1 Ом в качестве шунта, на нем измеряется ток.
Итак, моргалка на esp32, АКБ 6В 1,2Ач, БП 8В.  Дельта 0,4В

Заряд около суток:


Длительность импульса и паузы в мс:


Какое-то R (наверное надо еще вычесть 0,1 шунта):


Это ток в импульсе:


Напряжение в импульсе:


Последний график наглядно демонстрирует, почему я измеряю дельту не в импульсе, а сразу после него. 
Хотя некоторые товарищи, в теме про "Анализы", утверждали, что это неправильно.

Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

UriBas

Цитата: Dunkel от 11 Апр. 2018 в 21:39
Спойлер

[user]UriBas[/user],  слишком долго.
ESP32 с 12-битным АЦП делает 32 измерения за 0,3мс. Как раз подходит для измерения в импульсе.
Попробовал измерить R моргалкой по Вашей методике:

Сделал по простому - резистор 0,1 Ом в качестве шунта, на нем измеряется ток.
Итак, моргалка на esp32, АКБ 6В 1,2Ач, БП 8В.  Дельта 0,4В

Заряд около суток:


Длительность импульса и паузы в мс:


Какое-то R (наверное надо еще вычесть 0,1 шунта):


Это ток в импульсе:


Напряжение в импульсе:
Последний график наглядно демонстрирует, почему я измеряю дельту не в импульсе, а сразу после него. 
Хотя некоторые товарищи, в теме про "Анализы", утверждали, что это неправильно.
Вы имели ввиду разницу напряжений между первым и последним графиками?

На счет измерения Rвн очень наглядно вышло..  и по моему вполне адекватно.  Так что, в общем, алгоритм хорошо отрабатывает Rвн.   Было бы конечно еще неплохо сравнить с классикой и по возможности с переменкой типа Ланкола".   У Вас там получилась разная частота ШИМ, вначале -333 в конце - 72Гц.  Поскольку пауза увеличивалась ступенчато, то хорошо видно, как меняется Rвн в импульсе и как это отрабатывает дельта!

По вкаченной емкости в АКБ 6В 1,2Ач. 
По графику тока, средний ток до 7,2В держался на уровне 1,8А, время до 7,2В составляет примерно 23000сек = 6ч 23м  и емкость примрно = 11,4Ач,  поскольку коэф заполнения около 30% и по идее должно закачаться не менее 4Ач ..  Мысль такая, проверить это дело, на сколько ЗУ реально закачивает до 7,2 (14,4В или 2,4на банку) емкости?

Потом добивка +13часов.. средний ток около 1,6А , коэф заполения в среднем около 12%.. значит еще вкачено было около 2Ач .. тоже интересно было бы проверить.

Да, и вложите в Ваш этот пост с графиками - скетч и схемку (или ссылку на схему), я это дело прикреплю на первой странице..  по моему хороший опыт!
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

Dunkel

Цитата: UriBas от 12 Апр. 2018 в 12:39Вы имели ввиду разницу напряжений между первым и последним графиками?

Конечно, особенно в начале заряда. Если дельту измерять в импульсе - заряд просто не начнется, будет срабатывать отсечка.

Цитата: UriBas от 12 Апр. 2018 в 12:39По вкаченной емкости в АКБ 6В 1,2Ач. 
По графику тока, средний ток до 7,2В держался на уровне 1,8А, время до 7,2В составляет примерно 23000сек = 6ч 23м  и емкость примрно = 11,4Ач,  поскольку коэф заполнения около 30% и по идее должно закачаться не менее 4Ач ..

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

Схема:


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

Скетч для измерения R:
Спойлер

// analogread-esp32
// 12/04/2018
// (c)dunkel
// esp32, питание 5V stab
// Pin32 - заряд, на затвор мосфета
// Pin33 - разряд, на затвор мосфета
// PinА1 - напряжение с делителя АКБ 1k/5.1k
// PinА3 - шунт 0.1Ом

#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
unsigned long t;
int pin = 32;
void setup() {
  Serial.begin(9600);
  SerialBT.begin("ESP32test"); //Bluetooth device name
  pinMode(pin, OUTPUT); // - на затвор мосфета заряда
  digitalWrite(pin, LOW); //
}
void loop() {
  float U0 = 0;
  float U1 = 0;
  float U2 = 0;
  float I = 0;
  float R = 0;
  t = micros();
  //  delay(700);
  U0 = readU016();
  t = micros() - t;
  Serial.print(" 32 000 ar, U0 ");  Serial.print(U0, 4);
  Serial.print("  ,t = ");   Serial.print(t); Serial.print(" us");
  SerialBT.print(",  32 000 ar, U1 ");  SerialBT.print(U0, 4);
  SerialBT.print("  ,t = ");   SerialBT.print(t); SerialBT.print(" us");
  t = micros();
  digitalWrite(pin, HIGH); //
  //  delayMicroseconds(400);
  U1 = 0;
  U2 = 0;
  for (int j = 1; j <= 32; j++) {
    U1 += analogRead(A0);
    U2 += analogRead(A3);
  }
  U1 = U1 * 0.0001816;
  U2 = U2 * 0.0001834;
  digitalWrite(pin, LOW); //
  t = micros() - t;
  I = (U2 - U1) * 10;
  R = (U1 - U0) / I - 0.1;
  Serial.print("  32 ar, U1 "); Serial.print(U1, 4);
  Serial.print("  32 ar, U2 "); Serial.print(U2, 4);
  Serial.print(" , I "); Serial.print(I, 4);
  Serial.print(" , R "); Serial.print(R, 4);
  Serial.print("  ,t = ");   Serial.print(t); Serial.println(" us");
  SerialBT.print("  32 ar, U1 "); SerialBT.print(U1, 4);
  SerialBT.print("  32 ar, U2 "); SerialBT.print(U2, 4);
  SerialBT.print(" , I "); SerialBT.print(I, 4);
  SerialBT.print(" , R "); SerialBT.print(R, 4);
  SerialBT.print("  ,t = ");   SerialBT.print(t); SerialBT.println(" us");
}


// Измерение UAK 32000, длительность 300мс
float readU016() {
  long U1 = 0; //Напряжение на АКБ
  float result = 0.0;
  float V1 = 0.0;
  float K1 = 0.0000001814; // 32000 300ms 5.1k/1k esp32
  for (int j = 1; j <= 32000; j++) {
    U1 += analogRead(A0);
  }
  V1 = U1 * K1;
  result =  V1;
  return result;
}


Немного поправил процедуру относительно той, что была в моргалке, теперь результаты больше похожи на правду:


Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

Alex_N

#17
Согласен, больше не буду. Да и решил не на ad711 а на ad623. Там и делов то - один резистор припаять. Ну и шунт разумеется. Для ардуино - то что надо.
... А ведь мы молчим, что здесь ветка про ардуино, а не что то другое.