Форум РадиоКот 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 вольта. Все что нужно от контроллера отключать нагрузку при перезаряде, переразряде и превышение тока, с малым энергопотреблением. Буду рад любой помощи, замечаниям и доработкам. Заранее спасибо.
|
Автор: | 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); // } } Архив с измененним проектом. В планах доделать защиту по току (измерениє падения на транзисторах) ну и снизить потребления режимом сна.
|
Автор: | 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 Перехожу к тестирования в железе. Всем спасибо кто помог.
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |