Ingo Electronics

  • Home                                                                                                                                    


                                                                                                                     Projekto Archyvas  Download this Project
                                                                                                                                                                                           

 baterijų kontrolės sistema panaudojant AD7280A  iš ANALOG DEVICES 

Tai yra tik pavyzdys kaip gali būti naudojama mikroschema AD7280A Ličio baterijų bei jų

pakrovimo proceso kontrolei. Schemos ir programiniai kodai bus naudojami tolimesniam BMS

projekto vystymui.  AD7280A gali kontroliuoti iki šešių nuosekliai sujungtų Li-ion arba LiFePo4

celių. Norint kontroliuoti daugiau kaip šešias celes, reikia kelias AD7280A jungti tarpusavyje į

grandinę angl. dar vadinama Daisy-chain interface, tačiau čia, paprastumo dėlei buvo

apsiribota tik viena AD7280A.

Šiame pavyzdyje yra naudojamos trys atskiros schemos, tarpusavyje sujungtos lanksčiomis

jungtimis: 

AD7280A testavimo plokštė 

Celių balansavimo plokštė

Mikrovaldiklio plokštė

Žemiau yra pateikiami mikrovaldiklio programavimo kodai, kurie yra išbandyti ir veikiantis, juos

galima naudoti savo nuožiūra, arba kaip pavyzdį  išeities kodo programavimui.

Programos kodas parašytas naudojant mikroC PRO for PIC v.4.64 . Kodas nesunkiai gali buti

pritaikomas visiems mikrovaldikliams kurie turi hardware SPI ir pakankamai vidinės flash

atminties programos kodo įrašymui.

pagrindinė main funkcija

#include  "AD7280A_lib.c" 

#include  "LCD_output_lib.c" 


// LCD module connections
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// End LCD module connections


char error;
char channel_change;
unsigned long battery_V;



////////////////////////////////////////////////////////////////////////////////
void main() {
ADCON0 = 0;                      // A/D CONTROL REGISTER 0 - Turn off ADC
ADCON1 = 0b00001111;      // A/D Port Configuration Control bits: All analog inputs disenabled

CMCON = 0b00000111;        //COMPARATOR CONTROL REGISTER - Disbale comparators
RCSTA = 0 ;                        //Serial RECEIVE STATUS AND CONTROL REGISTER
UCON  = 0;                         // USB CONTROL REGISTER
UCFG  = 0b00001000;          //USB CONFIGURATION REGISTER

TRISA = 0b000000000;
TRISB = 0b000000000;
TRISC = 0b000000000;
TRISD = 0b000000000;
TRISE = 0b000001000;

PORTA = 0;
PORTB = 0;
PORTC = 0;
PORTD = 0;
PORTE=  0;
//---------------------------------
cnv_start = 1;
PD_ad7280 = 1;
error = 0;
//---------------------------------
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);               // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
//---------------------------------
 
Lcd_Out(1, 4, "PIC18F4550");

delay_ms(1000);

Lcd_Cmd(_LCD_CLEAR);
//---------------------------------
//Clock polarity CPOL = 0,Clock phase CPHA = 1
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64,_SPI_DATA_SAMPLE_MIDDLE,
_SPI_CLK_IDLE_LOW,_SPI_HIGH_2_LOW);   //CKP_bit = 0; CKE_bit = 0; SMP_bit = 0;

//---------------------------------
ad7280_crc8_build_table();

delay_ms(500);
//---------------------------------

do{
ad7280_write_long(contr_HB,0b00110000);   //no-read operation

ad7280_write_long(contr_LB,0b00010000);
if(ad7280_check_register(contr_LB,0b00010000  ) != 1 ) {error=1;}

ad7280_write_long(cell_overvoltage,163);  //(3.6 - 1)/0.016 = 162.5
if(ad7280_check_register(cell_overvoltage,163 ) != 1 ) {error=2;}

ad7280_write_long(alert,   0b01000000);   //static (high) alert signal
if(ad7280_check_register(alert,0b01000000     ) != 1 ) {error=3;}

if(error == 1 || error == 2 || error == 3   ) { error = 1;Lcd_Out(1, 6,"ERROR");}
else  {Lcd_Out(1, 5,"AD7280A");Lcd_Out(2, 6, "READY");error=0; }

} while (error);



delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR);

channel_change = 1;

while(1){

led = ~led;
delay_ms(200);

battery_V =  ad7280_read_all_channels(6,channel_value);

channel_balance();

if(RE3_bit == 0) {delay_ms(300); channel_change++;Lcd_Cmd(_LCD_CLEAR);
if(channel_change == 6) {channel_change =1;} }

switch (channel_change) {

case 1: display_battery_value(1, 1,battery_V);  break;
case 2: display_channel_value(1,1,1,channel_value[0] );
        display_channel_value(2,1,2,channel_value[1] );  break;
case 3: display_channel_value(1,1,3,channel_value[2] );
        display_channel_value(2,1,4,channel_value[3] );  break;
case 4: display_channel_value(1,1,5,channel_value[4] );
        display_channel_value(2,1,6,channel_value[5] );  break;
case 5: display_balance_status ();  break;

default: display_battery_value(1, 1,battery_V);
} //end switch

} //end while


} //end main