PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC Ports am RNMega2560



bart
30.03.2007, 16:24
Hallo,

versuche vergeblich die ADC Ports mit angeschlossenen Sharp-Sensoren des RNMega2560 moduls auszulesen, so langsam denke ich jedoch es liegt nicht an meiner Programmierung sondern an einer Schaltungssache.

Ich habe die Signalkabel der Sensoren einfach aufs modul gesteckt, muss da nirgendwo noch ein Kondensator oder so rein, für die Referenzwerte.

Im Datenblatt auf der Seite 276 sieht das nämlich so aus...?!?! Ich meine die Anschlüsse AREF und AVC0
Danke im Voraus

bart
30.03.2007, 16:50
Ok sorry sehe gerade das die Bauteile ja bereits auf der SMD Platine bestückt sind

Jon
30.03.2007, 16:51
Poste doch mal dein Programm!

jon

RoboPunk
30.03.2007, 16:53
Hi

du brauchst doch insgesamt die Ports
- Signal
- AREF
- 0V

hast du die alle?
ich nimm für AREF 5V von der Board-Versorgungsspannung, habs aber an meinem Board noch net getestet, aber an der C-Control hats funktioniert. Ich glaub das es bei jedem Board vom Grundsatz her so geht.

Bene

Jon
30.03.2007, 17:03
Als AREF würde ich die internen 2,56Volt nehmen, da beim Sharp Sensor nicht mehr raus kommt.
Das analoge Signal kommt an einen ADC, GND vom Sensor an GND vom Board, VCC vom Sensor an 5,0Volt vom Board. Mehr ist da nicht falsch zu machen.

jon

bart
30.03.2007, 17:07
Danke für die schnellen Antworten, das ist die Auslesefunktion


uint16_t GetAdc(uint8_t pin) {

// min Prescaler = µC Frequ / 200 KHz & max Prescaler = µC Freq. / 50 khz = min 80 & max 320

ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1); // Prescalar = 128
DIDR0=0x00;
DIDR2=0x00;

uint8_t i;
uint16_t result;
uint16_t ergebnis;
ergebnis = 0;
// +------------ Dummy-Check ------------+
i = 1; // i x Dummy-Check
while(i){
ADMUX = pin; // Kanal waehlen
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while(!(ADCSRA & (1<<ADIF))); // auf Abschluss der Konvertierung warten (ADIF-bit)
result = ADCL + (ADCH << 8); // Wandlungsergebnisse erfassen
result = 0; // Zurücksetzen
i--;
}
// +------------- Ermittlung ------------+
i = 10;
while(i){
ADMUX = pin; // Kanal waehlen
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while(!(ADCSRA & (1<<ADIF))); // auf Abschluss der Konvertierung warten (ADIF-bit)
result = ADCL + (ADCH << 8); // Wandlungsergebnisse erfassen
ergebnis = ergebnis + result; // Aufaddieren
i--;
}
// +-------- Umrechnung & Ausgabe -------+
ergebnis = ergebnis / 10 ;
return ergebnis;
}

bart
30.03.2007, 17:11
Beschaltet habe ich es so wie Jon beschrieben hat, funktioniert auf jeden fall, weil wenn ich das signalkabel an mein RNBFRA stecke funktioniert das auslesen mit dieser funktion problemlos.

Liegt dann doch wohl daran das ich irgendwelche Register in der Funktion falsch setze, weil der Atmega2560 ja mehrere hat als der ATmega32 :-(

Jon
30.03.2007, 17:14
*g* Da kann ich dir nicht mehr weiterhelfen, da ich kein C kann.

jon

bart
01.04.2007, 13:27
Jon hattest Recht, es lag tatsächlich an der internen Referenzspannung.



ADMUX = (1<<REFS0) | (1<<REFS1); // Interne 2,56V als Referenz nehmen

Diese Zeile eingefügt und die Werte stimmen ;-)

Danke Gruß