DaveWagner
10.07.2009, 19:58
Hallo
Wie der Titel schon sagt baue ich gerade einen Sonnenverfolger.
Der Sonnenverfolger funktioniert so, dass zuerst der Motor in die Ausgangsposition zurückfährt bis er an einem Taster anschlägt und stehen bleibt. Daraufhin wird der ADC-Wert eines LDRs, der auf einem Motor befestigt ist gemessen und währenddessen dreht der Motor sich ungefähr 180 Grad .Dabei wird der hellste Wert gemerkt und in eine Variable geschrieben("W" im Programm)
Danach fährt der Motor solange in die andere Richtung bis dieser Wert wieder erreicht ist.
Mein Problem ist , dass nach ca. 8 -10 maligen Ablaufen des Programms der Motor einfach ständig weiterläuft obwohl er sich nur solange drehen soll bis 180 Grad erreicht sind oder einer der beiden Taster gedrückt wird.
(Der andere Taster stellt sicher dass der Motor nicht zu weit in die andere Richtung fährt.Der erste Taster ist in der Ausgangsposition.
Nach dem Suchen des hellsten Punktes wird ca. 300 Sek lang gemessen ob einem zweiten LDR die Lichtstärke größer ist.
Wenn ja dann startet ein erneuter Suchlauf.
Des Weiteren startet ein neuer Suchlauf wenn beim ersten LDR die Lichtstärke weniger als die Hälfte des hellsten Punktes beträgt.
Der Motor wird mit einem L293D angesteuert
Hier das Programm:
$regfile = "m8def.dat " ' specify the used micro
$crystal = 1000000
Config Portd.0 = Input ' Pin 2
Config Portd.1 = Input
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.0 = Output
Config Portd.7 = Output
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'config ADC
Start Adc
Dim A As Integer
Dim W As Word
Dim B As Integer
Dim D As Integer
Dim L As Integer
Dim F As Integer
W = 0
L = 0
Portd.0 = 1
Portd.1 = 1
Do
Portd.7 = 1
Portb.0 = 1
W = 0
L = 0
Start1:
Portd.7 = 1
Portb.0 = 1
Wait 1
Portd.7 = 0
Portb.0 = 1
If Pind.0 = 0 Then
For A = 1 To 800 Step 1 'Halbkreisdrehung und suche nach hellstem Ad-Wert
If Pind.1 = 0 Then
Goto Start1
End If
If Getadc(0) > W Then
W = Getadc(0)
End If
Waitms 2
Next A
Else
Portd.7 = 1
Portb.0 = 1
Waitms 50
While Pind.0 = 1
Portd.7 = 1
Portb.0 = 0
Wend
Goto Start1
End If
Portd.7 = 1
Portb.0 = 1
D = W - 1
Wait 1
If Pind.1 = 1 Then
While Getadc(0) < D
Portd.7 = 1
Portb.0 = 0 'Wieder zurückfahren zum hellsten Punkt
If Pind.0 = 0 Then
Goto Start1
End If
Waitms 2
Wend
Else
Goto Start1
End If
Portd.7 = 1
Portb.0 = 1
B = W / 2
Wait 1
While L < 300
L = L + 1
Wait 1
If Getadc(0) < B Then
L = 301 'Falls es beim zweiten LDR heller istoder die Helligkeit beim ersten LDR unter der Hälfte liegt dann erneuter Suchlauf
End If
F = Getadc(1) - 75
If Getadc(0) < F Then
L = 301
End If
Wend
Loop
Kann das Problem am Code liegen ?
Wäre gut wenn mir jemand sagen könnte ob es an dem Programm liegt, dass der Motor nach einer bestimmten Anzahl von Suchläufen einfach weiterläuft oder nicht.
Mfg
David
Wie der Titel schon sagt baue ich gerade einen Sonnenverfolger.
Der Sonnenverfolger funktioniert so, dass zuerst der Motor in die Ausgangsposition zurückfährt bis er an einem Taster anschlägt und stehen bleibt. Daraufhin wird der ADC-Wert eines LDRs, der auf einem Motor befestigt ist gemessen und währenddessen dreht der Motor sich ungefähr 180 Grad .Dabei wird der hellste Wert gemerkt und in eine Variable geschrieben("W" im Programm)
Danach fährt der Motor solange in die andere Richtung bis dieser Wert wieder erreicht ist.
Mein Problem ist , dass nach ca. 8 -10 maligen Ablaufen des Programms der Motor einfach ständig weiterläuft obwohl er sich nur solange drehen soll bis 180 Grad erreicht sind oder einer der beiden Taster gedrückt wird.
(Der andere Taster stellt sicher dass der Motor nicht zu weit in die andere Richtung fährt.Der erste Taster ist in der Ausgangsposition.
Nach dem Suchen des hellsten Punktes wird ca. 300 Sek lang gemessen ob einem zweiten LDR die Lichtstärke größer ist.
Wenn ja dann startet ein erneuter Suchlauf.
Des Weiteren startet ein neuer Suchlauf wenn beim ersten LDR die Lichtstärke weniger als die Hälfte des hellsten Punktes beträgt.
Der Motor wird mit einem L293D angesteuert
Hier das Programm:
$regfile = "m8def.dat " ' specify the used micro
$crystal = 1000000
Config Portd.0 = Input ' Pin 2
Config Portd.1 = Input
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.0 = Output
Config Portd.7 = Output
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'config ADC
Start Adc
Dim A As Integer
Dim W As Word
Dim B As Integer
Dim D As Integer
Dim L As Integer
Dim F As Integer
W = 0
L = 0
Portd.0 = 1
Portd.1 = 1
Do
Portd.7 = 1
Portb.0 = 1
W = 0
L = 0
Start1:
Portd.7 = 1
Portb.0 = 1
Wait 1
Portd.7 = 0
Portb.0 = 1
If Pind.0 = 0 Then
For A = 1 To 800 Step 1 'Halbkreisdrehung und suche nach hellstem Ad-Wert
If Pind.1 = 0 Then
Goto Start1
End If
If Getadc(0) > W Then
W = Getadc(0)
End If
Waitms 2
Next A
Else
Portd.7 = 1
Portb.0 = 1
Waitms 50
While Pind.0 = 1
Portd.7 = 1
Portb.0 = 0
Wend
Goto Start1
End If
Portd.7 = 1
Portb.0 = 1
D = W - 1
Wait 1
If Pind.1 = 1 Then
While Getadc(0) < D
Portd.7 = 1
Portb.0 = 0 'Wieder zurückfahren zum hellsten Punkt
If Pind.0 = 0 Then
Goto Start1
End If
Waitms 2
Wend
Else
Goto Start1
End If
Portd.7 = 1
Portb.0 = 1
B = W / 2
Wait 1
While L < 300
L = L + 1
Wait 1
If Getadc(0) < B Then
L = 301 'Falls es beim zweiten LDR heller istoder die Helligkeit beim ersten LDR unter der Hälfte liegt dann erneuter Suchlauf
End If
F = Getadc(1) - 75
If Getadc(0) < F Then
L = 301
End If
Wend
Loop
Kann das Problem am Code liegen ?
Wäre gut wenn mir jemand sagen könnte ob es an dem Programm liegt, dass der Motor nach einer bestimmten Anzahl von Suchläufen einfach weiterläuft oder nicht.
Mfg
David