Например TDA7294

Форум РадиоКот :: Просмотр темы - Контроллер лития 4S
Форум РадиоКот
https://radiokot.ru/forum/

Контроллер лития 4S
https://radiokot.ru/forum/viewtopic.php?f=57&t=135126
Страница 1 из 1

Автор:  roma1984 [ Чт сен 01, 2016 15:31:42 ]
Заголовок сообщения:  Контроллер лития 4S

Здраствуйте! Такая ситуация, спаял себе парочку аккумуляторов 4S6P для замени свинца в выездах на природу так как вес поменьше, да и служат подольше.
З зарядкой проблем нет - заряжаю Turnigy Acuccel 80W или раздельными зарядками, но вот как-то хотелось защитится от переразряда так как не любит литий разряда меньше 3 вольт.
Хотел купить готовый контролер без балансира и не париться, но увы - повсюду нижний порог 2,75 -2,5 вольт, в реальности еще меньше.
Готовых проектов по контроллеру 4s или других под переделку в гугле не встречал. Так как опыт небольшой есть по Arduino решил сделать самому, прога писалась в среде Arduino,
компилировалась в hex и моделировалась в протеусе, но что то протеус не хочет считать напряжения, значения АЦП выводит нормально
(в архиве проект протеуса с LCD куда выводил все данные по очереди, и проект для LCD - _1111), а результат формулы не считает.
В железе пока не собирал хочу отладить программно, да и пока едут LP 2950- 5.0 вольта.
Все что нужно от контроллера отключать нагрузку при перезаряде, переразряде и превышение тока, с малым энергопотреблением.
Буду рад любой помощи, замечаниям и доработкам. Заранее спасибо.

Вложения:
disprotecktion.zip [649.98 KiB]
Скачиваний: 190

Автор:  roma1984 [ Вс окт 30, 2016 19:05:13 ]
Заголовок сообщения:  Re: Контроллер лития 4S

Внес изменения в код, заработало в симуляторе, код под спойлером
Спойлерfloat Upin1=0.0;
float Upin2=0.0;
float Upin3=0.0;
float Upin4=0.0;
float Ipin=0.0;
float U1=0.0;
float U2=0.0;
float U3=0.0;
float U4=0.0;
void setup() {
pinMode(0,INPUT);
pinMode(1,INPUT);
pinMode(2,INPUT);
pinMode(3,INPUT);
pinMode(4,INPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
digitalWrite(9,HIGH);//пин заряда
digitalWrite(10,HIGH);// соответствие пину 8 в протеусе - пин разряда (8 пин =пину 10)
}

void loop() {
//делаем замер напряжения падения на транзисторах пин PA4
Ipin=analogRead(4);
Ipin=(Ipin*5)/1023.0;
//делаем замер напряжения на входах
Upin1=analogRead(0);
Upin1=(Upin1*5)/1023;//вход PA0
Upin2=analogRead(1);
Upin2=(Upin2*5)/1023;//вход PА1
Upin3=analogRead(2);
Upin3=(Upin3*5)/1023.0;//вход PA2
Upin4=analogRead(3);
Upin4=(Upin4*5)/1023.0;//вход PA3
//вычисляем напряжение на аккумуляторах
U1=Upin1/(51/78.00);
U2=Upin2/(51/171.00);
U3=Upin3/(51/251.00);
U4=Upin4/(51/351.00);
if (U4>U3)
{
U4=U4-U3;
}
if (U3>U2)
{
U3=U3-U2;
}
if (U2>U1)
{
U2=U2-U1;
}
//защита от переразряда
if ((U1<3)||(U2<3)||(U3<3)||(U4<3))
{
digitalWrite(10, LOW);
}
else
{
digitalWrite(10, HIGH);
}
//защита от перезаряда
if ((U1>4.2)||(U2>4.2)||(U3>4.2)||(U4>4.2))
{
digitalWrite(9, LOW);
}
//защита от КЗ
// if (Ipin>4)
// {
// digitalWrite(9, LOW);
// digitalWrite(10, LOW);
// }
}

Архив с измененним проектом. В планах доделать защиту по току (измерениє падения на транзисторах) ну и снизить потребления режимом сна.

Вложения:
disprotecktion.zip [394.67 KiB]
Скачиваний: 144

Автор:  roma1984 [ Вс дек 18, 2016 18:41:23 ]
Заголовок сообщения:  Re: Контроллер лития 4S

Код для CV AVR
Спойлер#include <tiny44.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x00
//#define discharge PINB.0
//#define charge PINB.1
#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(10); // задержка для стабилизации напряжения
ADCSRA|=0x40; // включаєм АЦП
while ((ADCSRA & 0x10)==0); // Ждем завершения работи АЦП
ADCSRA|=0x10;
return ADCW;
}

unsigned short int Upin1, Upin2, Upin3, Upin4, Ipin, U1, U2 ,U3, U4; // глобальниє переменнниє


void main(void)
{
// локальниє переменниє
Upin1=0; Upin2=0; Upin3=0; Upin4=0; Ipin=0; U1=0; U2=0; U3=0; U4=0;


// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// 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;
// }
}
}

Осталось добавить сон. Но думаю сколько ставить сек в режим сна.

Автор:  roma1984 [ Вс фев 05, 2017 15:06:44 ]
Заголовок сообщения:  Re: Контроллер лития 4S

Не смог осилить все тонкостей этих энергосберегающих режимов, точней пробуждения из них. Кое как заставил работать режим 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;

void main(void)
{
// локальниє переменниє
Upin1=0; Upin2=0; Upin3=0; Upin4=0; Ipin=0; U1=0; U2=0; U3=0; U4=0;


// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;


// 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;

// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/128k
// Watchdog Timer interrupt: On
#pragma optsize-
#asm("wdr")
WDTCSR=0x1E;
WDTCSR=0x0E;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

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.5*0.0048876*1000; // 1/(20/30)* 5/1023
U2=Upin2*3.35*0.0048876*1000;// 1/(20/67) * 5/1023
U3=Upin3*4.75*0.0048876*1000; // 1/(20/95) * 5/1023
U4=Upin4*7*0.0048876*1000; // 1/(20/140) * 5/1023

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
Перехожу к тестирования в железе. Всем спасибо кто помог.

Вложения:
bmstiny1.jpg [83.77 KiB]
Скачиваний: 356

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/