Guten Abend Zusammen,
ich baue zur zeit einen Mobilen Roboter der nun auch noch einer linie folgen soll.
Ich programmiere mit assembler, verwende den atmega 48 (plus den l293d, für die motoren) und das AVR studio 4.
Als Basis habe ich den ARX- CH 09 verwendet. Der schaltplan für die motoren befindet sich im anhang.
Per pwm hab ich nun es nun programmiert, dass mein roboter kurven fahren kann.
Das programm hier:
.include "m48def.inc"
.def temp1 = r17
.def counter = r16
.equ XTAL = 1000000
init:
ldi temp1, HIGH(RAMEND) ; Stackpointer initialisieren
out SPH, temp1
ldi temp1, LOW(RAMEND)
out SPL, temp1
; Port B auf Ausgang
ldi temp1, 0xFF
out DDRB, temp1
out DDRC, temp1
ldi temp1, 0b00101000
out PORTC, temp1
;
; Timer 1 einstellen
;
; Modus 14:
; Fast PWM, Top von ICR1
;
; WGM13 WGM12 WGM11 WGM10
; 1 1 1 0
;
; Timer Vorteiler: 4096????
; CS12 CS11 CS10
; 0 1 0
;
; Steuerung der Ausgangsports: Set at BOTTOM, Clear at match
; COM1A1 COM1A0 COM1B1 COM1B0
; 1 0 1 0
;
ldi temp1, (1<<COM1A1) | (1<<COM1B1) | (1<<WGM11) | (0<<WGM10)
sts TCCR1A, temp1
ldi temp1, (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11)| (0<<CS10)
sts TCCR1B, temp1
;
; den Endwert (TOP) für den Zähler setzen
; der Zähler zählt bis zu diesem Wert
;
ldi temp1, HiGH(1000)
sts ICR1H, temp1
ldi temp1, LOW(1000)
sts ICR1L, temp1
;
; der Compare Wert
; Wenn der Zähler diesen Wert erreicht, wird mit
; obiger Konfiguration der OC1A Ausgang abgeschaltet
; Sobald der Zähler wieder bei 0 startet, wird der
; Ausgang wieder auf 1 gesetzt
linkskurve:
ldi temp1, HIGH(800)
sts OCR1AH, temp1
ldi temp1, LOW(800)
sts OCR1AL, temp1
ldi temp1, HIGH(300)
sts OCR1BH, temp1
ldi temp1, LOW(300)
sts OCR1BL, temp1
clr temp1
sts TCNT1H, temp1
sts TCNT1L, temp1
; sei
geradeaus:
ldi temp1, HIGH(800)
sts OCR1AH, temp1
ldi temp1, LOW(800)
sts OCR1AL, temp1
ldi temp1, HIGH(800)
sts OCR1BH, temp1
ldi temp1, LOW(800)
sts OCR1BL, temp1
clr temp1
sts TCNT1H, temp1
sts TCNT1L, temp1
; sei
rechtskurve:
ldi temp1, HIGH(300)
sts OCR1AH, temp1
ldi temp1, LOW(300)
sts OCR1AL, temp1
ldi temp1, HIGH(800)
sts OCR1BH, temp1
ldi temp1, LOW(800)
sts OCR1BL, temp1
clr temp1
sts TCNT1H, temp1
sts TCNT1L, temp1
; sei
stop:
ldi temp1, HIGH(0)
sts OCR1AH, temp1
ldi temp1, LOW(0)
sts OCR1AL, temp1
ldi temp1, HIGH(0)
sts OCR1BH, temp1
ldi temp1, LOW(0)
sts OCR1BL, temp1
clr temp1
sts TCNT1H, temp1
sts TCNT1L, temp1
; sei
main:
rjmp main
Mein problem ist nun, dass mein roboter auch noch einer linie folgen soll. Wie ich das jedoch programmiere weis ich überhaupt nicht, da ich ziemlich nue bin hier. Ich hätte es mit zwei phototransistoren gemacht, plus einem led dass für licht unter dem roboter sorgt. Aber wo ich diese phototransistoren anschliesen muss usw. weis ich überhaupt nicht.
Über hilfe würde ich mich sehr freuen.
schönen abend noch.
Es gibt 3 Möglichkeiten wie man die Fototransistoren anschließt.
1.) Fototransistor mit dem ADC des µC verbinden. So kann man die Schwelle ab wann der Transistor anspricht (Linie erkannt bzw nicht erkannt) mit dem µC einstellen (einen Wert einprogrammieren bzw kalibrieren)
2.) Den Fototransistor mit einem Komparator auswerten. Den Wert ab wann er die Linie erkennt muss/kann man mit einem Poti oder einen Spannungsteiler einstellen. (Der µC erkennt nur Linie erkannt bzw nicht erkannt)
3.) Den Fototransistor direkt an einen Digitaleingang verbinden. Wie gut das funktioniert bzw wie gut er anspricht weiß ich nicht. Ich weiß auch nicht was passiert wenn der Wert im undefinierten Bereich liegt. (bei TTL=5VPegel wäre das zwischen 0,8 und 2,0V).
MfG Hannes
Lesezeichen