Hallo, ich möchte für einen Drehstrommotor eine Wendeschützschaltung per Mikrokontroller ansteuern. Der Motor hebt und senkt eine Antennenanlage, bisher sind an der Anlage ein Hoch und ein Runter Taster. Dies will ich nun erweitern, dass ich auch aus der Ferne die Anlage bedienen kann indem ich (aus Mangel an freien Leitungen) via Serielle Schnittstelle von einem Atmel Befehle an einen Zweiten Atmel gebe der dann entsprechend seine Ausgänge schaltet und auch seine Eingänge abfragt. Mein Problem ist nun zunächst wie ich das im Programm realisiere. Betrachten wir nun erstmal nur einen Atmel der dann am Motor (in Motornähe) sein soll. Hier sind an Inputs vorhanden: Zwei Taster (hoch/runter), zwei Endschalter (Anschlag oben/unten). Alles sind Schließerkontakte. Die Outputs müssen mir über einen Transistor zwei Schütze ansteuern (die sind zusätzlich mechanisch verriegelt) um die Drehrichtung des Motors zu ändern. Jetzt muss das Programm so aussehen, dass WÄHREND der Taster zum Heben oder Senken der jeweils richtige Ausgang das Schütz schaltet UND SOBALD ein Endschalter schaltet, SOFORT der Ausgang für das Schütz abschaltet und nur der Taster für die Gegenrichtung funktioniert. Zusätzlich muss eine kurze Zeit bevor der Motor anläuft (also das jeweilige Schütz schaltet) ein Ausgang schalten der einen Elektromagneten betätigt welcher die Antennenanlage "entriegelt" und nach Abfallen (stopp des Motors) wieder den Magneten abschaltet. Mir ist nun einfach unklar wie ich denn diese Bedingungen irgendwie "zeitgleich" hinbekomme, dass denn nicht die Antenne über den Endanschlag hinauslaufen kann... Über Ideen oder gar einen Mini Code-Schnipsel wäre ich sehr dankbar. Vielen Dank, Grüße Pascal
Zunächst mal würde ich das Problem vollständig spezifizieren. Die Punkte die zu klären sind wären? * Wird im reinen Tipp-Betrieb gearbeitet (also Bewegung nur solange Taster gedrückt) oder wird ohne Taster bis Endlage bzw. Stopp-Tastendruck gefahren? * Ist eine Totzeit zwischen Stoppen des Antriebs und Schließen der Verriegelung erforderlich? * Ist eine Totzeit beim Umsteuern hoch->runter und umgekehrt erforderlich? * Wenn bei letzterem ja: soll während dieser die Verriegelung verriegeln? * Was soll passieren, wenn während der Fahrt in die eine Richtung der Taster für die andere hinzugedrückt wird? (1) Ding bleibt stehen, (2) Beibehalten der zuerst gedrückten Richtung, (3) Umsteuern in die neue Richtung Dann kann man versuchen, das Ganze irgendwie umzusetzen.
"zeitgleich" klingt zwar furchtbar kompliziert, aber wenn du dir mal bewusst machst, daß ein AVR mit dem Standard-"Schnarchtakt" von 1Mhz einen Ausgang 500.000 mal pro Sekunde umschalten kann, deine Schütze aber höchstens 10mal pro Sekunde schaffen, ist das doch eine mittlere Ewigkeit. In aller Ruhe nacheinander Taster und Schalter einlesen, feststellen, was jetzt geschaltet werden darf, und was nicht, schalten, und dann alles wieder von vorn. Oliver
Bezüglich Drehrichtungsumkehr/Endlagen Die beiden Leistungsschütze für Auf/Ab gegenseitig verriegeln und eine Umschaltzeit mit einplanen. Die Endlagenschalter nicht nur Softwareseitig einbinden, sondern auch im Ansteuerungsteil (Strompfad) mit einschleifen. So kann auch bei einem Softwarefehler nicht allzuviel passieren.
Hallo, und erstmal vielen Dank für die guten Antworten. Zum Mechatroniker: * Es wird im reinen Tipp-Betrieb gearbeitet (vorhanden sind ein Schlüsselschalter für Hauptschütz Ein/Aus sowie zwei Taster mit Pfeil Hoch und Runter. Lasse ich den Taster in die jeweilige Richtung los, dann bleibt die Anlage stehen. Weiterhin existiert noch ein Not-Aus, der soll den Motor in Stillstand setzen und die Verriegelung aktivieren) * Es ist eine Totzeit notwendig. Es wird eine Antennenanlage mit ca. 350-450 kg bewegt. Diese Zeit sollte min. 1 s betragen * Die Verriegelung muss bei einer Totzeit unbedingt aktiv sein jedoch erst wenn der Motor sicher im Stillstand ist. Ich vermute, dass sonst das Bremsmoment vom Motor nicht ausreicht und die Antennenanlage wieder "runterknallt". * Wird eine andere Taste während der Fahrt gedrückt, dann soll die Anlage entweder weitermachen oder aber stehenbleiben, je nachdem was einfacher wäre. Es wird in der Steuerung auch noch ein Motorschutz mit Magnetischer und Thermischer Auslösung vorhanden sein. Ggf. möchte ich gerne diese Daten noch mit auslesen. Wenn das läuft, dann schwebt es mir vor, dass dieser Mikrocontroller die Daten Seriell zu einem abgesetzten sendet und hier zusätzlich noch ein Wahlschalter Lokal/Fern vorhanden ist, dann soll an dem abgesetzten generell der aktuelle Status (Lage der Antenne: unten/oben/dazwischen, aktuelle Bewegungsrichtung, Status Verriegelung) via Kontrolllampe oder gar LCD angezeigt werden. Ist der Schalter auf "Fern", dann sollen die lokalen Bedienelemente inaktiv sein und statt dessen ab abgesetzten Mikrokontroller die (identischen) Bedienelemente aktiv sein. Zu GLT: Ja, die Endlagenschalter unterbrechen auch direkt die 24 V zu den beiden Schützen und dem Elektromagnet-Ansteuerrelais... Hier wird auch mit dem Not-Aus unterbrochen... Noch irgendwelche Anregungen bevor ich mich dann mal langsam aber sicher an erste Tests mache? Danke, Grüße Pascal
Tips: an globalen Variablen einmal das komplette Eingangssignalabbild (Taster (nach Entprellung), Endlagenschalter, Überwachungskontakt des Not-Aus, Schlüsselschalters, Motorschutzschalters, Schalterstellung Orts-/Fernbedienung usw. in einem Byte zusammenfassen. Ein weiteres Byte für die wichtigsten booleschen Zustandsvariablen (Bewegung nach unten aktiviert, Bewegung nach oben aktiviert, Entriegelung aktiviert usw.) Diese Zustandsbytes kannst du dann so wie sie sind sowohl an die LCD-Ansteuerroutine schicken (die sie auseinanderdröselt und die Information lesbar aufbereitet) als auch über UART an die Fernbedienstation. Dadurch hast du automatisch auch die Möglichkeit, dir für jede Kombination von unvorhergesehenen Ereignissen sinnvolle Fehlermeldungen auszudenken, die entsprechende Programmlogik kannst du sauber in der LCD-Aufbereitungsroutine kapseln und diese Routine in beiden Stationen in identischer Form verwenden. Du rufst also in einer Endlosschleife 4 Routinen auf: 0. Eingangswerte einlesen 1. Tasterauswertung (lokal/fern je nach Einstellung), Entprellung und Flankenerkennung (sprich zusätzlich ein Bit setzen, daß die jeweilige Taste im jeweiligen Zyklus neu gesetzt wurde) 2. Ermitteln der Vorgabewerte für die Bewegung aus den aktuellen Vorgabewerten und den gedrückten/losgelassenen Tasten und Ereignissen wie Not-Aus etc. 3. Ermitteln der Ausgangswerte aus den Vorgabewerten unter Berücksichtigung der Timings. Du führst also Zähler mit: Anzahl Zyklen, seitdem die Bewegung runter nicht mehr aktiv ist, dito für rauf, Anzahl Zyklen, seit der die Entriegelung aktiv ist, etc. Ausgeben der Ausgangswerte. 4. Rausschreiben der Statusbytes an die LCD-Aufbereitungsroutine und an die UART Interrupts: - UART-Empfang: Übernahme der Remote-Tasterinformation in globale Variablen, die beim nächsten Ausführen von Schritt 1 evtl. ausgewertet werden Damit das mit den Timings richtig klappt, muß die Endlosschleife jetzt noch in gleichen Zeitabständen durchlaufen werden, beispielsweise alle 50 ms. Dafür nehmen wir einen Timerinterrupt. Gesamten Code in den Interrupt ist unschön, also setzen wir nur ein Flag auf 1. Am Ende der Hauptschleife warten wir, bis dieses Flag 1 ist, setzen es auf 0 und machen weiter.
Hallo Mechatroniker, vielen Dank für die gute Antwort. Das hat mir noch ein paar gute Hinweise gegeben. Ich habe schon super lange nichts mehr in C (bzw. C++) gemacht. Habe jetzt mal mit der Programmierung angefangen, hänge aber schon fest... Eine sicher simple Frage, finde jedoch keine Lösung: Der Tippbetrieb. Habe hier zum Testen ein STK500 Board mit einem atmega32 drauf. LEDs habe ich an PortB, Taster an PortD. Zum Entprellen nehme ich nun die debounce-Lösung von Peter Dannegger. Somit nehme ich nun get_key_rpt und frage den Taster ab. Habe das nun in einer while Schleife und sage, solange das, dann soll eine LED leuchten, dann nach loslassen wieder aus. Irgendwie funkt das aber nicht. Bisher sieht es nur so im Code aus: #include <avr/io.h> #include <stdint.h> //#include <inttypes.h> #ifndef F_CPU #define F_CPU 2000000 #endif #include <avr/interrupt.h> #include <debounce.h> int main(void) { DDRD = 0x00; // port where swiches connected as input PORTD = 0xFF; // pull-ups TCCR0 = (1<<CS02)|(1<<CS00); // divide by 1024 TIMSK = 1<<TOIE0; // enable timer interrupt LED_PORT = 0xFF; LED_DDR = 0xFF; sei(); for(;;) { // main loop // single press while( get_key_rpt( 1<<SWUP )) LED_PORT = 1<<LED0; } } Was mache ich denn falsch? Pascal
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.