Schiebetür Steuerung

Gast #5493721
Lesenswert?

Guten Tag,

ich bin gerade dabei eine Elektrische Schiebetür zu Automatisieren , bin 
aber leider noch Anfänger was IQ angeht . Habe es bist jetzt geschafft 
das es Auf/Zu fährt aber jetzt ist meine Frage wie kann ich es mit der 
Zeit steuern wie z.B. wenn innerhalb von 10 sec. der Endschalter nicht 
erreicht wird das Automatisch abschaltet, der ein Klemmschutz ist 
mechanisch realisiert nur ich möchte nicht das der Motor dann durchläuft 
wenn er denn Endschalter nicht erreicht. Leider ist es nicht möglich mit 
einem or und waitms denn da wird ja der komplette Controller gestoppt 
und der Endschalter ist Außerfunktion. Und wie ist es möglich das die 
Öffnungszeit zu Realisieren ohne den ganzen Controller in dieser Zeit zu 
blockieren? Was ich noch gerne wissen möchte ist es gut wenn man als 
Verriegelung die 2 Ausgänge im Start Befehle gibt das nicht erneut 
gestartet werden kann, oder gibt es da bessere alternativen denn  in der 
warte Zeit wäre es ja möglich erneut Zu starten! Was eigentlich egal 
wäre da die Türe durch den Endschalter abgeschaltet wird wenn sie offen 
ist ?(Die Schütze werden Hardwareseitig auch verriegelt.) Als Motor 
dient ein 24v dc Motor der umgepolt wird.

Meinen Code füge ich bei soweit funktioniert er!

würde mich auf verschiedene Lösungsvorschläge freuen

LG

1
avr.device = atmega328p         //Controller-Typ festlegen
2
avr.clock = 8000000          //Dem Compiler mitteilen mit welcher Taktrate der Controller läuft
3
avr.stack = 64            //Den Programmstack einstellen
4

5

6
#define Auf as PortD.5
7
#define Zu as PortD.6
8
#define Autobefehl as PortD.2
9
#define EndschalterOffen as PortD.3
10
#define EndschalterZU as PortD.4
11
#define HandOffen as PortD.1
12

13

14
Auf.mode = output,low                              //Tür Auf als Ausgang
15
Zu.mode   = output,low                           //Tür ZU als Ausgang
16
Autobefehl.mode   = input,pullup                   //Auf/Zu Automaik als Eingang, Pullup einschalten
17
EndschalterOffen.mode   = input,pullup            //Endschalter wenn Türe Offen (NC) als Eingang, Pullup einschalten
18
EndschalterZU.mode   = input,pullup                //Endschalter wenn Türe ZU (NC) als Eingang, Pullup einschalten
19
HandOffen.mode   = input,pullup                    //Handschaltung Tür auf und offen bleiben als Eingang, Pullup einschalten
20

21

22
'Automatik
23
do
24

25

26
if (Autobefehl = 0) and (EndschalterZU = 1) and (EndschalterOffen = 1) then     //Darf nur starten wenn die Tür auch geschlossen ist,
27
                                           //und ein Startbefehel kommt und Endschalteroffen nicht gedrückt ist.
28
Auf = 1
29
endif
30

31

32
if Auf = 1 and (EndschalterOffen = 0)  then            // Soll Stoppen wenn Auf aktiv ist wenn Endschlalteroffen gedrückt ist odernach 10000ms.
33
Auf = 0
34
endif
35

36

37
loop
(Firma: Vescomp) #5493987
Lesenswert?

Patzi schrieb:
> Meinen Code füge ich bei soweit funktioniert er!

 Möglich, nur wie ?

Patzi schrieb:
1
 if (Autobefehl = 0) and (EndschalterZU = 1) and (EndschalterOffen = 1) 
2
 then     //Darf nur starten wenn die Tür auch geschlossen ist,
3
          //und ein Startbefehel kommt  und Endschalteroffen nicht gedrückt ist.

 So macht man das aber nicht - Tür soll immer aufgehen können - was
 ist wenn etwas oder jemand dazwischen klemmt ?

Patzi schrieb:
> Danke für deine Antwort leider nimmt er nur waitms die anderen
> funktionieren nicht in der Syntax auch delay nicht!!

 Vielleicht so ?
1
 Dim SysCnt As Word = 0
2
 Dim TuerCnt As Word = 0
3
 Dim TimeOut As Boolean = false
4

5
 SysInit()
6

7
 Avr.Interrupts.enable      '* Enable global Interrupts
8

9
 TuerAuf(100)                '*** 100 * 100ms  = 10000ms = 10sec für die Tür um aufzugehen
10
 
11
 Do
12
   
13
   
14
   if TimeOut Then
15
     ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
16
         '*** 10sec sind ohne Endanschlag vorbei, tu etwas
17
         '...
18
     ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
19
   EndIf
20
   
21
   if Auf = 1 and (EndschalterOffen = 0)  then    '***  Ich nehme an, daß jetzt die Tür zu ist ?
22
     Timer1.CmpA.Disable          '* Timer1 ausschalten
23
     Auf = 0
24
   EndIf
25
 
26
   '...
27
   '...
28
 Loop
29
  
30

31
Procedure SysInit()
32
'*****  Konfig Timer1  *****
33
 Timer1.Clock =  256            '* Clock divider auf 1: 256 (8 Mhz = 125ns * 256 = 32uSec)
34
 Timer1.CmpA.Value = 3124          '* Outputcompare-Register auf 3125 ( 3125 * 32uSec =100mS)
35
 Timer1.CmpA.Isr = timer1_compare        '* Compare-Interrupt aktivieren
36
 Timer1.CmpA.Clear.Enable          '* CTC-Mode aktivieren
37
EndProc
38

39
Procedure TuerAuf(xms As Word)
40
   TuerCnt = xms          '*** xms * 100ms
41
   TimeOut = false
42
   Auf = 1    '*** Tür auf (Beim Endanschlag wird Timer1 ausgeschaltet)
43
   Timer1.CmpA.Enable            '* Timer1 einschalten
44
EndProc
45

46
Isr timer1_compare fastauto    '*** Alle 100ms
47
If TuerCnt > 1 then      '*** Zählt rückwärts bis Null
48
TuerCnt--
49
elseif TuerCnt = 1 then
50
TuerCnt = 0
51
TimeOut = 1
52
endif
53
SysCnt++        '*** Zählt immer vorwärts
54
EndIsr
Gast #5494114
Lesenswert?

Uff Bascom ist schon zu lange her bei mir. Vielleicht wollte ich es auch 
verdrängen :-)
Timer ist kein Basic Befehl, sondern der Name einer oder mehrerer 
Peripherieeinheiten in Deinem Mikrocontroller.
Diesem Ding kannst Du einen festen Takt vorgeben und der zählt einfach, 
egal was Dein Programm gerade macht. Und wenn Du hin und wieder den 
Zählerstand liest, könntest Du bestimmen, wieviel Zeit vergangen ist.
Da liegt nämlich die Kunst, die Zeit nicht zu vertrödeln, sondern im 
Programmablauf fort zu fahren. So kannst Du auf den Endschalter achten 
und nach einer festgelegten Zeit aufgeben.
Interrupts braucht es für Deine Aufgabe nicht unbedingt. Da Du 
vermutlich noch am Lernen bist, würde ich das Kapitel nach hinten 
verschieben.
Was Du Deinem Programm noch beibringen solltest ist eine sogenannte 
Entprellung der Eingänge. Auch dabei kann Dir ein Timer eine große Hilfe 
sein, um die Frage zu beantworten, ob der Eingang jetzt so richtig in 
einem Zustand ist oder nur so rumkaspert.
Nimm einen Timer mit möglichst vielen Bits. Mach Dich aber trotzdem auf 
einen sogenannten Timerüberlauf gefasst.
#5494640
Lesenswert?

Nein Paul B,

Patzi hat sich schon im LunaAVR Forum mit der selben Fragestellung 
gemeldet und auch Lösungswege aufgezeigt bekommen, teilweise als PN.

Auch findet man hier einen kompletten Lernvorschlag, noch ohne 
Timernutzung.

Als erstes muss ein DEA "erzeugt" werden, der dann über eine "state 
machine" implementiert werden kann.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren