PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : CNY70 mit Operationsverstärker sinnig?



juhecomp
15.03.2009, 19:23
Hallo,

ich bin gerade dabei meinen ersten Roboter zu bauen.
Dieser soll einmal einer Linie folgen und vielleicht auch Hindernisseverfolgen können (gleichzeitig!?).

Damit die Linie gut verfolgt werden kann und damit er auch scharfe Kurven registriert wollte ich ca 6-8 CNY70 dafür verwenden. Da ich noch anfänger bin und die AD wandlung per Software nicht verstehe habe ich überlegt einen Operationsverstärker zu verwenden wie es auf der seite http://www.kreatives-chaos.com/artikel/liniensensor-mit-cny70
vorgestelt wird.

Meine Frage ist nun ob das bei mehreren CNY70 überhaupt geht bzw. ob es sinn ergibt und wie er sich dann verhalten würde wenn er in einen Tunnel fährt.

Besserwessi
15.03.2009, 19:54
Man könnte auch mehrere der cny70 mit je einem OP (als Komperator) anschließen. Besonders sinnvoll ist das allerdings schon bei einem Kanal nicht. Für einen Kanal haben die µC fast immern einen Komperator intern, den könnte man einfacher nehmen. Die Digitale auswertung kann man bei den Atmel AVRs auch direkt an den IO Pins ohne extra OP machen. Man muß dann nur den Widerstand passend wählen.
Sonst ist die Auswertung per AD Wandler in der Regel besser, man kriegt mehr Information und könnte mit weniger Sensoren auskommen. Es ist vermultich einfacher sich in die Programmierung des AD Wandlers einzulesen als 8 Operationsverstärker zu verkabeln.

Für den Anfang würde ich 4 Sensoren für die Line und die Auswertung per AD-wandler vorschlagen. 2 für das direkte folgen der linie und 2 fürs erkennen von scharfen kurven.

juhecomp
15.03.2009, 21:13
Ok dann werde ich mir nun wohl noch ein weiteres mal das AD wandler kapitel im GCC Tutorial durchlesen müssen :D

juhecomp
16.03.2009, 13:55
Also ich habe mir jetzt ca. 10 mal ein ADC Tutorial durchgelesen und glaube ich habe es verstanden (wenn ja dann ist das ja gar nicht soo schwer 8-[ )


uint16_t ReadChannel(uint8_t mux)
{
uint8_t i;
uint16_t result;

ADMUX = mux; // Kanal waehlen
ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen

ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
// setzen auf 8 (1) und ADC aktivieren (1)

/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
result = ADCW; // ADCW muss einmal gelesen werden,
// sonst wird Ergebnis der nächsten Wandlung
// nicht übernommen.

/* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
result = 0;
for( i=0; i<4; i++ )
{
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
result += ADCW; // Wandlungsergebnisse aufaddieren
}
ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)

result /= 4; // Summe durch vier teilen = arithm. Mittelwert

return result;
}

...

/* Beispielaufrufe: */

void foo(void)
{
uint16_t adcval;

adcval = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
...
adcval = ReadChannel(2); /* MUX-Bits auf 0b0010 -> Channel 2 */
...
}


So in etwa könnte das dann auch in mein Programm eingebaut werden um die werte der Liniensensoren auszulesen .
Statt ReadChannel würde ich die Funktion z.B. Linie nennen
und die Werte von Linie(0) Linie(1) Linie(2) Linie(3) messen und verarbeiten (Reglung...)