Ich habe ein Problem mit meiner AD-Wandlung. Ih vermute den Fehler am
Board, und wenn ich da die Beschreibung schaue (D072 von Display 3000),
dann sehe ich folgenden Text zum ARef:
>Lötbrücke ARef bridge (J8):>Einige (acht) Eingänge des Controllers können analoge Werte auswerten. >Wer sehr
exakteWerte braucht, der findet am ATMega128 einen spezielle >Port für eine
Referenzspannung:
>ARef. Oft wird eine externer Zuführung von ARef nicht benötigt (dann ist >ARef
mit der Versorgungsspannung von 5V verbunden) – dafür haben wir >Vorbereitungen
getroffen:
>Der Eingang ARef (Auf der Platine mit AR gekennzeichnet, zwischen F0 und >E3)
kann über die Lötbrücke (J8) mit Vcc (5V) verbunden werden. Diese >Lötbrücke ist
standardmäßig NICHT geschlossen. Sollten Sie die ARef für >das Anlegen einer
eigenen Referenzspannung benötigen, so muss die Brücke >offen >sein. Solange Sie
diese Brücke geschlossen ist, steht zudem außen >an den Pads des ARef-Anschluss
die normale 5-Volt-Versorgungsspannung >für andere >Nutzungen zur Verfügung – wenn
die Leitung durchtrennt ist, >legen Sie an diesem Pad bitte Ihre eigene
Refernzspannung an.
>Hinweis für Experten: Bitte nutzen Sie nicht die interne Referenzspannung >des
Controllers, solange Sie ARef mit Vcc verbunden haben.
>Aref hat einen eigenen 100nF Kondensator, der bereits von uns eingelötet >wurde.
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
16
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
17
ADCSRA|=(1<<ADSC);// eine ADC-Wandlung
18
while(ADCSRA&(1<<ADSC)){
19
;// auf Abschluss der Konvertierung warten
20
}
21
result=ADCW;// ADCW muss einmal gelesen werden,
22
// sonst wird Ergebnis der nächsten Wandlung
23
// nicht übernommen.
24
25
/* Messung, 100 mal und mitteln
26
damit der Wert beim Auslesen stabiler
27
ist, weniger flackert.
28
*/
29
result=0;
30
for(i=0;i<100;i++)
31
{
32
ADCSRA|=(1<<ADSC);
33
while(ADCSRA&(1<<ADSC)){
34
;
35
}
36
result+=ADCW;
37
}
38
39
result/=100;
40
41
returnresult;
42
}
Ih schliesse nun meine Spannungsleitung an PF0 an. Und speichere das
Wandlungsergebnis mit readADC(0).
Jedoch ist das Ergebnis immer 0. Ich habe auch schon 5V an den AR Port
angelegt. Gebracht hat es nix.
Weiss jemand Rat ?
Hmmm also auf dem Atmega644 hat dieser Code funktioniert.
Selbst wenn ich ADCW in ADC umbenenne, und die Schleife nur einmal
laufen lasse, kommt 0 bei rum.
Laut Handbuch sind die Beiden Pins ARef und GND nicht verbunden, und ich
könnte eine Lötbrücke schliessen. Damit wäre ARef fest 5V, und ich
könnte keine andere Spannung wählen.
Deshalb habe ich an diesen Pins, von extern VCC und GND angeschlossen.
5V eben.
Trotzdem kommt nichts heraus. Oder liegt der Fehler wo ganz anders?
Hab grade die Register nicht im Kopf. Hast du es schon mal mit der
internen Referenzspannung probiert? Esterne AREF rentiert sich nur mit
guten Spannungsreferenzen.
Was erwartest du dir mit der Mittelung über 100 Messwerte, ist dein
Messsignal so mit Rauschen übersäht? Normalerweise sollten 4 - 16 Werte
für eine Mittelung ausreichen, wenn das Signal nicht zu unruhig ist und
man keine Mittelung über mehrere Perioden usw. benötigt. (Kommt aber
natürlich immer auf den speziellen Anwendungsfall an.)
Daniel F. schrieb:> Laut Handbuch sind die Beiden Pins ARef und GND nicht verbunden, und ich> könnte eine Lötbrücke schliessen.
Entgegen dem Rat im Handbuch möchtest du das nicht tun.
ARef ist mit einem Kondensator gegen Masse geschaltet (laut Handbuch)
und genau das willst du haben.
Entgegen dem Rat im Handbuch wählst du AVcc als Referenzspannung lieber
per Software aus als per Hardware.
> Deshalb habe ich an diesen Pins, von extern VCC und GND angeschlossen.> 5V eben.
Das war schlecht.
Die 100 waren keine Absicht, mehr ein verzweifelter Versuch.
Interne Referenzspannung habe ich auch schon versucht.
ADMUX |= (1<<REFS1) | (1<<REFS0);
Aber auch hier das gleiche Ergebnis. Ich denke ich muss wirklich diese
Lötbrücken schliessen. Jedenfalls verstehe ich den Text so. (über meinem
Code).
Karl heinz Buchegger, ich will so wenig wie nötig an dem Board rumlöten.
Aber so wie es aussieht, muss ich es tun. Wenn ich nun die Lötbrücke
schliesse, und die Lötbrücke für AGND, dann ist bei
ADMUX |= (0<<REFS1) | (0<<REFS0);
meine ARef == 5V ... oder ?
Kann ich sie dann überhaupt noch auf 2,56 V bringen? Ich denke nicht.
> ADMUX |= (0<<REFS1) | (0<<REFS0);
Was willst du damit erreichen?
Null oder irgendwas kommt immer irgendwas raus und nicht Null. Wenn du
die Bits löschen willst, musst du verunden.
1/ Lass das Board so wie im Auslieferungszustand.
Also die ARef Lötbrücke offen und nicht mit externen 5V verbunden.
2/ Wie gibt du welche Messspannung auf Pin PF0? Schaltplan so?
Vcc o----+
|
10k #
Poti #<---------o PF0
#
|
GND o----+
3/ Wie sieht das vollständige Programm aus? Quellcode?
Aus deiner Beschreibung geht nicht hervor, ob und wo init_adc()
aufgerufen wird. Ohne geht es aber nicht!
Stefan B. schrieb:> 1/ Lass das Board so wie im Auslieferungszustand.> Also die ARef Lötbrücke offen und nicht mit externen 5V verbunden.
Okay
> 2/ Wie gibt du welche Messspannung auf Pin PF0? Schaltplan so?>> Vcc o----+> |> 10k #> Poti #<---------o PF0> #> |> GND o----+
Nein nicht so, sondern:
Vcc o----+ ---------o PF0
GND o----+
Ich beziehe diese Entscheidung auf diesen Satz im Datenblatt:
The single-ended voltage inputs refer to 0V (GND).
> 3/ Wie sieht das vollständige Programm aus? Quellcode?> Aus deiner Beschreibung geht nicht hervor, ob und wo init_adc()> aufgerufen wird. Ohne geht es aber nicht!
init_adc();
Das hatte ich tatsächlich vergessen. Aber was jetzt angezeigt wird ist
nicht besser. jetzt wird permanent 1023 angezeigt. Die ARef stimmt wohl
noch nicht.
Daniel F. schrieb:> Stefan B. schrieb:>> 1/ Lass das Board so wie im Auslieferungszustand.>> Also die ARef Lötbrücke offen und nicht mit externen 5V verbunden.
Genau
>> Vcc o----+>> |>> 10k #>> Poti #<---------o PF0>> #>> |>> GND o----+>> Nein nicht so, sondern:> Vcc o----+ ---------o PF0>
OK.
Kann man machen.
Deine 100 * 1024 werden dann zwar überlaufen, aber das siehst du dann
schon. 0 darf dann nicht mehr rauskommen (oder das wäre extremer Zufall)
> uint16_t readADC(uint8_t mux)> {> uint8_t i;> uint16_t result;>> ADMUX = mux; // Kanal> ADMUX |= (0<<REFS1) | (0<<REFS0); // interne Referenzspannung nutzen
Na ja.
Was erwartest du?
Extern hast du keine Referenzspannung angeschlossen (was ok ist)
und mit dieser Einstellung wählst du aus
AREF, internal VRef turned off
Diese Einstellung sagt also: Benutze die Spannung, die ich an ARef
angelegt habe.
Du hast aber keine angelegt (was gut ist)
Datenblatt lesen!
Um AVcc als Referenzspannung einzustellen musst du
ADMUX |= (0<<REFS1) | (1<<REFS0);
Daniel F. schrieb:> init_adc();>> Das hatte ich tatsächlich vergessen. Aber was jetzt angezeigt wird ist> nicht besser. jetzt wird permanent 1023 angezeigt. Die ARef stimmt wohl> noch nicht.
Der Wert stimmt exakt bei dieser Beschaltung.
> Nein nicht so, sondern:> Vcc o----+---------o PF0
Wenn ARef = Vcc misst du die angelegten Vcc 5V. Wenn ARef intern kleiner
5V (habe im Datenblatt nicht nachgesehen, welche ARef du einstellst),
zeigt 1023 Vollausschlag des 10-Bit ADC d.h. ggf. Übersteuerung
gegenüber eingestelltem ARef.
Experimentiere mal mit dem Potentiometer und lese dir das Tutorial zum
ADC durch.
Karl heinz Buchegger schrieb:> ADMUX |= (0<<REFS1) | (1<<REFS0);
Danke das hab ich auch gerade gesehen.
So nun zeigt der AD Wandler wenigstens was an :)
Aber die Werte springen wie wild auf und ab.
Mein analogsignal liegt bei 400 mV. Da sollten doch 5v als VRef locker
passen. Maximumsignal ist 1V.
Das heisst doch pro AD-Wert passen knapp 5 mV rein, und ich sollte dann
bei ca 200 als AD-Wert landen. Oder liege ich falsch...
Alles sehr merkwürdig grade für mich. Der Code hat auf dem STK 500
wunderbar gepasst. Nur hier stimmt irgendwas nicht.
Daniel F. schrieb:> Karl heinz Buchegger schrieb:>> ADMUX |= (0<<REFS1) | (1<<REFS0);>> Danke das hab ich auch gerade gesehen.>> So nun zeigt der AD Wandler wenigstens was an :)> Aber die Werte springen wie wild auf und ab.
Was heißt "wie wild auf und ab"?
Die letzte Stelle mag unter Umständen um +-1 oder 2 schwanken, aber der
Rest müsste stabil stehen.
Daniel F. schrieb:> Mein analogsignal liegt bei 400 mV. Da sollten doch 5v als VRef locker> passen. Maximumsignal ist 1V.
Was ist das genau für ein "Analogsignal"? Woher kommt das? Das hört sich
fast nach einem Line-In bzw. Audiosignal an.
Schwankt die Anzeige auch, wenn du mit einem Spannungsteiler
(Potischaltung s.o.) und einem konstanten Gleichspannungssignal
experimentierst?
> Alles sehr merkwürdig grade für mich. Der Code hat auf dem STK 500> wunderbar gepasst. Nur hier stimmt irgendwas nicht.
Hast du schon die Hardware beider Boards verglichen, wie das Messignal
beim Eingang in den ADC auf beiden Boards stabilisiert wird? Achte auf
den eventuell vorhandenen Kondensator.
Das Signal kommt von einem digitalen Barometer. Die Anzeige ist
konstant. Die Ausgabe auch....
Das STK 500 ist Geschichte... das war ein anderes Projekt. Das spielt da
nimmer mit rein.
Ich hab den Code mal aufs Minimum reduziert. Und immer noch zeigt der AD
Wandler völlig wirre Werte an. volles Spektrum von 0 bis 1023 und
zurück. jeder Schleifendurchlauf nen völlig andere Wert. Kein Muster
erkennbar.
Da bin ich mit meinem Latein am Ende. Woran kann sowas liegen? Muss ich
doch die Lötbrücke schliessen ? Was ist dann die richte Einstellung für
Aref?
Daniel F. schrieb:> Da bin ich mit meinem Latein am Ende. Woran kann sowas liegen? Muss ich> doch die Lötbrücke schliessen ?
Vergiss endlich mal die Lötbrücke.
Schnapp dir ein Multimeter und miss die Spannung am ARef Pin nach. So
wie du die Software hast, werden da 5V angezeigt werden (bzw. was du als
Versorgungsspannung hast).
> Was ist dann die richte Einstellung für> Aref?
ARef wird für Standardanwendung mit 100nF nach GND verbunden. Die
Auswahl der Referenzspannung macht man im Programm.
Erst bei Sonderfällen legt man selber eine Spannung an ARef an und wählt
im Programm aus, dass diese zu verwenden ist.
Leg doch mal eine konstante Spannung mit einem Poti an, damit wir mal
den unbekannten Ausgang deines Barometers durch etwas Bekanntes ersetzt
haben.
> Das Signal kommt von einem digitalen Barometer.
Was weißt du darüber?
digitales Barometer und ADC ... das passt jetzt erst mal nicht wirklich
zusammen. Was ist das für ein Teil? Datenblatt?
Daniel F. schrieb:> nein vollig willkürlich ... 134 600 800 5 1000 33 und so weiter
Das sieht nach einem offenen Eingang aus. Hast du deine Spannung auch
wirklich am richtigen Pin angeschlossen?
Oder vielleicht vergessen AGnd anzuschliessen?
Rolf
Das Barometer kann digital am PC über RS232 ausgelesen werden, oder
Analog über ne einfache Leitung
Das Barometer misst Drücke 0...2000mbar und zeigt dabei eine Spannung
vom 0...1V
Das Funktioniert auch alles.
Am ARef messe ich 5 V konstant.
Die Werte schwanken auch, wenn der Barometer ausgeschalten ist
Airflow DB2 heisst das Ding.
@ Rolf
>Oder vielleicht vergessen AGnd anzuschliessen?
was meinst du damit ? Ich habe dort einen GND Pin neben dem ARef. Aber
angeschlossen ist da nix.
Ich weiß ich soll es vergessen, aber auch der GND Pin verfügt über eine
offene Lötbrücke.
>Lötbrücke AGND bridge (J9):>Ähnliches wie die Vcc Versorgung für Aref gilt für GND von Aref. Auf Wunsch >können Sie,>durch Schließen der Brücke J9 hier AGND (Das Lötpad direkt über Aref, also >zwischen F1 und E4 auf die Standard-Masse legen.
Daniel F. schrieb:> Ich weiß ich soll es vergessen, aber auch der GND Pin verfügt über eine> offene Lötbrücke.>>Lötbrücke AGND bridge (J9):>>Ähnliches wie die Vcc Versorgung für Aref gilt für GND von Aref. Auf Wunsch>>können Sie,>>durch Schließen der Brücke J9 hier AGND (Das Lötpad direkt über Aref, also>>zwischen F1 und E4 auf die Standard-Masse legen.
Diese Brücke machst du zu.
Auch beim Mega128 gibt es kein seperates AGND sondern nur ein GND (siehe
Datenblatt)
Deinen Sensor hast du hoffentlich nicht nur mit der Signalleitung,
sondern auch mit seiner Masseleitung mit der Masse des Mega128-Boards
verbunden.
Wiso sollte ich denn die Masse des Barometers an das Board anschliessen.
Wenn ich Modus 0 wähle, dann wird ddoch die anliegende Spannung gegen 0V
genommen. Ich weiss beim nicht, wo ich die Masse Ader an das Board
anschliessen soll und was das für einen Sinn ergibt. Das Barometer ist
doch ein eigenständiges Gerät nebendran. (Batteriebetrieb)
Daniel F. schrieb:> Wiso sollte ich denn die Masse des Barometers an das Board anschliessen.
Plonk!
(Das war das Geräusch der Stirn die auf dem Tisch aufschlägt)
> Wenn ich Modus 0 wähle, dann wird ddoch die anliegende Spannung gegen 0V> genommen.
Schon mal gehört, dass elektrische SPannungen Potential-DIFFERENZEN
sind?
Ohne Masseverbindung haben unterschiedliche Teilnehmer unterschiedliche
Vorstellungen davon, wo 0 ist.
> Ich weiss beim nicht, wo ich die Masse Ader an das Board> anschliessen soll und was das für einen Sinn ergibt.
Such dir jemanden der wenigstens die allereinfachsten Grundlagen
Elektronik zumindest vom Hörensagen kennt. Massen werden IMMER
miteinander verbunden!
Mea Culpa.... Mea... und so weiter....
passiert mir nie wieder.
Ich danke allen, die sich Zeit genommen und die Mühe gemacht haben, mir
weiter zu helfen. Mein Projekt wird langsam so groß, dass ich den
Überblick verliere.
Und wieder trifft das Sprichtwort zu:
Kaum macht man es richtig, schon funktioniert es.
Danke.