PRobot
04.01.2008, 11:48
Hallo!
Ich bin gerade dabei, 2 Sensoren am Roboter zu testen:
Einmal einen Fototransistor und einen analogen Entfernungssensor von Sharp.
Wie werden diese Sensoren korrekt angeschlossen?
Ich habe es jetzt mal so versucht, wie es auf der Zeichnung im Artikel RN-Control bei Anschlussbeispiele angezeigt ist, aber da bekomme ich folgende ergebnisse:
(mit dem C-Beispiel-Code, welcher auf der Robotikhardware-CD enthalten ist)
Fototransistor:
4,99 V
Entfernungssensor:
3,39 V
Wenn ich die Entfernung bzw. Helligkeit ändere, ändern sich die Werte nicht.
Also nochmal die Frage, wie werden die Sensoren korrekt angeschlossen?
Daten der Sensoren:
Fototransistor: SFH300
Entfernungssensor Sharp: GP2Y0A02YK
Hier noch der C-Code zum Messen:
/*### Analogwerte ###*/
void Analogwerte(void)
{
//Alle internen Pullups an, ausgenommen Port A3 und Batteriespannung/Taster (A6 und A7). Da A3 aber nun auch nicht auf GND liegt, ergibt sich ein "Rauschen", der Wert variiert mit jeder Messung mehr oder weniger stark.
setportaon(0);
setportaon(1);
setportaon(2);
setportaoff(3);
setportaon(4);
setportaon(5);
for(uint8_t i=0; i<8; i++)
{
analog = adcwert(i); //Messung Analogport [i]
utoa(i, wort, 10); sendUSART("Analog"); sendUSART(wort); sendUSART(" = "); //Ausgabe: "Analog[i] = "
utoa(analog, wort, 10); sendUSART(wort); sendUSART(" = "); //Ausgabe: "[Analogwert] = "
dtostrf(analog*referenzspannung, 11, 8, wort); sendUSART(wort); sendUSART(" Volt \r\n"); //AUsgabe: "[Reale Voltzahl] Volt"
}
sendUSART("\r\n\r\n\r\n");
waitms(300);
}
und die Funktion adcwert aus rncontrol.h:
/*### ADC-Ansteuerung ###*/
uint16_t adcwert(uint8_t kanal)
{
uint16_t wert = 0; //Variable für Ergebnis deklarieren
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); //ADEN aktiviert überhaupt erst den internen ADC-Wandler, ADPS2 bis ADPS0 stellen den verwendeten Prescaler ein, denn die Wandlerfrequenz muss immer zwischen 50 und 200 kHz liegen! Der Prescaler muss bei 16MHz also zwischen 80 und 320 eingestellt werden, als einzige Möglichkeit bleibt hier 128 (=alle auf 1).
ADMUX = kanal;
//ADMUX = (1<<REFS1)|(1<<REFS0); //Einstellen der Referenzspannung auf "extern", also REFS1 und REFS0 auf "0" - daher auskommentierte Zeile
ADCSRA |= (1<<ADSC); //nach Aktivierung des ADC wird ein "Dummy-Readout" empfohlen, man liest also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen"
while(ADCSRA & (1<<ADSC)) {} //auf Abschluss der Konvertierung warten
wert = ADCW; //ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten Wandlung nicht übernommen.
/* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
wert = 0;
for(uint8_t i=0; i<4; i++)
{
ADCSRA |= (1<<ADSC); //eine Wandlung "single conversion" starten
while(ADCSRA & (1<<ADSC)) {} //auf Abschluss der Konvertierung warten
wert = wert + ADCW; //Wandlungsergebnisse aufaddieren
}
ADCSRA &= ~(1<<ADEN); //ADC deaktivieren
wert = wert/4; //Durchschnittswert bilden
return wert;
}
Ich bin gerade dabei, 2 Sensoren am Roboter zu testen:
Einmal einen Fototransistor und einen analogen Entfernungssensor von Sharp.
Wie werden diese Sensoren korrekt angeschlossen?
Ich habe es jetzt mal so versucht, wie es auf der Zeichnung im Artikel RN-Control bei Anschlussbeispiele angezeigt ist, aber da bekomme ich folgende ergebnisse:
(mit dem C-Beispiel-Code, welcher auf der Robotikhardware-CD enthalten ist)
Fototransistor:
4,99 V
Entfernungssensor:
3,39 V
Wenn ich die Entfernung bzw. Helligkeit ändere, ändern sich die Werte nicht.
Also nochmal die Frage, wie werden die Sensoren korrekt angeschlossen?
Daten der Sensoren:
Fototransistor: SFH300
Entfernungssensor Sharp: GP2Y0A02YK
Hier noch der C-Code zum Messen:
/*### Analogwerte ###*/
void Analogwerte(void)
{
//Alle internen Pullups an, ausgenommen Port A3 und Batteriespannung/Taster (A6 und A7). Da A3 aber nun auch nicht auf GND liegt, ergibt sich ein "Rauschen", der Wert variiert mit jeder Messung mehr oder weniger stark.
setportaon(0);
setportaon(1);
setportaon(2);
setportaoff(3);
setportaon(4);
setportaon(5);
for(uint8_t i=0; i<8; i++)
{
analog = adcwert(i); //Messung Analogport [i]
utoa(i, wort, 10); sendUSART("Analog"); sendUSART(wort); sendUSART(" = "); //Ausgabe: "Analog[i] = "
utoa(analog, wort, 10); sendUSART(wort); sendUSART(" = "); //Ausgabe: "[Analogwert] = "
dtostrf(analog*referenzspannung, 11, 8, wort); sendUSART(wort); sendUSART(" Volt \r\n"); //AUsgabe: "[Reale Voltzahl] Volt"
}
sendUSART("\r\n\r\n\r\n");
waitms(300);
}
und die Funktion adcwert aus rncontrol.h:
/*### ADC-Ansteuerung ###*/
uint16_t adcwert(uint8_t kanal)
{
uint16_t wert = 0; //Variable für Ergebnis deklarieren
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); //ADEN aktiviert überhaupt erst den internen ADC-Wandler, ADPS2 bis ADPS0 stellen den verwendeten Prescaler ein, denn die Wandlerfrequenz muss immer zwischen 50 und 200 kHz liegen! Der Prescaler muss bei 16MHz also zwischen 80 und 320 eingestellt werden, als einzige Möglichkeit bleibt hier 128 (=alle auf 1).
ADMUX = kanal;
//ADMUX = (1<<REFS1)|(1<<REFS0); //Einstellen der Referenzspannung auf "extern", also REFS1 und REFS0 auf "0" - daher auskommentierte Zeile
ADCSRA |= (1<<ADSC); //nach Aktivierung des ADC wird ein "Dummy-Readout" empfohlen, man liest also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen"
while(ADCSRA & (1<<ADSC)) {} //auf Abschluss der Konvertierung warten
wert = ADCW; //ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten Wandlung nicht übernommen.
/* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
wert = 0;
for(uint8_t i=0; i<4; i++)
{
ADCSRA |= (1<<ADSC); //eine Wandlung "single conversion" starten
while(ADCSRA & (1<<ADSC)) {} //auf Abschluss der Konvertierung warten
wert = wert + ADCW; //Wandlungsergebnisse aufaddieren
}
ADCSRA &= ~(1<<ADEN); //ADC deaktivieren
wert = wert/4; //Durchschnittswert bilden
return wert;
}