Тестер АКБ
- Войдите на сайт для отправки комментариев
Добрый день!
Прошу меня простить за неграмотность, но я перепробовал все возможные варианты, которые мне известны, чтобы решить этот вопрос, в общем ситуация такая.
Делаю программу на заряд-разряд акб(пока что 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
Как добиться того, что необходимо сделать, чтобы сначала был выполнен ЗАРЯД, потом РАЗРЯД, потом снова ЗАРЯД последовательно друг за другом?
http://arduino.ru/forum/programmirovanie/pomogite-s-gisterezisom
Как добиться того, что необходимо сделать, чтобы сначала ...
Сначала изучить вот эту тему и после этого перепостить Ваш запрос.
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); } }Soulfalcon, почитайте про гистерезис - это то что вам нужно
Гистерезис ему не поможет. У него после переключения на разряд батареи зарядка не должна включаться вообще.
То ТС - заведи флаг - включилась разрядка, флаг поднять. Пока поднят флаг, зарядку не включать. По окончании разрядки флаг сбросить - и можно снова заряжать
Какое условие окончание разряда - какое-то напряжение. Это и есть гистерезис
Гм, всегда считал, что гистерезис - это другое ))
Гистерезис - наш человек. Как и Циферблат.
Гистерезис здесь не нужен, нужен конечный автомат: состояние №1 - первоначальный заряд, состояние №2 - разряд, состояние №3 - повторный заряд.
В 11-й строке ошибка.
В 5-й строке. Переключать только когда текущее напряжение выше или равно максимальному.
В 13-й строке. Переключать только когда текущее напряжение ниже или равно минимальному.
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); }Спасибо большое, все получилось!Респект!