int main(void) { DAVE_STATUS_t status; const uint32_t Button_NotPressed = 1; uint32_t Button1OldValue = Button_NotPressed; status = DAVE_Init(); /* Initialization of DAVE APPs */ if (status == DAVE_STATUS_FAILURE) { /* Placeholder for error handler code. The while loop below can be replaced with an user error handler. */ XMC_DEBUG("DAVE APPs initialization failed\n"); while (1U) { } } /* Placeholder for user application code. The while loop below can be replaced with user application code. */ while (1U) { if (enable_flooding == ACTIVATED) { DIGITAL_IO_SetOutputHigh(&LED2); CAN_NODE_MO_Transmit(&CAN_NODE_0_LMO_03_Config); } else { DIGITAL_IO_SetOutputLow(&LED2); } { uint32_t Button1Value = DIGITAL_IO_GetInput(&Button1); /* react on edge */ if ((Button1Value != Button_NotPressed) && (Button1Value != Button1OldValue)) { if (enable_flooding == ACTIVATED) { enable_flooding = NOT_ACTIVATED; } else { enable_flooding = ACTIVATED; } } Button1OldValue = Button1Value; } } }
/* * alle 0.5s callen * alles hier rein * datenerfassung einmal am anfang machen machen * timer Temp anmachen * alle beenden zustände öffnet schütze * */ void DatenErfassenInterruptHandler() { //-----messen //-------starte temp sens messen //---- miss gesamtspannung ADC_MEASUREMENT_StartConversion(&Gesamtspannung); switch (getZustand()) { case 1: // laden if (!DIGITAL_IO_GetInput(&LadegeraetAngeschlossenPin)) { // wenn Ladegerät nicht mehr angeschlossen setZustand(2); return; } if (!schuetzeGeschlossen) { /* * Die Schütze werden angesteuert Vorladeschütz zum Ladebeginn nach 5s Vorladeschütz Ladeschütz ansteuern */ DIGITAL_IO_SetOutputLow(&Hauptschuetz); DIGITAL_IO_SetOutputHigh(&VorladeSchuetz); counter++; if (counter > 9) { DIGITAL_IO_SetOutputHigh(&Ladeschuetz); schuetzeGeschlossen = 1; counter = 0; } } else { /* ueberwachen ob die grenzwerte stimmen max 10 A Ladestrom auf max 3,55 V pro Zelle bei Temperatur unter 45 °C Folgende Fehlerfälle werden abgefangen Überspannungsschutz: der Ladestrom wird so reduziert, dass die max. Zellspannung niemals überschrritten wird Überstrombegrenzung: der max. Ladestrom beträgt 10 A Temperatur innerhalb des Temperaturbereiches 0°C...45 °C, sonst Ladeabbruch Ausfall eines BMC unterbricht Ladevorgang Ausfall des CMS unterbricht Ladevorgang */ /* * funktion von BMC und CMS prüfen */ if (getLBMCFehler() || getRBMCFehler() || getCMSFehler()||1) { //1 weg hier testzweck setZustand(3); return; } /* * Temperaturen prüfen 0-45°C */ for (j = 0; j < 6; j++) { if (getTemp(j) > 0x2D0 || getTemp(j) < 0) { setZustand(3); return; } } /* * Spannungen prüfen max 3,55V/zelle wenn voll auf 50V #todo */ for (j = 0; j < 14; j++) { if (getZellspannung(j) > 3550) { //pro zelle nicht mehr als 3,55v setZustand(3); return; } } /* * PI Regler Implementieren und auf DAC geben oder abbrechen * max10A */ err = getStrom(); err = (sollStrom - getStrom()); // A sollstrom integral += i * err; // Byte 0-2: Current Value in mA setPWM((int) (err * p + integral)); // } break; case 2: //fahren if (DIGITAL_IO_GetInput(&LadegeraetAngeschlossenPin)) { // wenn Ladegerät wieder angeschlossen setZustand(1); return; } /* * 3s nach Ladeschütz vorladeschütz abfallen lassen */ if (schuetzeGeschlossen) { DIGITAL_IO_SetOutputLow(&Ladeschuetz); counter++; if (counter > 5) { DIGITAL_IO_SetOutputLow(&VorladeSchuetz); counter = 0; schuetzeGeschlossen = 0; DIGITAL_IO_SetOutputHigh(&Hauptschuetz); } return; } /* * folgende Fehlerfälle werden abgefangen und durch Öffnen des Fahrschützes gesichert: Unterspannungserkennung? einzelner Zellen über Vergleich mit Gesamtspannungsmessung wird Schütz nur geöffnet, wenn Gesamtspannung auf nicht plausible? Ergebnisse schließen lässt Ausfall der Temperatursensorik an lukipuki senden Ausfall eines BMC wird an lukipuki gelitten * */ /* * ZEllspannungen kontrollieren */ zaehlendeGesamtspannung = 0; // eig 0 for (j = 0; j < 14; j++) { zaehlendeGesamtspannung += getZellspannung(j); if (getZellspannung(j) < 2800) { DIGITAL_IO_SetOutputLow(&Hauptschuetz); setZustand(4); return; } } if (zaehlendeGesamtspannung < getGesamtspannung() - 2000) { //#todo 2 anpassen --- über Vergleich mit Gesamtspannungsmessung wird Schütz nur geöffnet, wenn Gesamtspannung auf nicht plausible? Ergebnisse schließen lässt DIGITAL_IO_SetOutputLow(&Hauptschuetz); setZustand(4); return; } break; case 3: // laden abgebrochen if (!DIGITAL_IO_GetInput(&LadegeraetAngeschlossenPin)) { // wenn Ladegerät wieder abgeschlossen setZustand(1); return; } /* * 3s nach Ladeschütz vorladeschütz abfallen lassen */ if (schuetzeGeschlossen) { DIGITAL_IO_SetOutputLow(&Ladeschuetz); counter++; if (counter > 5) { DIGITAL_IO_SetOutputLow(&VorladeSchuetz); counter = 0; schuetzeGeschlossen = 0; DIGITAL_IO_SetOutputHigh(&Hauptschuetz); } return; } /* ueberwachen ob die grenzwerte stimmen max 10 A Ladestrom auf max 3,55 V pro Zelle bei Temperatur unter 45 °C Folgende Fehlerfälle werden abgefangen Überspannungsschutz: der Ladestrom wird so reduziert, dass die max. Zellspannung niemals überschrritten wird Überstrombegrenzung: der max. Ladestrom beträgt 10 A Temperatur innerhalb des Temperaturbereiches 0°C...45 °C, sonst Ladeabbruch Ausfall eines BMC unterbricht Ladevorgang Ausfall des CMS unterbricht Ladevorgang */ /* * funktion von BMC und CMS prüfen */ if (!getLBMCFehler() && !getRBMCFehler() && !getCMSFehler()) { setZustand(1); //hier auch als flag benutzt, kann verändert werden } /* * Temperaturen prüfen 0-45°C */ for (j = 0; j < 6; j++) { if (getTemp(j) < 0x2D0 && getTemp(j) > 0) { setZustand(1); } } /* * Spannungen prüfen max 3,55V/zelle wenn voll auf 50V #todo */ for (j = 0; j < 14; j++) { if ((getZellspannung(j) < 3550) && getZustand() == 1) { //pro zelle nicht mehr als 3,55v setZustand(1); } } break; case 4: // fahren abgebrochen if (DIGITAL_IO_GetInput(&LadegeraetAngeschlossenPin)) { // wenn Ladegerät wieder angeschlossen setZustand(2); return; } zaehlendeGesamtspannung = 0; // eig 0 for (j = 0; j < 14; j++) { zaehlendeGesamtspannung += getZellspannung(j); if (getZellspannung(j) > 2800) { setZustand(2); // wird hier auch als flag genutzt und kann überschrieben werden } } if ((zaehlendeGesamtspannung > getGesamtspannung() - 2000) && getZustand() == 2) { //#todo 2 anpassen --- über Vergleich mit Gesamtspannungsmessung wird Schütz nur geöffnet, wenn Gesamtspannung auf nicht plausible? Ergebnisse schließen lässt DIGITAL_IO_SetOutputHigh(&Hauptschuetz); setZustand(2); return; } else { setZustand(4); } break; default: setZustand(1); } ecarCAN_SendValues(); }