示例#1
0
文件: main.c 项目: XMC-CAN/flooder
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;
		}
	}
}
示例#2
0
/*
 * 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();
}