/*History Version 1.0 Ein & AUsgänge definiert 19.05.23 sowie CAN Nachrit senden Erste Tests auf Anlage bestanden 2.1 3.0 Weitere fahrspannungen hinzugefügt für die einzelnen abschnitte 4.0 Bezeichnung zum Unterscheiden von Fahrspannung abschalten (Fahrstromxx) und Regelung via PWM (UFahrxxx) eingeführts 5.0 CAN Auf einmal senden Eingestellt als funktion definiert */ // -------------------------------------- Umbenenen der STM Pins // Bliotheken //------------------------------------------------------------------------------------------------------------Testweise auskommentiert #include #include "stm32f103.h" // Bei selbst erstellten Bibliotheken der name immer in Anfuehrungszeichen!! Nicht in <> kleiner als Zeichen! // EIngaenge // const int SensorFahrstrom = PB1; uint8_t SensorFahrstromState = 0; // Ausgaenge const int UFahrWendelSud1nach0 = PB0; // Steuerung via PWM const int FahrstromHauptSBHSud = PA0; // An Abschalten const int FahrstromModulNotHalt = PA1; // An Abschalten bei Kurzschluss uint8_t UFahrWendelSud1nach0State = 0; uint8_t FahrstromHauptSBHSudState = 0; bool FahrstromModulNotHaltState = 0; // ------------------------------------------Variabelen // CAN uint8_t counter = 0; // Zahler für nachricht wurde x mal versand uint8_t frameLength = 0; // framelegth ist die länge der nachricht hier kann man auch im Sendeteil eine Zahl angeben unsigned long previousMillis = 0; // stores last time output was updated const long interval = 100; // transmission interval (milliseconds) Intervall in dem gesendet wird CAN_msg_t CAN_TX_msg; // Initialisierung Senden CAN_msg_t CAN_RX_msg; // Initialisierung EMPFANGEN // Sonstige Variablen bool FahrstromFehlerModul1 = 0; // ----------------------------------------------- Funktionen void CANMSG0x1000019() { // ---------------------------- CAN Nachricht 0x100019 senden // eigentliche Daten werden eingefüllt bitWrite (CAN_TX_msg.data[0], 0, FahrstromFehlerModul1); // mit bitwrite lassen sich einzelne bits innerhalb eines Bytes beschreiben. Hier Zustand TasterState in Erstes (ganz rechtes) Bit von Data0 schreiben CAN_TX_msg.len = 1; // Länge der Nachricht unsigned long currentMillis = millis(); // Senden alle x millisekunden if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; if ( ( counter % 2) == 0) { // Rest der Nachricht wird befüllt CAN_TX_msg.type = DATA_FRAME; if (CAN_TX_msg.len == 0) CAN_TX_msg.type = REMOTE_FRAME; CAN_TX_msg.format = EXTENDED_FORMAT; CAN_TX_msg.id = 0x1000019; // nachrichten ID } CANSend(&CAN_TX_msg); // Übergabe der Nachricht an die Hardware } } void setup() { pinMode(LED_BUILTIN, OUTPUT); //LED auf Arduino Blinken um programierung zu bestätigen delay(1500); digitalWrite(PC13, HIGH); delay(500); digitalWrite(PC13, LOW); delay(500); digitalWrite(PC13, HIGH); delay(500); digitalWrite(PC13, LOW); delay(500); digitalWrite(PC13, HIGH); // CAN aktivieren { Serial.begin(115200); bool ret = CANInit(CAN_500KBPS, 0); // CAN_RX mapped to PA11, CAN_TX mapped to PA12 if (!ret) while (true); } // -------------------------------------- pinMode { pinMode(SensorFahrstrom, INPUT); pinMode(UFahrWendelSud1nach0, OUTPUT); pinMode(FahrstromHauptSBHSud, OUTPUT); pinMode(FahrstromModulNotHalt, OUTPUT); } } void loop() { // ---------------------------- Begin CAN Empfangen { // ---------------------------- CAN Nachricht empfangen if (CANMsgAvail()) { CANReceive(&CAN_RX_msg); // Prüfen ob neue Nachricht empfangen werden kann (liegt eine neue Nachricht zum abholen bereit?) if (CAN_RX_msg.type == DATA_FRAME) { if (CAN_RX_msg.id == 0x100020) // Empfang der nachricht 0x100020 von Zentrale { UFahrWendelSud1nach0State = (CAN_RX_msg.data[0]); FahrstromHauptSBHSudState = bitRead (CAN_RX_msg.data[1], 0); } } } } //------ Auslesen der Eingaenge (Sensoren) { SensorFahrstromState = analogRead(SensorFahrstrom); if (SensorFahrstromState > 200) { FahrstromModulNotHaltState = 1; } else { FahrstromModulNotHaltState = 1; } FahrstromFehlerModul1 = FahrstromModulNotHaltState ; } //------ Schalten der Aisgaenge { analogWriteFrequency(100); analogWrite (UFahrWendelSud1nach0, UFahrWendelSud1nach0State); digitalWrite(FahrstromHauptSBHSud, FahrstromHauptSBHSudState); digitalWrite(FahrstromModulNotHalt, FahrstromModulNotHaltState); } }