Тестер АКБ

Soulfalcon8
Offline
Зарегистрирован: 26.11.2020

Добрый день!
Прошу меня простить за неграмотность, но я перепробовал все возможные варианты, которые мне известны, чтобы решить этот вопрос, в общем ситуация такая.

Делаю программу на заряд-разряд акб(пока что 18650) для определения уровня емкости акб.

Планирую заряд - разряд -и снова заряд.
Проблема заключается в единственном, а именно в том, что после выполнения условия по заряду (Bat_Volt >= Bat_Low && Bat_Volt <=Bat_High) напряжение заряжаемой 18650 батарейки(Bat_Volt) доходит до уровня, равного 4.2В(Bat_High) , срабатывает реле, которое переключает режим с заряда на разряд(как известно во время заряда напряжение подскакивает, а при подключении нагрузки падает) и тем самым напряжение падает и ОПЯТЬ ЖЕ выполняется условие (Bat_Volt >= Bat_Low && Bat_Volt <=Bat_High). Из-за этого реле бесконечно срабатывает. Флажки не помогают, либо же я не правильно их использую(в скетче указано).
Буду бесконечно благодарен за совет, как побороться с этим скачком напряжения, из-за которого условие начинает бесконечно возвращаться в истину. Большое спасибо!

http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

Soulfalcon8
Offline
Зарегистрирован: 26.11.2020

Как добиться того, что необходимо сделать, чтобы сначала был выполнен ЗАРЯД, потом РАЗРЯД, потом снова ЗАРЯД последовательно друг за другом?

sadman41
Offline
Зарегистрирован: 19.10.2016
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Soulfalcon8 пишет:

Как добиться того, что необходимо сделать, чтобы сначала ...

Сначала изучить вот эту тему и после этого перепостить Ваш запрос.

Soulfalcon8
Offline
Зарегистрирован: 26.11.2020
 if (Bat_Volt > Bat_Low && Bat_Volt <= Bat_High && flag1 == 0 && flag2 == 0 && flag3 == 0)
  {
    digitalWrite(MOSFET_Pin, LOW); // пин мосфета
    digitalWrite(rele, HIGH); // пин реле, запуск режим заряда акб до 4.2В
    flag1 = !flag1;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(Bat_Volt, 2);
  }

  else if (Bat_Volt > Bat_Low && Bat_Volt < Bat_High && flag1 == 1 && flag2 && == 0 && flag3 == 0 )
  {
    flag2 = !flag2;
    digitalWrite(MOSFET_Pin, HIGH);
    millisPassed = millis() - previousMillis;
    Current = (Bat_Volt - Res_Volt) / Res_Value;
    mA = Current * 1000.0 ;
    Capacity = Capacity + mA * (millisPassed / 3600000.0); // 1 Hour = 3600000ms
    previousMillis = millis();
    Serial.print(Bat_Volt); Serial.print(","); Serial.println(Capacity);
    row++;
    x++;
    delay(4000);

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("U=");

    lcd.setCursor(8, 0);
    lcd.print("I=");

    lcd.setCursor(0, 1);
    lcd.print("mAh:");

    lcd.setCursor(2, 0);
    lcd.print(Bat_Volt, 2);
    lcd.print("V");

    lcd.setCursor(10, 0);    
    lcd.print( mA, 0);
    lcd.print(" mA");

    lcd.setCursor(4, 1);       
    lcd.print( Capacity , 1);
  }

   if (Bat_Volt > Bat_Low && Bat_Volt <= Bat_High && flag1 == 1 && flag2 == 1 && flag3 == 0)
  {
    digitalWrite(MOSFET_Pin, LOW);
    digitalWrite(rele, HIGH);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(Bat_Volt, 2);
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Soulfalcon, почитайте про гистерезис - это то что вам нужно

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Гистерезис ему не поможет. У него после переключения на разряд батареи зарядка не должна включаться вообще.
То ТС - заведи флаг - включилась разрядка, флаг поднять. Пока поднят флаг, зарядку не включать. По окончании разрядки флаг сбросить - и можно снова заряжать

b707
Offline
Зарегистрирован: 26.05.2017

Какое условие окончание разряда - какое-то напряжение. Это и есть гистерезис

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Гм, всегда считал, что гистерезис - это другое ))

Green
Offline
Зарегистрирован: 01.10.2015

Гистерезис - наш человек. Как и Циферблат.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Гистерезис здесь не нужен, нужен конечный автомат: состояние №1 - первоначальный заряд, состояние №2 - разряд, состояние №3 - повторный заряд.

vrd
Offline
Зарегистрирован: 20.01.2022

В 11-й строке ошибка.

vrd
Offline
Зарегистрирован: 20.01.2022

В 5-й строке. Переключать только когда текущее напряжение выше или равно максимальному.

В 13-й строке. Переключать только когда текущее напряжение ниже или равно минимальному.

vrd
Offline
Зарегистрирован: 20.01.2022
int f =0
 if (f == 0)
  {
    digitalWrite(MOSFET_Pin, LOW); // пин мосфета
    digitalWrite(rele, HIGH); // пин реле, запуск режим заряда акб до 4.2В
    if (Bat_Volt >= Bat_High) {
      f = 1;
     }
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(Bat_Volt, 2);
  }

  if (f == 1)
  {
    if (Bat_Volt <= Bat_Low) {
     f = 2;
    }
    digitalWrite(MOSFET_Pin, HIGH);
    millisPassed = millis() - previousMillis;
    Current = (Bat_Volt - Res_Volt) / Res_Value;
    mA = Current * 1000.0 ;
    Capacity = Capacity + mA * (millisPassed / 3600000.0); // 1 Hour = 3600000ms
    previousMillis = millis();
    Serial.print(Bat_Volt); Serial.print(","); Serial.println(Capacity);
    row++;
    x++;
    delay(4000);

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("U=");

    lcd.setCursor(8, 0);
    lcd.print("I=");

    lcd.setCursor(0, 1);
    lcd.print("mAh:");

    lcd.setCursor(2, 0);
    lcd.print(Bat_Volt, 2);
    lcd.print("V");

    lcd.setCursor(10, 0);    
    lcd.print( mA, 0);
    lcd.print(" mA");

    lcd.setCursor(4, 1);       
    lcd.print( Capacity , 1);
  }

   if (f == 2)
  {
    digitalWrite(MOSFET_Pin, LOW);
    digitalWrite(rele, HIGH);
    if (Bat_Volt >= Bat_High) {
      f = 3;
     }
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(Bat_Volt, 2);
  }

 

Soulfalcon8
Offline
Зарегистрирован: 26.11.2020

Спасибо большое, все получилось!Респект!