示例#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
int main(void)
{
  DAVE_STATUS_t status;				// Startup error

  status = DAVE_Init();           	// Initialization of DAVE APPs

  if(status == DAVE_STATUS_FAILURE)
  {
    XMC_DEBUG("DAVE APPs initialization failed\n");

    while(1U)
    {
    	DIGITAL_IO_SetOutputHigh(&DIGITAL_IO_1);	// Turn on LED2 for errors
    }
  }

   startCommRX();	// Start serial connection with the node

   while(1U)
   {
	  if(mbTimeout > MB_TIMEOUT)	// Check if the current slave is taking too long to reply
		  	  	  	  	  	  	  	// If it is, move on to the next one
	  {
		  if(mbCurrentSlave == MB_MAX_SLAVE)
		  	{
		  		mbCurrentSlave = 1;
		  	}
		  	else
		  	{
		  		mbCurrentSlave++;
		  	}

		  	mbReadyForRead = 1;
	  }

 	  if(mbReadyForRead)
 	  {
 		  mbReadFloat(mbCurrentSlave);	// Poll the mbReadyForRead flag and start a new reading
 	  }

 	  if(commReadyForWrite && !queueIsEmpty)
 	  {
 		  commSendData();	// commReadyForWrite - UART Hardware ready
 		  	  	  	  	  	// queueIsEmpty - Readings Queue
 	  }
   }
}
示例#3
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();
}
示例#4
0
void commRXHandler(void)
{
	// Handler called  on RC complete

	// Command structure:

	//
	// 0)Start signal
	// [0-5] = 69
	//
	// 1)Update Slave Preset value
	//
	// [0]XMCNUM | [1] Cmd = 1 | [2-5] Preset value
	//
	//
	// 2)Update Minimum interval
	//
	// [0]XMCNUM | [1] Cmd = 2 | [2-5] Minimum Interval Value
	//
	// 3)Update Slave Threshold value
	//
	// [0]XMCNUM | [1] Cmd = 3 | [2-5] Threshold value
	//

	union byteToFloat converter1;			// uint8_t to Float converter
	union timeStampUnionType converter2;	// uint8_t to uint32_t converter
	int i,flag = 1, slaveNum;

	if(commRXData[0] == 68)
	{
		switch(commRXData[1])					// Check which command was sent
		{
		case 1: // Update slave preset
				converter1.b[0] = commRXData[3];
				converter1.b[1] = commRXData[4];
				converter1.b[2] = commRXData[5];
				converter1.b[3] = commRXData[6];

				for(slaveNum = 1; slaveNum <= MB_MAX_SLAVE; slaveNum++) {

					mbPreset[slaveNum] = mbPreviousReading[slaveNum] + converter1.f;
				}

				break;

		case 2: // Update minimum interval for readings
				converter2.b[0] = commRXData[2];
				converter2.b[1] = commRXData[3];
				converter2.b[2] = commRXData[4];
				converter2.b[3] = commRXData[5];

				mbMinInterval = converter2.counter;

				break;

		case 3: // Update slave threshold
				converter1.b[0] = commRXData[3];
				converter1.b[1] = commRXData[4];
				converter1.b[2] = commRXData[5];
				converter1.b[3] = commRXData[6];

				mbThreshold = converter1.f;

				break;
		}
	}
	else if(commRXData[0] == 69)
	{
		for(i=0;i<6;i++)
		{
			if(commRXData[i] != 69)
			{
				flag = 0;
			}
		}
		if(flag)
		{
			DIGITAL_IO_SetOutputHigh(&DIGITAL_IO_0);
			timeStampInit();							// Initialise SysTimer for TimeStamp
			commReadyForWrite = 1;
			for(slaveNum = 1; slaveNum <= MB_MAX_SLAVE; slaveNum++) {

				if(mbPreset[slaveNum] == 0) {
					mbPreset[slaveNum] = mbPreviousReading[slaveNum];

				}
			}
		}
	}

	UART_Receive(&UART_1,commRXData,6);	// Setup receive for the next cmd
}