Pingvin писал(а):
 Там и буду голову ломать...  

Прикрутил зарядное устройство встроенное в тагер. 
Вопрос знатокам, допустимо ли заряжать Li акб, не  разрядив полностью ?
Например  зарядили - поиграли разрядили  не до минимальной границы, возможно совсем чуть чуть. 
И снова ставим на зарядку. 
Или второй вариант, тагер лежит на зарядке: зарядился, АКБ автоматика отключила от зарядки, напряжение в сети ненамного пропало, тагер лежит тратит АКБ считает что он в игре,если  выключатся то будет странно для пользователя. Потом сетевое снова появляется, АКБ снова не максимум, опять заряжать ?  
Думаю вводить "моточасы", но надо ли ?
Код:
// Автомат логики зарядки АКБ
void LogicChargeAkb(void)   {
                                 
  switch (StateCharge)
  {
      case WAIT_CHARGE:             // Ждём запроса на зарядку
                              // придумать вариант старта
         if (  btReload > 0) {       // кнопку надо подержать не менее 1 сек
         //  начинаем проверку подключенности питания зарядки 
            charge_off();         // работа только от АКБ
            StateCharge = START_CHARGE;
         }
       break;
      case START_CHARGE:             
         charge_off();
         charge_cnt ++;            // отрабатываем паузу в секундах
         if  (charge_cnt > 2) {      // время выдержки АКБ кончилось (2сек)
            charge_cnt = 0;
            
            adc_off_chg = adc_in;   // замерить и запомнить напряжение АКБ
            // проверить напряжение на АКБ
            if (adc_off_chg < akb_max) {      
            // меньше порога - включаем подачу зарядного тока 
            // Индикация через мигание диода ТХ
               charge_on();         
               StateCharge = TEST_CHARGE;
            } else {
            // больше порога - хватит заряжать
            // остановку по таймауту тоже можно добавить
               StateCharge = WAIT_CHARGE;
            }
         }
       break;
          case TEST_CHARGE:             // меряем напряжение на АКБ
         charge_on();
         charge_cnt ++;            // отрабатываем зарядку в секундах
         if  (charge_cnt > 3) {      // время выдержки АКБ под зарядкой  (3сек)
            charge_cnt = 0;
            adc_on_chg = adc_in;   // замерить и запомнить напряжение АКБ
            if (adc_on_chg > adc_off_chg) {
               // зарядный ток есть, продолжаем
               StateCharge = START_CHARGE;
            
            } else {
               // зарядного тока нет(выключили) или АКБ не принимает заряд
               // останавливаем зарядку
               StateCharge = WAIT_CHARGE;
            }
         }
       break;
  } //swich end
                                       
}