PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : IR-Sensor, PWM, Fehler ?



minium :)
07.04.2007, 09: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

x-ryder
07.04.2007, 10:14
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, 10: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

x-ryder
07.04.2007, 10:28
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

Jon
07.04.2007, 11:07
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, 11: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, 12: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

Jon
07.04.2007, 12:35
Sind die 450 richtig??

jon

minium :)
07.04.2007, 13: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

Jon
07.04.2007, 16:21
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

Michael
07.04.2007, 17:02
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

Jon
07.04.2007, 19:32
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