Jaja, ein Blick ins Datenblatt erleichtert die Bauteilfindung...
Ich habe einen ATmega32u4 verbaut, weil ich mehr als die üblichen 8
ADC-Eingänge brauche. Und dem hab ich eine externe Reverenz von 1.23V
verpasst.
Allerdings liefert der ADC immer nur 1023 als Wert. Auf der Fehlersuche
bin ich im Datenblatt auf die kleine Zeile Vref min 2.56V gestoßen.
Ich gebe zu, das hatte ich übersehen, bin durch die anderen ATmega
verwöhnt, die meist bis 1.1V Vref runterkönnen?
Bevor ich die Referenz runterpopel, um es mit interner Referenz zu
versuchen:
Frage 1: Liegt es an der zu niedrigen Vref, dass der ADC nur 1023
liefert?
Frage 2: Keine Chance, den auch mit Vref 1.23V sinnvoll zu betreiben?
> bin durch die anderen ATmega verwöhnt
Also bei ATmega16 und 32 zum Beispiel ist als Minimum 2.0 V angegeben.
Keine Ahnung, was darunter passiert. Wie sieht das Programm aus?
> "... bin ich im Datenblatt auf die kleine Zeile Vref min 2.56V gestoßen."
Und wo genau im Datenblatt bist Du darauf gestossen?
Ich kann das in der aktuellen Version
(Atmel-7766J-USB-ATmega16U4/32U4-Datasheet_04/2016
) nicht finden.
Ich habe hier nur einen ATmega16A (mit min. 2.0 V angegeben), also ist
Folgendes nur von begrenzter Aussagekraft, trotzdem: Uref = 1.143 V und
U = 0.454 V liefert 408, also gar nicht so schlecht.
Es drängt sich folglich die Frage nach dem Programm auf.
Karl schrieb:> Und dem hab ich eine externe Reverenz von 1.23V> verpasst.>> Allerdings liefert der ADC immer nur 1023 als Wert
was hat das EINE
dem hab ich eine externe Reverenz von 1.23V
mit dem ANDEREN
liefert der ADC immer nur 1023
zu tun?
wenn du mehr als 1,23V reingibts muss der ja 1023 zeigen!
Karl schrieb:> Auf der Fehlersuche> bin ich im Datenblatt auf die kleine Zeile Vref min 2.56V gestoßen
das wäre seine interne Ref die du ja nicht wählst weil:
Karl schrieb:> dem hab ich eine externe Reverenz von 1.23V> verpasst
Joachim B. schrieb:> was hat das EINE> dem hab ich eine externe Reverenz von 1.23V> mit dem ANDEREN> liefert der ADC immer nur 1023
Die ADCs liefern immer 1023, auch wenn ich die Eingänge auf GND lege
oder irgendwas dazwischen.
Ben B. schrieb:> Programmierfehler wahrscheinlich, der µC kann mit jeder externen> Referenz zwischen AGND und AVCC arbeiten.
Das wäre mir lieb. ;-) Mit dem ATmega32u4 hab ich noch nicht gearbeitet.
Hier die Initialisierung:
1
ADMUX := (%00 shl REFS) or $1F; // Referenz Vref=extern und Kanal GND, erste verwerfen
2
ADCSRB := (1 shl ADHSM); // ADC High Speed
3
ADCSRA := (1 shl ADEN) or (1 shl ADSC) or (1 shl ADIE) or (%001 shl ADPS); // ADC Enable und erste Wandlung starten
4
// Prescaler auf 1:2
5
// 1.6µs für alle weiteren Wandlungen
Und hier die Abfrage im Interrupt:
1
vval := ADC; // ADC Wert holen, erst ADCL, dann ADCH!!!
2
chan := (ADMUX and $1F) or (ADCSRB and $20); // ADC Kanal holen MUX5..0
3
if chan = %100000 then begin // Kanal ADC8 = u1
4
vu1 := vval;
5
inc(tu1);
6
chan := %100011;
7
... 9 Kanäle durchgehen
8
end else if chan = %000101 then begin // Kanal ADC5 = u9
9
vu9 := vval;
10
inc(tu9);
11
chan := %100000;
12
13
end else begin
14
chan := %100000;
15
end;
16
17
ADMUX := (%00 shl REFS) or (chan and $1F); // Referenz Vref=extern und Kanal MUX4..0
18
ADCSRB := (1 shl ADHSM) or (chan and $20); // ADC High Speed und Kanal MUX5
19
ADCSRA := ADCSRA or (1 shl ADSC); // neue Wandlung starten
Wie ich anhand der tux-Zähler sehen kann, werden die Kanäle auch
zyklisch durchgegangen, aber sie liefern in vux immer 1023, also den
ADC-Endwert.
Verringerung der Geschwindigkeit (größerer Prescaler) bringt keine
Änderung. Änderung der Referenz hab ich noch nicht probiert, weil die
dann gegen die externe Referenz (LM4041-1.225V) arbeiten würde.
Ist möglicherweise ein Fehler in der Initialisierung, aber ich sehs grad
nicht. Die Registerdefinitionen (müsste dieser Unit entsprechen
https://github.com/graemeg/freepascal/blob/master/rtl/embedded/avr/atmega32u4.pp)
hab ich schon überprüft, aber nichts Auffälliges gefunden.
M.M.n. ist das Datenblatt eindeutig. Minimale VREF ist 2,56V. Alles
dadrunter ist nicht spezifiziert.
wendelsberg schrieb:> Also in dem mir vorliegenden DB hat er sogar eine interne> Bandgapreferenz von typ. 1.1V+-0.1V.
Kann ich nicht sehen. In der Einleitung zum ADC steht:
>Internal reference voltages of nominally 2.56V or AVCC are> provided On-chip.
ATmega16U4/ATmega32U4 features an internal bandgap reference. This reference is used for Brown-out Detection, and it can be used as an input to the Analog Comparator or the ADC.
Aber die ist nur fuer den Analogkomparator oder als Uref fuer den ADC -
dann aber nur auf 2,56V verstaerkt - zugaenglich. Wieder was gelernt.
1
VREF can be selected as either AV CC, internal 2.56V
2
reference, or external AREF pin.
3
...
4
The internal 2.56V reference is generated from the internal bandgap reference (VBG) through an internal amplifier.
Karl schrieb:> Auf der Fehlersuche> bin ich im Datenblatt auf die kleine Zeile Vref min 2.56V gestoßen.
wo?
ich lese nur
If no external voltage is applied to the AREF pin, the user may switch
between AVCC and 2.56V as reference selection.
hast du das gelesen?
The first ADC conversion result after switching reference voltage source
may be inaccurate, and the user is advised to discard this result.
Karl schrieb:> Hier die Initialisierung:> ADMUX := (%00 shl REFS) or $1F; // Referenz Vref=extern und Kanal> GND, erste verwerfen
was denn das für ein Dialekt?
und wie stehts damit?
The voltage reference may be externally decoupled at the AREF pin by
a capacitor for better noise performance.
wartest du bis die Wandlung fertig ist?
bist du im free running Mode mit IRQ wenn fertig?
oder pollst du das bit?
ich kenne diesen Dialekt nicht, aber ich hatte nie derlei
Schwierigkeiten von denen du berichtest.
Matthias S. schrieb:> M.M.n. ist das Datenblatt eindeutig. Minimale VREF ist 2,56V. Alles> dadrunter ist nicht spezifiziert.
Sehe ich auch so. Wobei mich das Diagramm 30-41 etwas stutzig macht.
Laut diesem erreicht die interne Referenz diese Spannung überhaupt nie.
Rolf M. schrieb:> Matthias S. schrieb:>> M.M.n. ist das Datenblatt eindeutig. Minimale VREF ist 2,56V. Alles>> dadrunter ist nicht spezifiziert.>> Sehe ich auch so. Wobei mich das Diagramm 30-41 etwas stutzig macht
das sagt aber nur was über VCC zu interne Referenz, wenn die REF aber
extern ist, wo ist die minimal Anforderung von der hier berichtet wird
>= 2,56V
http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7766-8-bit-AVR-ATmega16U4-32U4_Datasheet.pdfMWS schrieb:> Wie wär's mit:>> Table 29-7.ADC Characteristics>> ...>> VREF Reference Voltage Min 2.56 Max AVCC - 0.5
danke, das hatte ich vorher nicht gefunden und nun musste man alles
lesen weil die Suche nach Table nicht klappt irgendwie.
hmm merkwürdig, könnte ein Indiez sein oder nur ein Documentfehler, weil
die ja öfter mal Fehler haben.
Ich habe leider keinen ATmega32u4 aktuell hier....
Georg M. schrieb:> Für 1024 braucht man schon 11 Bit.
Welcher Vollpfosten hat dir denn für deinen Beitrag ein Minus gegeben?
@Vollpfosten
Der AVR hat einen ADC mit einer Auflösung von 10Bit => 2^10=1024 (Es
können Werte von 0 .. 1023 dargestellt werden.)
Rolf M. schrieb:> Sehe ich auch so. Wobei mich das Diagramm 30-41 etwas stutzig macht.> Laut diesem erreicht die interne Referenz diese Spannung überhaupt nie.
Der wirkliche Wert der Referenzspannung liegt ja bestimmt auch im
Bereich von 2.30V bis 2.7V, also ist es möglich dass irgend ein
Atmega32U4 einen ADC besitzt der diesen Wert annimmt. ;-)
Ich denke mal das ist nur ein Anhaltspunkt damit man weiß wie sich die
Referenzspannung in dem Eingangs-Spannungsbereich verhält.
Joachim B. schrieb:> The first ADC conversion result after switching reference voltage source> may be inaccurate, and the user is advised to discard this result.
Ja, wird weggeworfen, indem ich den Kanal auf GND setze, GND wird aber
nicht ausgewertet sondern eine neue Wandlung mit einem gültigen Kanal
gestartet.
Joachim B. schrieb:> The voltage reference may be externally decoupled at the AREF pin by> a capacitor for better noise performance.
10nF ist dran und die 1.23V der Referenz stehen auch sauber an.
Joachim B. schrieb:> wartest du bis die Wandlung fertig ist?
Ich mache das momentan über den ADC-Interrupt. Läuft auch sauber durch.
> bist du im free running Mode mit IRQ wenn fertig?> oder pollst du das bit?
Single conversion. Wird jedesmal neu gestartet, wenn der Interrupt
fertig ist. Dabei wird jedesmal ein anderer Kanal gewählt, aber immer
mit der gleichen Referenz.
Joachim B. schrieb:> aber ich hatte nie derlei> Schwierigkeiten von denen du berichtest.
Ich auch nicht, bisher mit ATmega8, ATmega16/32, ATmega328 und einigen
ATtinys. Daher stehe ich auch gerade bißchen auf dem Schlauch, was die
Ursache angeht.
Wenn der ADC wenigsten aufgrund der möglicherweise zu nedrigen Vref
falsche Werte bringen würde. Aber so gar keine anderen Werte ausser
1023, selbst bei Eingängen auf GND...
Karl schrieb:> ch habe einen ATmega32u4 verbaut, weil ich mehr als die üblichen 8> ADC-Eingänge brauche.
Nimm doch einfach einen Multiplexer(z.B. 4051)?
Edit: Entschuldige, da habe ich mich wohl verlesen unten stehendes
bezieht sich auf atXmega32a4u.
[Für die Xmega Serie gibt es in der Regel 2 Datenblätter. Eines in dem
die Peripherie näher beschrieben wird und eines in dem Toleranzen,
Spannungen, Timings, etc. aufgeführt sind.
In letzterem ist angehängte Tabelle, laut derer 1V bis AVcc-0.6V möglich
sind.
(http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-8387-8-and16-bit-AVR-Microcontroller-XMEGA-A4U_Datasheet.pdf)
Verwendest du eine Codebibliothek z.B. ASF (Atmel Software Framework)?
Dort werden pauschal erst mal alle power-save-Register der Peripherie
gesetzt. Die einzelnen Module müssen dann erst wieder explizit aktiviert
werden.]
Ahhhh, es lag anscheinend an der Samplerate. Ich hatte den Prescaler
zwar versuchsweise runtergesetzt, aber nicht sooo weit.
Mit Prescaler 128 an 16MHz bekomme ich auf den ersten Blick sinnvolle
Werte. Allerdings ist 128 mit dann 125kHz Samplerate schon arg niedrig,
der nächste Prescaler 64 mit dann 250kHz schon wieder oberhalb der
"erlaubten" 200kHz.
Und warum zum Henker gibt es einen High Speed Mode und wie hoch ist dann
die erlaubte Samplerate?
"ADHSM: ADC High Speed Mode
Writing this bit to one enables the ADC High Speed mode. This mode
enables higher conversion rate at the expense of higher power
consumption."
Karl schrieb:> Ahhhh, es lag anscheinend an der Samplerate.
hatte ich doch den richtigen Riecher
Joachim B. schrieb:> wartest du bis die Wandlung fertig ist?> bist du im free running Mode mit IRQ wenn fertig?> oder pollst du das bit?
kannst du nun mit dieser 1,23V Ref was sinnvolles feststellen?
Karl schrieb:> Ich werd wohl doch mal die Referenz auslöten müssen, wollte ich> eigentlich vermeiden...
Bei mir sind die einzelnen Schaltungsteile bei Prototypen so gut es geht
über 0 Ohm SMD-Widerstände verbunden und dadurch auch leicht wieder
trennbar.
Ich würde einfach mal spaßeshalber einen weiteren 1k oder 10k Ohm Poti
nehmen und an die Referenz 0 bis 5V bringen um sehen zu können ab
welcher Versorgungsspannung (an AVcc) der ADC wieder richtige Werte
liefert. Wäre bestimmt interessant.
Karl schrieb:> Ahhhh, es lag anscheinend an der Samplerate. Ich hatte den Prescaler> zwar versuchsweise runtergesetzt, aber nicht sooo weit.
War doch klar, daß du etwas falsch gemacht haben mußt.
> Mit Prescaler 128 an 16MHz bekomme ich auf den ersten Blick sinnvolle> Werte. Allerdings ist 128 mit dann 125kHz Samplerate schon arg niedrig
Dir ist schon klar, daß die 125kHz nicht die Samplerate sind, sondern
der ADC-Takt. Die Samperate ist nochmal deutlich geringer. Im besten
Fall ein 13-tel davon. Also knapp 10kHz.
> Und warum zum Henker gibt es einen High Speed Mode und wie hoch ist> dann die erlaubte Samplerate?
Im Datenblatt steht nichts dazu. Aber es gibt ja auch Appnotes und
sonstige Dokumentation beim Hersteller.
Aber ganz generell sind die Vorgaben für den ADC-Takt und die
Referenzspannung keine absoluten Grenzen. Erst wenn du massiv weit
drüber (bzw. drunter) gehst, kriegst du einen Totalausfall der Funktion.
Vorher wird es erstmal nur ungenauer.
Die Begrenzung von VREF nach unten dient in erster Linie zur Absicherung
der garantierten ADC-Fehler, insbesondere INL. Denn diese Fehler werden
in LSB angegeben. Je kleiner VREF ist, desto kleiner sind (absolut
gesehen) die erlaubten Fehler. Bzw. weil die realen Fehler der Hardware
(z.B. Offset des Komparators im ADC) absolute Werte sind, werden die
relativen Fehler bei sinkender VREF größer.
Joachim B. schrieb:> kannst du nun mit dieser 1,23V Ref was sinnvolles feststellen?
Ja, ich kann sinnvoll feststellen, dass es nicht sinnvoll ist.
Axel S. schrieb:> kriegst du einen Totalausfall der Funktion.> Vorher wird es erstmal nur ungenauer.
Es wird nicht ungenauer, es wird schlichtweg Schrott.
Die 9 verwendeten Kanäle bringen bei gleicher Eingangsspannung um 50lsb
abweichende Werte. Bei unterschiedlicher Eingangsspannung sieht man, wie
Änderung der Spannung an einem Kanal die Messung der folgenden Kanäle
ebenfalls beeinflusst, vor allem wenn erstere Spannung höher ist als die
folgende. Egal bei welcher Prescaler-Einstellung.
Also die Referenz ausgelötet und über ein Poti versorgt. 10nF sind immer
noch drin. Vref steht auf extern.
Ab 1.32V sind die Messwerte sinnvoll. Abweichung der Kanäle maximal 2lsb
bei gleicher Eingangsspannung, keine sichtbare Beeinflussung folgender
Messungen bei unterschiedlicher Eingangsspannung. Das gilt für Prescaler
64.
Mit Prescaler 32 liegt die Schwelle bei 1.33V, mit Prescaler 16 (1MHz
ADC Takt) bei 1.35V. Mit Prescaler 8 (2MHz) sind allerdings 1.85V für
stabile Messwerte nötig, und die Abweichung der Kanäle untereinander
steigt auf 5lsb. Unter 1.3V zeigt der ADC das anfangs beschriebene
Verhalten, dass alle Werte auf 1023 springen.
Allerdings: Schalte ich das bescheuerte ADHSM-Bit welches anscheinend
keine sinnvolle Funktion hat aus, sinkt die Schwelle bei Prescaler 32
auf 1.20V.
Das ist mir trotzdem zu nah an meinen 1.23V Referenz. Werde also mal
schauen ob es eine Referenz um die 1.5 bis 1.8V gibt, andernfalls eine
LM4040 mit 2.5V einsetzen und meine Vorteiler nochmal umdimensionieren.
Disclaimer: Das gilt natürlich nur das von mir getestete Exemplar. Bei
anderen ATmega32u4 mögen die Werte anders sein.
Wurde dies schon erwähnt und/oder beachtet?
Auszug aus Application Note:
Atmel AVR126: ADC of megaAVR in Single Ended Mode
• It is recommended to discard the first conversion result (like
whenever there is a change in ADC configuration like voltage reference /
ADC channel change)
• Please note when switching to a differential channel (with gain
settings), the first conversion result may have a poor accuracydue to
the required settling time for the automatic offset cancellation
circuitry. Soit is better to discard the first sample result
Karl schrieb:> Joachim B. schrieb:>> The first ADC conversion result after switching reference voltage source>> may be inaccurate, and the user is advised to discard this result.>> Ja, wird weggeworfen, indem ich den Kanal auf GND setze, GND wird aber> nicht ausgewertet sondern eine neue Wandlung mit einem gültigen Kanal> gestartet.
Du musst die erste Messung nach dem Kanalwechsel verwerfen, nicht
davor.
Joachim B. schrieb:> Rolf M. schrieb:>> Matthias S. schrieb:>>> M.M.n. ist das Datenblatt eindeutig. Minimale VREF ist 2,56V. Alles>>> dadrunter ist nicht spezifiziert.>>>> Sehe ich auch so. Wobei mich das Diagramm 30-41 etwas stutzig macht>> das sagt aber nur was über VCC zu interne Referenz, wenn die REF aber> extern ist, wo ist die minimal Anforderung von der hier berichtet wird>>= 2,56V
Da steht nichts davon, dass diese Anforderung nur für externe Referenz
gilt. Es steht da, dass die ADC-Referenzspannung immer >= 2,56V sein
muss. Aus dem Diagramm ergibt sich aber, dass das bei Nutzung der
internen Referenz niemals gegeben ist. Gut, vielleicht war es eigentlich
so gemeint, wie du schreibst.
Karl schrieb:> Joachim B. schrieb:>> kannst du nun mit dieser 1,23V Ref was sinnvolles feststellen?>> Ja, ich kann sinnvoll feststellen, dass es nicht sinnvoll ist.>> Axel S. schrieb:>> kriegst du einen Totalausfall der Funktion.>> Vorher wird es erstmal nur ungenauer.>> Es wird nicht ungenauer, es wird schlichtweg Schrott.
Ich halte dich nicht für qualifiziert, das zu beurteilen.
> Die 9 verwendeten Kanäle bringen bei gleicher Eingangsspannung um 50lsb> abweichende Werte. Bei unterschiedlicher Eingangsspannung sieht man, wie> Änderung der Spannung an einem Kanal die Messung der folgenden Kanäle> ebenfalls beeinflusst, vor allem wenn erstere Spannung höher ist als die> folgende.
Das ist auch so dokumentiert, daß die erste Messung nach einem
Kanalwechsel ungenau ist. Wurde auch hier im Forum schon des öfteren
diskutiert. Und wenn man die Funktionsweise des ADC respektive des
Multiplexers kennt, ist das auch nicht ungewöhnlich.
Rolf M. schrieb:> Du musst die erste Messung nach dem Kanalwechsel verwerfen, nicht> davor.
Ich muss die erste Messung nach einem Wechsel der Vref verwerfen. Ich
wechsle die Vref zwischendurch nicht.
Axel S. schrieb:> Ich halte dich nicht für qualifiziert, das zu beurteilen.
Das ist mir sowas von Rille. ;-)
Axel S. schrieb:> Das ist auch so dokumentiert, daß die erste Messung nach einem> Kanalwechsel ungenau ist.
Nein. Es ist dokumentiert, dass die erste Wandlung nach einem Wechsel
der Vref ungenau ist.
Rolf M. schrieb:> Es steht da, dass die ADC-Referenzspannung immer >= 2,56V sein> muss.
Ja, witzigerweise kann nach Table 29-7 Vint zwischen 2.4 und 2.8V
liegen.
Karl schrieb:> Axel S. schrieb:>> Das ist auch so dokumentiert, daß die erste Messung nach einem>> Kanalwechsel ungenau ist.>> Nein. Es ist dokumentiert, dass die erste Wandlung nach einem Wechsel> der Vref ungenau ist.der Wok schrieb:> Wurde dies schon erwähnt und/oder beachtet?>> Auszug aus Application Note:> Atmel AVR126: ADC of megaAVR in Single Ended Mode>> • It is recommended to discard the first conversion result (like> whenever there is a change in ADC configuration like voltage reference /> ADC channel change)> • Please note when switching to a differential channel (with gain> settings), the first conversion result may have a poor accuracydue to> the required settling time for the automatic offset cancellation> circuitry. Soit is better to discard the first sample result
Punkt 2 aus der Application Note!
Hi
>Nein. Es ist dokumentiert, dass die erste Wandlung nach einem Wechsel>der Vref ungenau ist.
Aber auch bei einem Wechsel differentieller Kanäle:
When switching to a differential gain channel, the first conversion
result may have a poor accuracy
due to the required settling time for the automatic offset cancellation
circuitry. The user
should preferably disregard the first conversion result.
MfG Spess
der Wok schrieb:> Punkt 2 aus der Application Note!
Wurde im Forum schon mehrfach diskutiert:
Gilt für Kanalwechsel nur, wenn während einer Messung umgeschaltet
wurde, weil dann noch der Wert des alten Kanals gemessen wird, aber die
Adresse des neuen Kanals im MUX steht.
Wichtig ist allerdings, dass die Eingänge niedrige Impedanz sehen, damit
der SH-Kondensator ausreichend schnell umgeladen werden kann. Dabei
hilft eine entsprechend große Kapazität (1-10nF) am Eingang. Ist
vorhanden.
spess53 schrieb:> Aber auch bei einem Wechsel differentieller Kanäle:
Ich habe keine differentiellen Kanäle. Würde ich gern nutzen, sind aber
viel zu langsam.