PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 3 Sensoren zum Verfolgen der Linie?



GrimReaper
05.10.2007, 11:36
Hallo;

Ich bin noch kein Experte mit dem Asuro, aber habe mich trotzdem schon mal daran versucht ihn etwas umzubauen. Mein Ziel ist es 3 Sensoren zum Verfolgen der Linie zu haben (fordert zwar mehr den Prozessor, finde ich aber einfach besser).

Die Liniensensoren werden ja über den A/D Wandler ausgelesen und da ich die Odometrie überhaupt nicht brauche, dachte ich mir, ich benutze einen A/D Port der Odometrie (mir ist klar, dass da die BackLEDs mit dranhängen und die nicht mehr funktionieren wenn man da was ändert).


Hir mal der Schaltplan für den A/D Port ADC0 (Pin 23), da hängt normalerweise die rechte Odometrie dran, die ich netfernt habe. Ich habe einfach die Schaltung für die Liniensensoren eins zu eins kopiert und natürlich die selben Bauteile verwendet.


U+
|
Fototransistor
|
|
A/DC 0 (Pin23) ---------
|
|
Widerstand (20 kOhm)
|
GND



In der asuro.c habe ich die Funktion für das auslesen der Fototransistoren wie folgt umgeschrieben:


void LineData(unsigned int *data)
{
ADMUX = (1 << REFS0) | IR_LEFT; // AVCC reference with external capacitor
ADCSRA |= (1 << ADSC); // Start conversion
while (!(ADCSRA & (1 << ADIF))); // wait for conversion complete
ADCSRA |= (1 << ADIF); // clear ADCIF
data[0] = ADCL + (ADCH << 8);

ADMUX = (1 << REFS0) | IR_RIGHT; // AVCC reference with external capacitor
ADCSRA |= (1 << ADSC); // Start conversion
while (!(ADCSRA & (1 << ADIF))); // wait for conversion complete
ADCSRA |= (1 << ADIF); // clear ADCIF
data[1] = ADCL + (ADCH << 8);

ADMUX = (1 << REFS0) | WHEEL_RIGHT; // AVCC reference with external capacitor
ADCSRA |= (1 << ADSC); // Start conversion
while (!(ADCSRA & (1 << ADIF))); // wait for conversion complete
ADCSRA |= (1 << ADIF); // clear ADCIF
data[2] = ADCL + (ADCH << 8);
}

Nun zu meinem Problem, grundsätzlich funktioniert es, ich sehe hell/dunkel Unterschiede, allerdings werden nur Werte zwischen 0 und 8 zurückgegeben.
Ich verstehe das nicht ganz, da ich die selben Bauteile wie für die Liniensensoren verwendet habe und zum Auslesen ja auch die selbe Referenzspannung benutzt wird.

Hat jemand eine Idee, woran das liegen könnte?

damaltor
05.10.2007, 15:03
was ist WHEEL_RIGHT? was wurde hier definiert?

ansonsten kannst du mal die widerstände nachmessen... ich denke zum schutz der backleds ist noch ein zusätzlicher widerstand auf der strecke, oder?

recycle
05.10.2007, 15:53
@GrimReaper


Hat jemand eine Idee, woran das liegen könnte?


Ich kann kein C, daher kann ich es nicht aus deinem Code auslesen.
Könnte es sein, dass bei den AD-Eingängen an denen die Phototransistoren angeschlossen sind die internen Pullups aktiviert sind?

GrimReaper
05.10.2007, 18:12
@dalmator:

"WHEEL_RIGHT" definiert ursprünglich den Sensor für die rechte Odometrie, sprich über welchen Pin am Prozessor die rechte Odometrie ausgelesen werden soll. Das ist im einzelnen in der asuro.h definiert. Da ich die rechte Odometrie runtergelötet habe und stattdessen einen dritten Liniensensor angeschlossen habe, habe ich einfach "WHEEL_RIGHT" angegeben, um anzugeben über welcher Pin mein eigener Schaltkreis abgefragt werden soll. Habe das mit Hilfe das Datenblatts des Prozessors nachgeprüft, die Definition stimmt soweit (ich bekomme grundsätzlich ja auch Werte, nur halt keine verwertbaren).

Der ursprüngliche Schaltkreis für die Odometrie/rechte BackLED auf der rechten Seite ist komplett lahmgelegt und die rechte BackLED funktioniert nicht mehr. Habe einen komplett neuen Schaltkreis gemacht und diesen an die selben Spannungsquellen wie die Liniensensoren angeschlossen und halt an den A/D Pin der rechten Odometrie, um Werte auslesen zu können.


@recycle

In dem Code steht nur, wie die Liniensensoren ausgelesen werden sollen, also die genauen Angaben, was der A/D-Wandler machen soll. Die ersten beiden Blöcke geben an, wie die beiden original Liniensensoren ausgelesen werden sollen (der Teil wurde nicht verändert und liefert auch korrekte Werte). Der dritte Block ist einfach eine Kopie der ersten, nur mit der Änderung, dass der Pin, über den ursprünglich die rechte Odometrie ausgelesen wurde, auch noch ausgelsen werden soll. Da ich für diesen dritten Liniensensor bzw. seinen Schaltkreis die selben Bauteile wie für die original Liniensensoren verwendet habe und auchndie selben Parameter zum Auslesen angegeben habe wundert es mich halt, dass keine verwertbaren Werte rauskommen (0-8 statt 0-1023).


Interne Pullups sagt mir grade nichts, werde das nochmal nachlesen, aber eigentlich werden alle 3 Pins gleich ausgelsen, insofern komisch, dass nur einer schlechte Werte liefert.

roboterheld
05.10.2007, 18:45
welche fototransistoren werden hier verwendet?

mfg

damaltor
05.10.2007, 20:54
die internen pullups (eingebaute widerstände an den ports) werden folgendermaßen deaktiviert:

als beispiel nehme ich den pin 1 am port b, du musst das programm an den fettgedruckten stellen entsprechend anpassen.

DDRB |= 0x02; // hier den entsprechenden hex wert eintragen. pin0 = 0x01, pin 1 = 0x02, pin 2 = 0x04, pin 3 = 0x08, pin 4 = 0x10, pin 5 = 0x20, pin 6 = 0x40, pin 7 = 0x80.
PORTB &= ~(0x02);

dann das auslesen nochmal ausprobieren.