Charger Controller

Dependencies:   mbed

ChargerController.cpp

Committer:
JC2112
Date:
2018-05-20
Revision:
0:a086e9699b2b

File content as of revision 0:a086e9699b2b:

#include "mbed.h"
 
Ticker ticker;
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);
DigitalOut Charger1(p21);
DigitalOut Charger2(p22);
DigitalOut Shutdown(p25);
DigitalIn Speed(p6);
DigitalIn Reset(p5);
CAN can1(p9, p10);
CANMessage ControlMsg;
CANMessage msg1;
int Voltage = 300;
int Current = 12;
int ChargerVoltage;
int ChargerCurrent;
int SoC;
int Temp;
    

void send2Charger() {
    
    if (Speed){
        Current = 16;
    }
    else{
        Current = 12;
    }
    
    int DecV = Voltage * 10;
    int DecC = Current * 10;
    int Top8V = DecV >> 8;
    int Top8C = DecC >> 8;
    int bot8var = 255;
    int Bot8V = bot8var & DecV;
    int Bot8C = bot8var & DecC;  
      
    ControlMsg.format = CANExtended;// or  CANExtended;  // standard or extended ID (can be skipped for standard)
    ControlMsg.id = 0x1806E5F4;
    ControlMsg.len = 4;//length in bytes (1 to 8);
    ControlMsg.data[0] = Top8V; // repeat for each byte.
    ControlMsg.data[1] = Bot8V;
    ControlMsg.data[2] = Top8C;
    ControlMsg.data[3] = Bot8C;
    ControlMsg.data[4] = 0;
    ControlMsg.data[5] = 0;
    ControlMsg.data[6] = 0;
    ControlMsg.data[7] = 0;
    if (can1.write(ControlMsg)){
    led1 = !led1;}
};

int main() {
    printf("main()\n\r");
    ticker.attach(&send2Charger, 0.5);
    CANMessage msg;
    while(1) {
        if (can1.read(msg)) {
            if (msg.id == 0x11111111){ //BMS OK
                int OK = msg.data[0] + msg.data[1] + msg.data[2] + msg.data[3] + msg.data[4] + msg.data[5] + msg.data[6] + msg.data[7];
                if (OK == 0){
                    printf("ERROR: BMS NOT OK!\n\r\n\r");
                    Shutdown = 1;
                }

            }
            if (msg.id == 0x150C5100){ //SoC Sub Pack 1
                int s1 = msg.data[0] / 2;
                int s2 = msg.data[1] / 2;
                int s3 = msg.data[2] / 2;
                int s4 = msg.data[3] / 2;
                int s5 = msg.data[4] / 2;
                int s6 = msg.data[5] / 2;
                int s7 = msg.data[6] / 2;
                int s8 = msg.data[7] / 2;
                printf("Sub Pack 1: String 1: SoC: %d\n\r", s1);
                printf("Sub Pack 1: String 2: SoC: %d\n\r", s2);
                printf("Sub Pack 1: String 3: SoC: %d\n\r", s3);
                printf("Sub Pack 1: String 4: SoC: %d\n\r", s4);
                printf("Sub Pack 1: String 5: SoC: %d\n\r", s5);
                printf("Sub Pack 1: String 6: SoC: %d\n\r", s6);
                printf("Sub Pack 1: String 7: SoC: %d\n\r", s7);
                printf("Sub Pack 1: String 8: SoC: %d\n\r", s8);
                led2 = !led2;

            }
            if (msg.id == 0x18075100){ //Temp Sub Pack 1
                
                int s1 = msg.data[0] / 3;
                int s2 = msg.data[1] / 3;
                int s3 = msg.data[2] / 3;
                int s4 = msg.data[3] / 3;
                int s5 = msg.data[4] / 3;
                int s6 = msg.data[5] / 3;
                int s7 = msg.data[6] / 3;
                int s8 = msg.data[7] / 3;
                printf("Sub Pack 1: String 1: Temp: %d\n\r", s1);
                printf("Sub Pack 1: String 2: Temp: %d\n\r", s2);
                printf("Sub Pack 1: String 3: Temp: %d\n\r", s3);
                printf("Sub Pack 1: String 4: Temp: %d\n\r", s4);
                printf("Sub Pack 1: String 5: Temp: %d\n\r", s5);
                printf("Sub Pack 1: String 6: Temp: %d\n\r", s6);
                printf("Sub Pack 1: String 7: Temp: %d\n\r", s7);
                printf("Sub Pack 1: String 8: Temp: %d\n\r", s8);
                led3 = !led3;
            }
            if (msg.id == 0x18FF50E5){
                int HexVoltageTop = msg.data[0];
                int HexVoltageBot = msg.data[1];
                int HexCurrentTop = msg.data[2];
                int HexCurrentBot = msg.data[3];
                int d6 = msg.data[6];
                int d7 = msg.data[7];
                Charger1 = 1;
                Charger2 = 0;
                
                
                switch(d6) {
                    case 138 : if (d7 == 119){
                                    printf("Charger Error: No Battery!\n\r");
                                    Shutdown = 1; 
                                }
                                break;
                    case 8 : if (d7 == 7){
                                    printf("Charger Error: Over Heating!\n\r");
                                    Shutdown = 1; 
                                }
                                break; 
                }
                               
                int TopVoltCharger = HexVoltageTop << 8;
                ChargerVoltage = 0 | TopVoltCharger;
                ChargerVoltage = ChargerVoltage | HexVoltageBot;
                ChargerVoltage = ChargerVoltage/10;
                
                int TopCurrentCharger = HexCurrentTop << 8;
                ChargerCurrent = 0 | TopCurrentCharger;
                ChargerCurrent = ChargerCurrent | HexCurrentBot;
                ChargerCurrent = ChargerCurrent/10;
                
                if (ChargerVoltage > Voltage){
                    printf("ERROR: Charger Voltage Too High! \n\r");
                    printf("Max Voltage: %d\n\r", Voltage);
                    printf("Charger Voltage: %d\n\r", ChargerVoltage); //This needs adapting as this can happen in constant current!!!
                    ticker.detach();
                    Shutdown = 1;
                }
                else if (ChargerCurrent > Current){
                    printf("ERROR: Charger Current Too High! \n\r");
                    printf("Max Current: %d\n\r", Current);
                    printf("Charger Current: %d\n\r", ChargerCurrent); //This needs adapting as this can happen in constant current!!!
                    ticker.detach();
                    Shutdown = 1;
                }
                else{
                    printf("Charger Voltage: %d\n\r", ChargerVoltage);
                    printf("Charger Current: %d\n\r", ChargerCurrent);
                    ticker.attach(&send2Charger, 0.5);
                    
                }
                
                led4 = !led4;
            }
            
            
            
            if (msg.id == 0x18FF50E7){
                int HexVoltageTop = msg.data[0];
                int HexVoltageBot = msg.data[1];
                int HexCurrentTop = msg.data[2];
                int HexCurrentBot = msg.data[3];
                int d6 = msg.data[6];
                int d7 = msg.data[7];
                Charger1 = 0;
                Charger2 = 1;
                
                switch(d6) {
                    case 138 : if (d7 == 119){
                                    printf("Charger Error: No Battery!\n\r");
                                    Shutdown = 1; 
                                }
                                break;
                    case 8 : if (d7 == 7){
                                    printf("Charger Error: Over Heating!\n\r");
                                    Shutdown = 1; 
                                }
                                break; 
                }
                               
                int TopVoltCharger = HexVoltageTop << 8;
                ChargerVoltage = 0 | TopVoltCharger;
                ChargerVoltage = ChargerVoltage | HexVoltageBot;
                ChargerVoltage = ChargerVoltage/10;
                
                int TopCurrentCharger = HexCurrentTop << 8;
                ChargerCurrent = 0 | TopCurrentCharger;
                ChargerCurrent = ChargerCurrent | HexCurrentBot;
                ChargerCurrent = ChargerCurrent/10;
                
                if (ChargerVoltage > Voltage){
                    printf("ERROR: Charger Voltage Too High! \n\r");
                    printf("Max Voltage: %d\n\r", Voltage);
                    printf("Charger Voltage: %d\n\r", ChargerVoltage); //This needs adapting as this can happen in constant current!!!
                    ticker.detach();
                    Shutdown = 1;
                }
                else if (ChargerCurrent > Current){
                    printf("ERROR: Charger Current Too High! \n\r");
                    printf("Max Current: %d\n\r", Current);
                    printf("Charger Current: %d\n\r", ChargerCurrent); //This needs adapting as this can happen in constant current!!!
                    ticker.detach();
                    Shutdown = 1;
                }
                else{
                    printf("Charger Voltage: %d\n\r", ChargerVoltage);
                    printf("Charger Current: %d\n\r", ChargerCurrent);
                    ticker.attach(&send2Charger, 0.5);
                }
                
                led4 = !led4;
            }
        if(Reset){
            ticker.attach(&send2Charger, 1);
            Shutdown = 0;
        }

    }
    
}