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