Справочник Пользователя для Arexx RP6 V2 Build your own robot kit RP6 V2
Модели
RP6 V2
RP6 ROBOT SYSTEM - 4. Programmierung des RP6
4.6.5. ADC auslesen (Batterie-, Motorstrom- und Lichtsensoren)
Am ADC (Analog to Digital Convertor) sind - wie in Abschnitt 2 schon beschrieben
wurde - viele Sensoren des RP6 angeschlossen. Natürlich bietet die RP6Library auch
Am ADC (Analog to Digital Convertor) sind - wie in Abschnitt 2 schon beschrieben
wurde - viele Sensoren des RP6 angeschlossen. Natürlich bietet die RP6Library auch
hier eine Funktion, um diese auszulesen:
uint16_t readADC(uint8_t channel)
Die Funktion gibt einen 10 Bit Wert (0...1023) zurück, also benötigt man 16 Bit Varia-
blen für die Sensorwerte.
Es stehen folgende Kanäle zur Verfügung:
blen für die Sensorwerte.
Es stehen folgende Kanäle zur Verfügung:
ADC_BAT
--> Batteriespannungs Sensor
ADC_MCURRENT_R
--> Motorstromsensor des rechten Motors
ADC_MCURRENT_L
--> Motorstromsensor des linken Motors
ADC_LS_L
--> Linker Lichtsensor
ADC_LS_R
--> Rechter Lichtsensor
ADC_ADC0
--> Freier ADC Kanal für eigene Sensoren
ADC_ADC1
--> Freier ADC Kanal für eigene Sensoren
Hinweis: Die Anschlüsse für die zwei freien ADC Kanäle sind nicht
bestückt. Hier kann man eigene Stecker im 2.54mm Rastermaß an-
bestückt. Hier kann man eigene Stecker im 2.54mm Rastermaß an-
löten und evtl. noch zwei kleine 100nF Kondensatoren und einen
großen 470µF Elko hinzufügen falls man Sensoren anschließen
großen 470µF Elko hinzufügen falls man Sensoren anschließen
möchte die hohe Spitzenströme benötigen wie z.B. IR Abstandssen-
soren von Sharp ... Sie sollten dazu allerdings schon ein wenig
soren von Sharp ... Sie sollten dazu allerdings schon ein wenig
Löterfahrung haben! Sonst lieber ein Erweiterungsmodul verwenden!
Beispiele:
uint16_t ubat = readADC(ADC_BAT);
uint16_t iMotorR = readADC(ADC_MCURRENT_R);
uint16_t iMotorL = readADC(ADC_MCURRENT_L);
uint16_t iMotorL = readADC(ADC_MCURRENT_L);
uint16_t lsL = readADC(ADC_LS_L);
uint16_t lsR = readADC(ADC_LS_R);
uint16_t lsR = readADC(ADC_LS_R);
uint16_t adc0 = readADC(ADC_ADC0);
uint16_t adc1 = readADC(ADC_ADC1);
uint16_t adc1 = readADC(ADC_ADC1);
if(ubat < 580) writeString_P("Warnung! Batterie fast leer!");
Standardmäßig wird die 5V Versorgungsspannung als Referenz verwendet. Man kann
aber die Funktion auch so umschreiben, dass die interne 2.56V Referenz des
ATMEGA32 verwendet wird (dazu im Datenblatt vom MEGA32 nachlesen). Für die nor-
ATMEGA32 verwendet wird (dazu im Datenblatt vom MEGA32 nachlesen). Für die nor-
malen Sensoren des RP6 wird das allerdings normalerweise nicht benötigt.
Es ist sinnvoll mehrere ADC Werte zu messen (z.B. in einem Array speichern) und
Es ist sinnvoll mehrere ADC Werte zu messen (z.B. in einem Array speichern) und
dann zunächst einmal den Mittelwert davon zu bilden oder Minimum/Maximum zu be-
stimmen bevor man die Messwerte des ADCs auswertet. Ab und zu fängt man sich
stimmen bevor man die Messwerte des ADCs auswertet. Ab und zu fängt man sich
nämlich durch Störungen Messfehler ein. Im Falle der Akkuspannung ist es z.B. für
einen automatischen Stromsparmodus absolut notwendig, ein paar Werte zu mitteln
einen automatischen Stromsparmodus absolut notwendig, ein paar Werte zu mitteln
denn die Spannung kann sehr stark schwanken - vor allem wenn die Motoren laufen
und wechselnd belastet werden.
und wechselnd belastet werden.
Wie bei den Bumpern kann man die ADC Messungen automatisieren. Es gibt auch hier
schon eine kleine Funktion, die uns das Leben etwas erleichtern kann.
- 92 -