Электротранспорт
Пожалуйста, войдите или зарегистрируйтесь.


Расширенный поиск    

Реклама:

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

Страницы: 1Вниз

Автор Тема: ЗУ на Ардуино от Dkin  (Прочитано 399 раз)

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

Dkin

  • Неравнодушный
  • **
  • Репутация: 0
  • Сообщений: 230
  • Россия
  • Оффлайн Оффлайн
    • Награды
ЗУ на Ардуино от Dkin
« : 14 Май 2018 в 10:26 »
В этой теме выделил свой вариант зарядки для аккумуляторов на основе ардуино нано. Здесь можно задавать вопросы по ее наладке и работе. В перспективе планируется сделать одно устройство для заряда и разряда, а также для проведения одного или нескольких КТЦ.

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

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

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

3. Драйвер для работы с платой ардуино
В моем случае это CH340 - устанавливаем один раз.
Скрытый текст
* DRIVER-CH340G.rar (69.58 кБ - загружено 2 раз.)

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


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.
Кнопка и разрядный ключ тоже пока не используются.
Скрытый текст

* прсхема080417.rar (81.52 кБ - загружено 3 раз.)


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

* ПП Моргалка ардуино 080417.rar (11.98 кБ - загружено 2 раз.)


Т.о. в моем примере время заряда - 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;
}

Внешний вид:
Скрытый текст

« Последнее редактирование: 14 Май 2018 в 10:38 от Dkin »

Сообщение понравилось: Серик

Dkin

  • Неравнодушный
  • **
  • Репутация: 0
  • Сообщений: 230
  • Россия
  • Оффлайн Оффлайн
    • Награды
ЗУ на Ардуино от Dkin
« Ответ #1 : 16 Май 2018 в 11:42 »
Добавил экран 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;
 }

Сообщение понравилось: Серик

Паяка

  • Начинающий
  • *
  • Репутация: 2
  • Сообщений: 75
  • Россия, Челябинск
  • Без шума, дыма и запаха
  • Оффлайн Оффлайн
    • Награды
ЗУ на Ардуино от Dkin
« Ответ #2 : 14 Июл 2018 в 18:29 »
Есть смысл добавить и SD-карту, получится логгер. Правда, сама карта может при этом быстро изнашиваться. Мне не встречалась информация, как именно на аппаратном уровне работает стандартная библиотека Ардуино для работы с SD, как у неё устроена буферизация.

Necromant

  • Неравнодушный
  • **
  • Репутация: 0
  • Сообщений: 118
  • Калининград
  • Издеваюсь над батарейками!
  • Оффлайн Оффлайн
    • Награды
ЗУ на Ардуино от Dkin
« Ответ #3 : 15 Июл 2018 в 16:04 »
Есть смысл добавить и SD-карту, получится логгер. Правда, сама карта может при этом быстро изнашиваться. Мне не встречалась информация, как именно на аппаратном уровне работает стандартная библиотека Ардуино для работы с SD, как у неё устроена буферизация.
Нет там буферизации практически, там опреативы всего 2 кб, пишется все в реалтайме
чтобы долше флешка не дохла есть смысл форматировать на 1-5 Мб и сдвигать рабочий участок по мере деградации
так флешка в 2 гига при форматировании по 10 Мб и с ресурсом в 500 циклов перезаписи выдержит 100 000 логов
если по 10 логов снимать в день то на 27 лет хватит

Сообщение понравилось: Паяка

Кass

  • Старожил
  • *****
  • Репутация: 33
  • Сообщений: 3189
  • Москва
  • Балдею от женщин, а не ЗУ.
  • Оффлайн Оффлайн
    • Награды
ЗУ на Ардуино от Dkin
« Ответ #4 : 16 Июл 2018 в 10:34 »
5. Схема.

Я бы не стал на 7805 подавать 19В. Я бы сначала поставил 7812, а только потом 7805. Ну или ставить нужно DC/DC преобразователь, который по входу имеет 9-36В.

Сообщение понравилось: Паяка

Паяка

  • Начинающий
  • *
  • Репутация: 2
  • Сообщений: 75
  • Россия, Челябинск
  • Без шума, дыма и запаха
  • Оффлайн Оффлайн
    • Награды
ЗУ на Ардуино от Dkin
« Ответ #5 : 16 Июл 2018 в 13:01 »
, писали, что встроенный контроллер SD-карты каждый раз пишет на новое место, но утверждать не буду. Ещё и контроллеры могут попадаться разные.

Добавлено 16 Июл 2018 в 13:03
DC/DC преобразователь, который по входу имеет 9-36В
Самый компактный и дешёвый на MC34063, можно добыть из телефонной зарядки от прикуривателя.

Necromant

  • Неравнодушный
  • **
  • Репутация: 0
  • Сообщений: 118
  • Калининград
  • Издеваюсь над батарейками!
  • Оффлайн Оффлайн
    • Награды
ЗУ на Ардуино от Dkin
« Ответ #6 : 16 Июл 2018 в 13:29 »
, писали, что встроенный контроллер SD-карты каждый раз пишет на новое место, но утверждать не буду. Ещё и контроллеры могут попадаться разные.
верно, но в пределах диапазона адресов указанных в FAT

Страницы: 1Вверх
 

Помощь форуму | Отказ от ответственности | Новая версия форума
©, Форум электротранспорта, electrotransport.ru, 2007—2018.
Копирование материалов возможно только с согласия правообладателя.

Размер занимаемой памяти: 5.75 мегабайт.
Страница сгенерирована за 0.151 секунд. Запросов: 64.