ЗУ на Ардуино от Dkin

Автор Dkin, 14 Май 2018 в 10:26

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

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

Dkin

В этой теме выделил свой вариант зарядки для аккумуляторов на основе ардуино нано. Здесь можно задавать вопросы по ее наладке и работе. В перспективе планируется сделать одно устройство для заряда и разряда, а также для проведения одного или нескольких КТЦ.

Возможности: регулируемый цикл заряд пауза (в секундах) и несущей частотой (1-350 Гц). При достижении напряжения отсечки (14,4В) происходит уход в паузу отсечки на настраиваемое время.

Что нужно:
1. Ардуино нано, программируется USB.
Спойлер

2. Программа для загрузки программ в ардуино с сайта arduino.cc - она стандартна и незамысловата, ничего сложного нет.
    Вкладка Software - Download the Arduino IDE.

3. Драйвер для работы с платой ардуино
В моем случае это CH340 - устанавливаем один раз.
Спойлер


Название загрузчика, для которого устанавливается драйвер обычно пишут в описании к ардуино.


4. Программа ЗУ:
Спойлер

// Общие настройки - Несущая частота
float freq = 35.00; // частота в Гц (от 1 до 350)
float skv1 = 50.00; // коэффициент заполнения (от 1 до 99)

// 1 этап Модулирующие импульсы
long zar1 = 30; // время заряда в сек (от 1 сек)
long pauseosn1 = 10; // время паузы в сек (от 1 сек)

// 2 этап работа отсечки
float Uots = 14.40; // напряжение отсечки
long pauseots1 = 30; // время паузы в сек (от 1 сек)
float koeffU = 0.0276391555; //коэффициент делителя напряжения - подобрать опытным путем, чтобы отсечка срабатывала при Uots

float Uots1 = Uots/koeffU*10;
float impnes1 = 0.00;
float pausenes1 = 0.00;
long previousMillis = 0;
float Utek = 0.00;

void setup()
{
   pinMode(13, OUTPUT); // используем 13 выход для управления ключом, на нем также висит синий светодиод, располагающийся на плате, для наглядности
   pinMode(10, OUTPUT); // внешний светодиод
   impnes1 = 10 * skv1 / freq; // расчет импульса заряда несущей частоты
   pausenes1 = 10 * (100 - skv1) / freq; // расчет паузы несущей частоты
}
void loop()
{
label2:
// расчет основного цикла заряд/пауза
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > zar1*1000) // если время заряда истекло
{
    digitalWrite(13, LOW); // выключаем ключ
    digitalWrite(10, LOW); // выключаем внешний светодиод
    delay (pauseosn1*1000); // пауза основного цикла
    currentMillis = millis();
    previousMillis = currentMillis;
}
// работа импульсов несущей частоты
  digitalWrite(10, HIGH); // включаем внешний светодиод
  digitalWrite(13, HIGH); // включаем ключ
  delay(impnes1 );                     
  Utek=0;
  for (int i = 0; i <10; i ++)  Utek+=analogRead(A3); // измеряем напряжение на входе А3 10 раз подряд и прибавляем друг к другу
  if (Utek > Uots1) // если измеренное напряжение больше напряжения отсечки
{
goto label1; // перейти на паузу отсечки
}
  digitalWrite(13, LOW); // отключаем ключ
  delay( pausenes1 );
  goto label2; // пропустить паузу отсечки
label1:
    digitalWrite(13, LOW); // выключаем ключ
    digitalWrite(10, LOW); // отключаем внешний светодиод
    delay (200);
    digitalWrite(10, HIGH); // включаем внешний светодиод
    delay (200);
    digitalWrite(10, LOW); // отключаем внешний светодиод
    delay (200);
    digitalWrite(10, HIGH); // включаем внешний светодиод
    delay (200);
    digitalWrite(10, LOW); // отключаем внешний светодиод
    delay (200);
    digitalWrite(10, HIGH); // включаем внешний светодиод
    delay (200);
    digitalWrite(10, LOW); // отключаем внешний светодиод
    delay (pauseots1*1000-1200); //пауза после отсечки минус 1,2 сек (мигание светодиода)
    currentMillis = millis();
    previousMillis = currentMillis;
}

Первые семь строк - настройка.

5. Схема.
Ключ заряда (порт D13), ключ разряда (порт D4), делитель напряжения (порт А3), внешний светодиод (порт D10).
Внешний светодиод - горит при заряде постоянно.
При достижении напряжения отсечки - мигает три раза и выключается.
Порты А4 и А5 остаются свободными для подключения в будущем устройств по i2c шине, например, двухстрочного экрана. В ардуино нано порт А4 - SDA, порт А5 - SCL.
Кнопка и разрядный ключ тоже пока не используются.
Спойлер




6. Печатная плата (45х65 мм).
Спойлер




Т.о. в моем примере время заряда - 30 сек, паузы 10 сек, несущая частота 35Гц с коэффициентом заполнения 50%. При достижении напряжения 14,4В на АКБ происходит уход в паузу на 30 сек.

---------------------------------------------------------------------------------------------------------------------------------

Отдельное устройство для разряда аккумулятора.

Алгоритм:

Разряд/пауза - 21/7 секунд

Если напряжение в паузе не поднимается выше 12В, разряд прекращается.

Времена и напряжение останова можно в программе изменять.

Схема:
Спойлер



Программа:
Спойлер

float Utek = 0.00;
float KoefU = 1313.600;

void setup() {
Serial.begin(9600); 
pinMode(13, OUTPUT); //светодиод на плате, для наглядности
   pinMode(4, OUTPUT); //ключ разряда
}

void loop() {
  delay(5000);
   for (int i = 0; i <20; i ++)  Utek+=analogRead(A3); // измеряем напряжение на входе А3 20 раз подряд и прибавляем друг к другу
Serial.println("NRC" );
Serial.println(Utek/KoefU);

  label1:
  digitalWrite(13, HIGH); 
  digitalWrite(4, HIGH);
  delay(21000); // пауза 21 сек.
  Utek=0;
  for (int i = 0; i <20; i ++)  Utek+=analogRead(A3); // измеряем напряжение на входе А3 20 раз подряд и прибавляем друг к другу
Serial.println("nagruzka" );
Serial.println(Utek/KoefU);

  digitalWrite(13, LOW);   
  digitalWrite(4, LOW);
  delay(7000);                       // пауза 7 сек.
 
  Utek=0;
  for (int i = 0; i <20; i ++)  Utek+=analogRead(A3); // измеряем напряжение на входе А3 20 раз подряд и прибавляем друг к другу
Serial.println("pause" );
Serial.println(Utek/KoefU);
if (Utek/KoefU < 12.00) // если измеренное напряжение меньше 12.00 В, прекращаем разряд.
{
  Serial.println("STOP" );
goto label2;
}
goto label1;
label2:
delay(100000);     
goto label2;
}

Внешний вид:
Спойлер



Dkin

Добавил экран 1602 к разрядному устройству.
Теперь при подключении его к аккумулятору отображается НРЦ, затем в работе напряжение в паузе, при нагрузке.
При достижении напряжения 12В разряд прекращается, отображается время разряда.

Спойлер

// библиотеки экрана
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

float Upayse = 0.00; //напряжение в паузе
float Unagr = 0.00; //напряжение при нагрузке
float KoefU = 1313.600;
int timeMin; //переменные для расчета времени
int timeH;
LiquidCrystal_I2C lcd(0x27,16,2); // присваиваем имя lcd для дисплея 16х2

void setup() {
  lcd.init();                    // Инициализация lcd             
  lcd.backlight();         // Включаем подсветку
  Upayse=0;
  for (int i = 0; i <20; i ++)  Upayse+=analogRead(A3); // измеряем напряжение на входе А3 10 раз подряд и прибавляем друг к другу
lcd.print("NRC");
lcd.setCursor(8, 0);
lcd.print(Upayse/KoefU); 

Serial.begin(9600); 
pinMode(13, OUTPUT); // используем 13 выход для управления ключом, на нем также висит синий светодиод, располагающийся на плате, для наглядности
   pinMode(4, OUTPUT);
}
void loop() {
  delay(5000);
label1:
  digitalWrite(13, HIGH);
  digitalWrite(4, HIGH);
  delay(21000); // пауза 21 секунды
  Unagr=0;
  for (int i = 0; i <20; i ++)  Unagr+=analogRead(A3); // измеряем напряжение на входе А3 20 раз подряд и прибавляем друг к другу
Serial.println("nagruzka" );
Serial.println(Unagr/KoefU);
  digitalWrite(13, LOW);   
  digitalWrite(4, LOW);
  delay(7000);                       // пауза 7 секунд 
  Upayse=0;
  for (int i = 0; i <20; i ++)  Upayse+=analogRead(A3); // измеряем напряжение на входе А3 20 раз подряд и прибавляем друг к другу
Serial.println("pause" );
Serial.println(Upayse/KoefU);
timeMin = millis()/1000/60;
timeH = millis()/1000/60/60;
timeMin = millis()/1000/60 - timeH*60;

  lcd.print(Upayse/KoefU); 
  lcd.setCursor(8, 0);
  lcd.print(Unagr/KoefU);
  lcd.setCursor(0, 1);
  lcd.print(timeH);
  lcd.setCursor(4, 1);
  lcd.print("H");
  lcd.setCursor(7, 1);
  lcd.print(timeMin);
  lcd.setCursor(10, 1);
  lcd.print("Min");
   
if (Upayse/KoefU < 12.00) // если измеренное напряжение меньше 12.00 В
{
  Serial.println("STOP" );
goto label2; // перейти на паузу
}
goto label1;
label2:
delay(100000);     
goto label2;
}

Паяка

Есть смысл добавить и SD-карту, получится логгер. Правда, сама карта может при этом быстро изнашиваться. Мне не встречалась информация, как именно на аппаратном уровне работает стандартная библиотека Ардуино для работы с SD, как у неё устроена буферизация.
GT TF1 60V 20Ah Chilwee DZF

Necromant

Цитата: Паяка от 14 Июль 2018 в 18:29
Есть смысл добавить и SD-карту, получится логгер. Правда, сама карта может при этом быстро изнашиваться. Мне не встречалась информация, как именно на аппаратном уровне работает стандартная библиотека Ардуино для работы с SD, как у неё устроена буферизация.
Нет там буферизации практически, там опреативы всего 2 кб, пишется все в реалтайме
чтобы долше флешка не дохла есть смысл форматировать на 1-5 Мб и сдвигать рабочий участок по мере деградации
так флешка в 2 гига при форматировании по 10 Мб и с ресурсом в 500 циклов перезаписи выдержит 100 000 логов
если по 10 логов снимать в день то на 27 лет хватит

Кass

Цитата: Dkin от 14 Май 2018 в 10:265. Схема.

Я бы не стал на 7805 подавать 19В. Я бы сначала поставил 7812, а только потом 7805. Ну или ставить нужно DC/DC преобразователь, который по входу имеет 9-36В.
АРМ стенда онлайн: http://scada.kontar.ru Пользователь: Электротранспорт, Пароль: 111111

Гербалайф от всех болезней, Кашпировский лучший врач,  Орифлейм самая лучшая косметика, а МММ самый лучший способ вложения денег. Кто бы спорил. ;)

Паяка

[user]Necromant[/user], писали, что встроенный контроллер SD-карты каждый раз пишет на новое место, но утверждать не буду. Ещё и контроллеры могут попадаться разные.

Добавлено 16 Июль 2018 в 13:03

Цитата: Кass от 16 Июль 2018 в 10:34DC/DC преобразователь, который по входу имеет 9-36В
Самый компактный и дешёвый на MC34063, можно добыть из телефонной зарядки от прикуривателя.
GT TF1 60V 20Ah Chilwee DZF

Necromant

Цитата: Паяка от 16 Июль 2018 в 13:01
[user]Necromant[/user], писали, что встроенный контроллер SD-карты каждый раз пишет на новое место, но утверждать не буду. Ещё и контроллеры могут попадаться разные.
верно, но в пределах диапазона адресов указанных в FAT

Иван77

[user]Dkin[/user], попробую в ближайшее время.
Ездю и ездю.

vovn

похоже тема умерла так и не дойдя до логического совершенства

Иван77

[user]vovn[/user], пробовал, получал сильно недозаряженную АКБ, как и прочие "моргалки" проигрывает обычному СС в скорости заряда.
Ездю и ездю.

Vova_n

Цитата: Иван77 от 05 Янв. 2023 в 09:02пробовал, получал сильно недозаряженную АКБ, как и прочие "моргалки" проигрывает обычному СС в скорости заряда.
НЕ стоит за Вована говорить, это дело не благодарное.

Иван77

[user]Vova_n[/user], при чем тут ты?
Ездю и ездю.

vovn

Цитата: Иван77 от 05 Янв. 2023 в 14:13Vova_n, при чем тут ты?
не обращай внимание, это последствия нового года еще сказываются у людей.
т.е. с моргалками мучится не стоит, время потеряю больше?
на ардуинке сколько проектов пересмотрел или "недодел" или примитив с кривой логикой

Иван77

[user]vovn[/user], посмотри тему "Уклон". Проделана огромная работа. Развивается стремительно, есть определённые результаты.
Ездю и ездю.

Vova_n

[user]Иван77[/user], Ох да.. пардон, чёт мне причудилось, что мой ник использован в цитате  :-D глаз за мылился,  видосов надо меньше смотреть  O_O