PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC-port defekt??



2tobi7
20.02.2010, 18:07
hi

ich habe folgendes problem:
ich will mit der adcwert funktion des demoprogrammes den widerstand eines fototransistors(http://www.conrad.de/ce/de/product/183598/FOTOWIDERSTAND-FW-300/0231210) berechnen bzw. die helligkeit.
aber egal an welchem pin ich den sensor anschließe zeigt das bord 1023 als adc wert an :-s .
bitte helft mir...

Kampi
20.02.2010, 18:19
Benutzt du einen SPannungsteiler zum messen oder hast du nur den Widerstand woran du misst?
Du baust einen SPannungsteiler aus einem 10kOhm Widerstand z.B. und dem LDR. Wenn sich nun die Helligkeit ändert ändert sich der Widerstandswert des LDRs und damit auch der Spannungsabfall an diesem.

Wenn der ADC kaputt ist wird der sicher nicht Anzeigen das 5V an dem anliegen, weil der ADC dann wahrscheinlich gar nichts mehr misst :D

2tobi7
20.02.2010, 20:52
danke für die antwort

ich habe jetzt einen spannugsteiler gebaut mit einem 10kohm widerstand aber wenn ích den internen pullup anhabe zeigt er 1023 an und wenn nicht schwankt der wert zwischen 500 und 480 egal was ich mache (ich hab auch einfach den sensor abmontiert und der wert blieb gleich :-s ) das multimeter zeigt aber immer noch halbwegs korrekte werte beim sensor an :/
woran liegt das und wie behebe ich das?????

lg tobi

Besserwessi
21.02.2010, 11:12
Ein paa schwankungen sind bei einem LDR recht schnell eingefangen. Das meiste künstliche Licht ist mit 100 Hz moduliert. Das sieht man nicht, aber der LDR / AD Wandler kreigt das mit und mißt dann zu einem mehr oder weniger zufälligen Zeitpunkt auch mehr oder weniger zufällige Werte. Wenn man das etwas unterdrücken will, müßte man mehr Werte messen und über z.B. 10 / 20 oder 40 ms mitteln - so machen das die meisten Multimeter auch.

Wenn der interne Pullup so viel Einfluß hat, ist da was falsch. Entweder ist die Signalquelle zu hochohmig, oder man hat den Pin noch als Ausgang.

2tobi7
21.02.2010, 12:08
hi
der adcwert schwankt aber egal was ich mache ich hab den sogar direkt mit gnd und vcc verbunden da tut sich nix.
die pins sind alle als eingange definiert und wenn uch die pullups an habe zeigt er ca. 480 +-20 an wenn nicht 1023 +-1
:/

lg tobi

Kampi
21.02.2010, 12:40
Post mal bitte dein Programm + Schaltplan. Möchte da mal drüber schauen kann mir anhand von dem Text recht wenig vorstellen.

2tobi7
22.02.2010, 13:25
also der schalt plan sieht so aus, dass ich den adc port direkt mit gnd verbinde und di programmzeilen:
header:

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;
}
und in der main funktion:


int adc=0;
char l[10];
adc=ReadChannel(0);
snprintf (l, (size_t)10, "%d", adc);
lcd_clrscr();
lcd_puts(l);
waitms(200);

lg tobi

PS:bitte verzeiht mir meine programmierfehler falls vorhanden^^

Richard
22.02.2010, 14:42
Wenn Du den ADC auf GND legst, soll Dein LDR auch nix bringen. :-)
Versuche es einmal wie in der Zeichnung, der C ~ 100n kann die
Schwankungen (etwas) glätten. Vreff sollte dabei auf VCC programmiert
sein und der Interne Pull-up ausgeschaltet.

Gruß Richard

Richard
22.02.2010, 14:46
Sorry, Zeichnung vergessen. :-(

2tobi7
23.02.2010, 17:35
hi
danke für deine mühe aber leider geth immer noch garnix der wert liegt konstant bei ca 500 ,ich hab allerdings auch keinen kondensator gefunden :P(aber der ha je eh keine sooo große wirkung)


lg tobi

Besserwessi
23.02.2010, 17:45
Wenn man den AD auf externe Referenz stellt, muß man auch eine externe ref. Spannung anlegen. Ohne Ref. Spannung, oder bei zu wenig, kann der AD-wandler nicht richtig arbeiten.
Für den LDR als Sensor wäre Vcc als ref, oder als externe Ref. ein 1:1 Spannungsteiler als Ref. OK.

2tobi7
23.02.2010, 18:40
aber die zeile ist doch auskommentiert oder??

2tobi7
23.02.2010, 19:03
\:D/ es tut sich was^^

also zuerst habe ich die auskommentierte zeile zum zum code hinzugefügt
und damit die ref. spannung auf extern gestellt(oder?) dann habe ich dieses rote ding bei UREF weggemacht und wie auf der zeichnung von richard eine spannung von 12V angelegt...

jetzt liegt der wert mit finger auf dem lichtsensor bei ca. 554 und mit lampe davor bei ca. 571 wie kann ich aber jetzt die gesamte bandbreite von 0-1023 nutzen??

lg tobi

Besserwessi
23.02.2010, 19:50
Den ganzen Wertebereich von 0-1023 kann man so einfach nicht ausnutzen. Ein Bereich von etwa 50-1023 geht aber:
Alls ref spannung muß man dann einen externen Spannungsteiler auf etwa AVCC/2 nehmen. Den LDR zwischen AVCC und dem Eingang, einen Widerstand vom Eingang nach AGND. Wie groß der Widerstand sein muß, hängt vom LDR und Meßbereich ab, vermutlich irgendwas zwischen 1 K und 50 K.

Die Zeile mit der Einstellung der Ref. Spannung ist zwar auskommentiert, aber davor wird bei der einstellung des Kanals ganz nebenbei auch schon die externe Ref. Eingestellt. Die Kanalnummer und Ref. Wahl sind im selben Register. Die Stellt man am besten zusammen ein.

Richard
23.02.2010, 23:33
Den R vom Spannungsteiler habe ich nicht Berechnet, dazu müßte ich den R Dunkel vom LDR kennen. Das ist einfach eine "Prinzip" Schaltung wie es gemacht
werden kann.
AREFF darf auch nicht auf 12 V liegen, der Spannungsteiler auch nicht! 5 V
ist Maximum sonst fackelt der ADC Eingang ab! Wenn der Spannungsteiler
an 12 V angeschlossen wird muß sicher gestellt sein das am Fest R nie mehr
als 5 V abfallen können. Das läßt sich berechnen. Dann ist es aber einfacher
den fest R an + und den LDR gegen GND zu schalten.

Gruß Richard