Здраствуйте! Такая ситуация, спаял себе парочку аккумуляторов 4S6P для замени свинца в выездах на природу так как вес поменьше, да и служат подольше. З зарядкой проблем нет - заряжаю Turnigy Acuccel 80W или раздельными зарядками, но вот как-то хотелось защитится от переразряда так как не любит литий разряда меньше 3 вольт. Хотел купить готовый контролер без балансира и не париться, но увы - повсюду нижний порог 2,75 -2,5 вольт, в реальности еще меньше. Готовых проектов по контроллеру 4s или других под переделку в гугле не встречал. Так как опыт небольшой есть по Arduino решил сделать самому, прога писалась в среде Arduino, компилировалась в hex и моделировалась в протеусе, но что то протеус не хочет считать напряжения, значения АЦП выводит нормально (в архиве проект протеуса с LCD куда выводил все данные по очереди, и проект для LCD - _1111), а результат формулы не считает. В железе пока не собирал хочу отладить программно, да и пока едут LP 2950- 5.0 вольта. Все что нужно от контроллера отключать нагрузку при перезаряде, переразряде и превышение тока, с малым энергопотреблением. Буду рад любой помощи, замечаниям и доработкам. Заранее спасибо.
// Port B initialization Func3=In Func2=Out Func1=Out Func0=Out State3=T State2=0 State1=0 State0=0 //PORTB=0x00; PORTB=0x03; DDRB=0x07;
// Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; ADCSRB=0x00; DIDR0=0x00;
// ADC initialization, ADC Clock: 125,000 kHz ,ADC Bipolar Input Mode: Off, ADC Auto Trigger Source: ADC Stopped // Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On, ADC4: On, ADC5: On, ADC6: On, ADC7: On DIDR0=0x00; ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x83; ADCSRB&=0x6F;
while (1) { Upin1=read_adc(0); Upin2=read_adc(1); Upin3=read_adc(2); Upin4=read_adc(3); Ipin=read_adc(4); //вычисляем напряжение на аккумуляторах U1=Upin1*1.5294118*0.0048876*1000; // 1/(51/78)* 5/1023 U2=Upin2*3.3529412*0.0048876*1000;// 1/(51/171) * 5/1023 U3=Upin3*4.9215686*0.0048876*1000; // 1/(51/251) * 5/1023 U4=Upin4*6.8823529*0.0048876*1000; // 1/(51/351) * 5/1023 if (U4>U3) { U4=U4-U3; } if (U3>U2) { U3=U3-U2; } if (U2>U1) { U2=U2-U1; } //защита от переразряда if ((U1<3000)||(U2<3000)||(U3<3000)||(U4<3000)) { discharge_off; } else { discharge_on; } //защита от перезаряда if ((U1>4200)||(U2>4200)||(U3>4200)||(U4>4200)) { charge_off; } //защита от КЗ // if (Ipin>4) // { // discharge_off; // charge_off; // } } } Осталось добавить сон. Но думаю сколько ставить сек в режим сна.
Не смог осилить все тонкостей этих энергосберегающих режимов, точней пробуждения из них. Кое как заставил работать режим Sleep, но тут подсказали что можно перейти на пониженную частоту 128 KHz и не заморачиваться, потребления в таком режиме по даташиту не больше 0,15 + 0,10- 0,15 делители -максимум 0,3 мА что подходит вполне. Код для CV AVR Спойлер#include <tiny44.h> #include <delay.h> #define ADC_VREF_TYPE 0x00 #define charge_on PORTB.1=1;//включить пин заряда #define charge_off PORTB.1=0;//отключить пин заряда #define discharge_on PORTB.0=1;//включить пин разряда #define discharge_off PORTB.0=0;//отключить пин разряда
unsigned int read_adc(unsigned char adc_input) // функция замера напряжения { ADMUX=(adc_input & 0x3f) | ADC_VREF_TYPE; delay_us(12); // задержка для стабилизации напряжения ADCSRA|=0x40; // включаєм АЦП while ((ADCSRA & 0x10)==0); // Ждем завершения работи АЦП ADCSRA|=0x10; return ADCW; } // глобальниє переменнниє unsigned short int Upin1, Upin2, Upin3, Upin4, Ipin, U1, U2 ,U3, U4; float U1_Corr,U2_Corr,U3_Corr,U4_Corr;
// Port B initialization Func3=In Func2=Out Func1=Out Func0=Out State3=T State2=0 State1=0 State0=0 //PORTB=0x03; //DDRB=0x07; PORTB=0x00; DDRB=0x0F; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; ADCSRB=0x00; DIDR0=0x00;
// ADC initialization, ADC Clock: 125,000 kHz ,ADC Bipolar Input Mode: Off, ADC Auto Trigger Source: ADC Stopped // Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On, ADC4: On, ADC5: On, ADC6: On, ADC7: On DIDR0=0x00; ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x83; ADCSRB&=0x6F;
U1_Corr=0; //КАЛИБРОВОЧНЫЕ ЗНАЧЕНИЯ U2_Corr=0; //ВЫЧИТАЮТСЯ ИЗ РЕЗУЛЬТАТОВ ИЗМЕРЕНИЯ U3_Corr=0; //ПРИ ИСПОЛЬЗОВАНИИ 0.1% РЕЗИСТОРОМ МОЖНО ОСТАВИТЬ U4_Corr=0; //РАВНЫМИ 0
//ВЫЧИСЛЕНИЕ НАПРЯЖЕНИЙ КАЖДОЙ ЯЧЕЙКИ: //U4=U4-U3 if (U4>U3) { U4=U4-U3; if (U4>U4_Corr) U4=U4-U4_Corr; } else U4=0;
//U3=U3-U2 if (U3>U2) { U3=U3-U2; if (U3>U3_Corr) U3=U3-U3_Corr; } else U3=0;
//U2=U2-U1 if (U2>U1) { U2=U2-U1; if (U2>U2_Corr) U2=U2-U2_Corr; } else U2=0;
if (U1>U1_Corr) U1=U1-U1_Corr; else U1=0;
//защита от переразряда if ((U1<3000)||(U2<3000)||(U3<3000)||(U4<3000)) { discharge_off; } else { discharge_on; } //защита от перезаряда if ((U1>4200)||(U2>4200)||(U3>4200)||(U4>4200)) { charge_off; } if ((U1<4150)&&(U2<4150)&&(U3<4150)&&(U4<4150)) { charge_on; } //защита от КЗ // if (Ipin>4) // { // discharge_off; // charge_off; // } #asm("wdr") } } Фюзи WDT - programmed ,CKSEL - 0100 , SUT- 00 Перехожу к тестирования в железе. Всем спасибо кто помог.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 37
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения