Здраствуйте! Такая ситуация, спаял себе парочку аккумуляторов 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
Перехожу к тестирования в железе. Всем спасибо кто помог.