Archiv verlassen und diese Seite im Standarddesign anzeigen : IR-Sensor, PWM, Fehler ?
minium :)
07.04.2007, 10:51
Hallo,
ich bin gerade(schon ein bischen länger) dabei ein Programm zu schreiben, das, wenn der IR-Sensor etwas erkennt der Roboter nach hinten fährt. Mein Problem ist aber, dass er schon beim Start rückwärts fährt. Hier mein Programm, was ist der Fehler ?
$crystal = 8000000
$regfile = "m8def.dat"
Dim Result As Word
Config Pinb.0 = Output
Config Pind.7 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
Start Adc
Do
Compare1a = 255
Compare1b = 255
Portb.0 = 1
Portb.1 = 0
Portd.7 = 0
Portb.2 = 1
Result = Getadc(6)
If Result > 450 Then
Compare1a = 255
Compare1b = 255
Portb.0 = 0
Portb.1 = 1
Portd.7 = 1
Portb.2 = 0
Waitms 1000
Compare1a = 255
Compare1b = 255
Portb.0 = 0
Portb.1 = 1
Portd.7 = 1
Portb.2 = 0
End If
Loop
End
wäre vllt ganz sinnig, wenn du uns auch schreiben könntest um was für einen ir-sensor es sich handeln tut und an welchen ports was hängt ^^
dankö,
Martin
minium :)
07.04.2007, 11:25
hi,
sorry, hier die Daten:
Der Sensor ist ein IR-Sensor von Sharp und ist das Model GP2Di2 F 67(das steht auf ihm drauf), er ist an ADC6. Die Motoren sind an pinD7,pinB3 und pinB0, pinB1.
Viele grüße
bist du sicher dass das GP2DI2 ist? und nicht sowas wie GP2D12? und was heißt die motoren wären auf pinD7 [...] ?? kannst du das bitte nochmal näher erläutern? hast du die motoren über PWM angesteuert? welcher chip liegt dann dazwischen?
Maddin
Problem:
Du lässt den Bot erst nach vorne fahren, fragst dann den ADC ab. Wenn dieser über 450 ist, dann fährst du rückwärts. Sollte also stimmen.
bleibt offen:
Ist der ADC Wert für den Sensor richtig? Welcher Entfernung entsprechen denn 450?
Probiere es mal so:
$crystal = 8000000
$regfile = "m8def.dat"
Dim Result As Word
Config Pinb.0 = Output
Config Pind.7 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Adc = Single , Prescaler = Auto , Reference = Internal
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
Start Adc
Do
Compare1a = 255
Compare1b = 255
Portb.0 = 1
Portb.1 = 0
Portd.7 = 0
Portb.2 = 1
Result = Getadc(6)
If Result > 450 Then
Compare1a = 255
Compare1b = 255
Portb.0 = 0
Portb.1 = 1
Portd.7 = 1
Portb.2 = 0
wait 1
End If
Loop
End
Der Abschnitt mit den "waitms 1000" und dem danach ist nicht wichtig. (Das kann man kürzen. Hab ich gemacht.)
Und auch kannst du wahrscheinlich die interne Referenzspannung verwenden, da die meisten Sensoren maximal 2,6 Volt liefern. So ist du Auflösung genauer.
jon
minium :)
07.04.2007, 12:27
Hi,
die Motoren werden über PWM angesteuert (mit dem BA6845). Ja, es kann auch eine 1 sein also GP2D12.
Viele Grüße
P.s: Werde das Prog von Jon gleich testen in ca. 1h
minium :)
07.04.2007, 13:34
Hi,
bei dem Prog. von Jon fährt de Roboter nur gerade aus und fährt nicht rückwärts wenn ein Gegenstand da ist.
Viele Grüße
Sind die 450 richtig??
jon
minium :)
07.04.2007, 14:03
Hi,
der Thread kann gelöscht werden, da der michael (von team-iwan) mir per icq das richtige geschickt hat(danke nochmal). Hier das Prog.:
$crystal = 8000000 'interne Oszillatorfrequenz (bereits fertig eingestellt)
$regfile = "m8def.dat" 'Definitionsdatei, damit der Compiler weiß, welcher Chip es ist
'AD-Wandler einschalten:
Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc
'Timer für PWM konfigurieren und einschalten:
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1024
Start Timer1
Ddrb = &B00000111 'Datenrichtungsregister PortB (0=Eingang, 1=Ausgang)
Ddrd = &B10000000 'Datenrichtungsregister PortD (0=Eingang, 1=Ausgang)
Ddrc = &B00000000
Dim Result As Word
Dim X As Byte '2 Variablen vom Typ Byte
Dim Y As Byte 'also von 0-255
Motor1_dir Alias Portd.7 'Motor1 Richtung
Motor2_dir Alias Portb.0 'Motor2 Richtung
X = 255
Y = 255
Do 'Schleifenanfang
Result = Getadc(6)
Pwm1a = X 'Motor1 PWM
Pwm1b = Y 'Motor2 PWM
If Result > 400 Then
Motor1_dir = 0 'Motor1 Richtung wechseln
Motor2_dir = 1 'Motor1 Richtung wechseln
Else
Motor1_dir = 1
Motor2_dir = 1
End If
Waitms 10 '10ms warten
Loop 'Schleifenende
End
Viele Grüße
Ich verstehe das nicht ganz *g*
Wie soll das mit der Richtungsänderung funktionieren??
Du stellst ja nur einen Pin pro Motor um. Was ist mit dem anderen Pin los? Da wird ja nirgends im Programm gesagt ob low oder high.
Sonst: Umständlich geht es auch ;)
jon
Hallo Jon,
Der Treiber (BA6845) wird über je 2 Pins pro Motor gesteuert, Richtung und Enable (=PWM)
Für den Richtungswechsel muß nur 1 Pin getoggelt werden.
Gruß, Michael
Gut. Ich habe mir nur den Schaltplan zu diesem Motortreiber angeschaut. Bei anderen Motortreibern ist es nämlich so, dass man beide Pins Toggeln muss.
jon
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.