Forum: Compiler & IDEs Wendeschützsteuerung über Atmel ansteuern


von Pascal (Gast)


Lesenswert?

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

von der mechatroniker (Gast)


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

"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

von GLT (Gast)


Lesenswert?

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.

von Pascal (Gast)


Lesenswert?

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

von der mechatroniker (Gast)


Lesenswert?

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.

von Pascal (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.