ADC beim Atmega32M1

Hemi

Aktives Mitglied
Premium Benutzer
30. Nov. 2008
1.103
19
38
Korntal-Münchingen, Germany
Sprachen
  1. ANSI C
  2. C++
  3. PHP
  4. Java
Hallo zusammen,

ich habe da eine kleine Frage zum ADC beim Atmega32M1 Controller. Im Datenblatt wird ADC nach dieser Gleichung berechnet:

1635686417971.png
Warum 1023? Der ADC hat doch 10-bit Auflösung, das entspricht 2^10 also 1024, man zählt zwar von 0 bis 1023 aber es sind 1024 "Schritte".

Oder habe ich einen Denkfehler?

Danke Euch!
 
Hallo Heinrich,

ADC = VIN * 1024 /VREF

sollte richtig sein. Eventuell ein Fehler im Datenblatt?

Dirk, :ciao:
 
Danke Euch beiden!

Mein Datenblatt habe ich hier hochgeladen. Ist vermutlich wirklich nur ein Fehler.
Der Chip ist schon ganz brauchbar, wenn er nur 1-2 Timer mehr hätte... Aber ADC liegt gute 0,2V daneben, das ist nicht so geil, wenn man an der Lambdasonde messen will...
 
Man erreicht bei der Messung nie den Wert VREF.

Im neueren Datenblatt wurde es korrigiert.

Datasheet History
8209F – 10/2016 (Content editing updates)

For single ended conversion, the result is
ADC = VIN * 1024 / VREF
where VIN is the voltage on the selected input pin, and VREF the selected voltage reference (see also
descriptions of ADMUX.REFSn and ADMUX.MUX). 0x000 represents analog ground, and 0x3FF
represents the selected reference voltage minus one LSB
 
Aber ADC liegt gute 0,2V daneben, das ist nicht so geil, wenn man an der Lambdasonde messen will...
Was verwendest Du als Referenz? Irgendwas präzises externes, die interne 2,56V oder die Bandgap (1,1V) mit Trick17?
AVCC (intern)?
Den Kerko am Aref?
In welchem Bereich liegt die Lambda-Spannung bzw wie greifst Du die ab?

Der Chip ist schon ganz brauchbar, wenn er nur 1-2 Timer mehr hätte...
Ok, wenn sich nötige Zeitbasen wirklich nicht aus den vorhandenen Timern realisieren lassen (weil die als Counter arbeiten, oder weil die Frequenz variiert etc), läßt sich vielleicht irgend'ne andere Hardware miß... äh.. zweckentfremden.
Der Watchdog kann zB auch als IRQ genutzt werden, da wären zehn diskrete Werte zwischen 16ms und 8s erreichbar.
Der ADC kann im Dauerlauf auch seinen "üsch_hab_fertüsch"-IRQ zünden - der kann via Prescaler auch einige Werte annehmen; da Du den verwendest, bist Du natürlich auf entsprechende Werte beschränkt.
Den USART-Trick mit 'nem externen IRQ scheint man hier mit dem LIN/UART nicht anwenden zu können.
Der PSC kann auch regelmäßige IRQs generieren.
Mittels Clockout den eigenen SPI zu takten macht wegen den acht Bits keinen Sinn, aber man könnte den SPI als Master kontinuierlich (der Transfer ist nicht gepuffert, ist also von der IRQ-response abhängig) irgendwas ausgeben lassen, und den Transfer Complete IRQ nutzen.
 
Ich habe den Schaltplan mal angehängt.
Die Schaltung ist nicht von mir. Das Projekt ist ein Open-Source Projekt von einem Forumskollegen, er hat diese Schaltung entworfen. Ich bin da nur "reingerutscht", so nach dem Motto "Du kannst doch CAN oder...". Jö, ich bin dann dabei die Firmware dafür zu schreiben.
Was verwendest Du als Referenz? Irgendwas präzises externes, die interne 2,56V oder die Bandgap (1,1V) mit Trick17?
AVCC (intern)?
Den Kerko am Aref?
Wenn Du Dir die Schaltung anschaust, unten links, neben dem FET ist ein LM4041DIM3 verbaut. Es ist ein 1% 1,225V Shunt. An dem messe ich die Spannung, sie sollte bei genau 1,225V liegen. Ich messe da 1,201V. Im Code wird dann die Abweichung ermittelt (1,225 - 1,201) und sie abgespeichert. Ab da wird diese Abweichung immer berücksichtigt.
Ich sehe gerade, dass es 0,02V sind, nicht 0,2V.....
In welchem Bereich liegt die Lambda-Spannung bzw wie greifst Du die ab?
Auf der Schaltung ist ein Bosch CJ125, es ist der eigentliche Lambda-Controller. Er stellt zwei Spannungen bereit, UA und UR, daraus wird dann der Lambda-Wert berechnet.
 

Anhänge

  • lambda_bl49_REV0.pdf
    37,1 KB · Aufrufe: 5
Die Spannungen des Bosch scheinen bis 5V gehen zu können und werden nicht weiter angepaßt. Außerdem scheint auch die 12V-Versorgung gemessen zu werden, via Spannungsteiler und auf 5V begrenzt.
Ich vermute, daß der ADC gegen AVCC mißt, also gegen 5V, und somit die Präzision des verwendeten Schaltreglers der Versorgung hat.
Statt des Kalibrations-Shunts hättet ihr 'ne geeignete Spannungsreferenz an Aref hängen sollen, aber das war ja nicht Deine Entscheidung.
 
Ja, die UBat-Versorgung wird auch gemessen. Der Grund dafür ist, dass die Lambdasonde eine vorgegebene Aufheizrampe hat, die man einhalten sollte, denn sonst die Sonde ziemlich schnell verreckt. Nach dem der Motor läuft, wird die Sonde erstmal mit 1,5V fünf Sekunden lang vorgewärmt, damit sich kein Kondenswasser bildet. Dann fängt der eigentliche Aufheizvorgang an, er startet mit 8,5V und geht bis 13V, in 0,4V Schritten pro Sekunde. Ist die Heizspannung bei 13V angekommen, hat die Sonde die Betriebstemperatur erreicht. Ab hier ist kein "stupides" PWM mehr gemacht, sondern eine PID-Regelung, denn man muss die Sonde ja nicht heizen, wenn das Gaspedal am Boden klebt... So schreibt es Bosch für ihre LSU 4.9 vor.

Genau, ADC ist als "AVCC with external capacitor connected on the AREF pin" konfiguriert, also AVCC = VCC und auch der Pin VCCSS des CJ125 ist mit VCC verbunden. Ich hätte beim ADC viel lieber einen TI REF5050 oder sowas gesehen, dann haben beide Chips dieselbe Referenz... Den ganzen Verhau bei der Spannungsversorgung hätte man sich auch sparen können, wenn man einen passenden Regler genommen hätte, einen TLE42754D, hat alles drin, was man braucht.

Aber die gesagt, es ist/war nicht mein Entwurf, ich bin da nur reingerutscht.
 
Frage: wenn ich am AREF eine Referenz hängen habe, dann kann ich den Pin AVCC eigentlich auch unbeschaltet lassen oder? Habe dazu weder im User Manual noch in den AppNotes was gefunden, da steht nur, wenn man AVCC nutzt, muss man AREF über einen 100nF Kerko auf GND legen. Aber nicht, was man machen soll, wenn man AREF nutzt. Weil, wenn AREF verschaltet ist, darf man nichts anderes nutzen...
 
Frage: wenn ich am AREF eine Referenz hängen habe, dann kann ich den Pin AVCC eigentlich auch unbeschaltet lassen oder?
Nein!
AVCC bildet mit AGND die Spannungsversorgung der analogen Innereien des Controllers, also üblicherweise des ADC, des DAC, des AC und sicher auch der ISRC.
Außerdem werden die Push/Pull-Treiber von I/O-Pins, die auch durch analoge Innereien verwendet werden können meist (hier hab ich im DB nichts konkretes dazu gefunden - würde aber davon ausgehen) über diese Pins versorgt.
Wie jedes andere Spannungsversorgungspärchen sind die beiden mit einem Kerko zu puffern.
Wenn die Genauigkeit es erfordert, sind Einkopplungen von digitalen Teilen der Schaltung zu vermeiden, zB indem Du die fern davon routest.
AGND wird dann oft nur über einen Punkt an GND angebunden, AVCC über einen RC- oder besser LC-Tiefpaß an VCC.

Wenn der Analogteil nicht versorgt wird, kann es zu parasitärer Versorgung über die Ableitdioden der I/O-Pins kommen (-> @dino03 ).

Aref hingegen ist bei vielen anderen AVRs nur eine von mehreren Optionen für dieses Bein - hier scheint es nur als Ein-/Ausgang für AREF bzw ISRC verwendbar zu sein.
Also als erstes Kapitel 23 - ISRC ansehen, Figure 23-1.

ISRCEN kann die 100µA-Stromquelle auf den Pin schalten (wenn dann ein Widerstand gegen Gnd drangeklemmt wird, kann der ADC den Spannungsabfall messen)
AREFEN kann hingegen die gewählte interne(!) Referenz auf den Pin legen.

Grundsätzlich ist der Pin dann als interner Eingang auf den ADC (Input Multiplexer) verdrahtet:
Kapitel 22 - ADC, Figure 22-1.

Da siehst Du oben links nochmal das ganze dargestellt. Da geht auch ein Pfeil mit ISRC ab, der sich ganz unten am Eingangsmultiplexer (ADC0..ADC10, Bandgap usw) wiederfindet.

Zurück nach oben.
REFS1 legt fest, ob die Ausgangsspannung des Referenzmultiplexers als Referenz auf den ADC geschaltet werden soll, oder nicht.
REFS0 schaltet den Referenzmultiplexer auf AVCC (intern) oder die interne 2,56V-Referenz (und wirft diese überhaupt erst an).
(***)

Der ADC kann also so entweder gegen Vcc (intern) oder gegen 2,56V (intern) messen.
Alternativ kann man den Referenzmux auch abgekoppelt lassen, und 'ne externe Referenz auf den Pin legen.

Wenn eine interne Referenz gewählt ist, kannst Du die auch auf den AREF-Pin schalten, um sie dort über einen Kerko zu puffern (und sie ggf auch für andere Sachen zu kanibalisieren).
Weil, wenn AREF verschaltet ist, darf man nichts anderes nutzen...
Nunja, dürfen darfst Du alles, ist ja Dein Chip. Die Frage ist, was das für Konsequenzen hat, und ob Du die willst...
Du verwendest den Pin entweder als Referenzeingang, oder als Referenzausgang (Pufferkerko), oder als Ausgang für die ISRC.
Tatsächlich gabs bei irgend'nem Pollin-Board mal, daß extern VCC auf den Pin geroutet waren - vollkommener Quatsch, da dadurch keine andere interne Referenz mehr wählbar war (ohne die zu grillen, 'ne präzise externe Referenz erst recht nicht mehr anschließbar war), und VCC auch intern hätte aufgeschaltet werden können.
Wenn Du dann die interne Referenz aufschaltet, versucht diese, die Spannungsversorgung auf 2,56 (oder was auch immer) zu zwingen - was sie nicht lange mitmacht...
Diese Beschaltung war dann noch oft in allen möglichen Forenbeiträgen als falscher Quasi-Standard zu finden...

Bei Deinem Chip bin ich mir jetzt nicht sicher, ob man die ISRC als Referenz nutzen kann (je nachdem, was dann am AREF noch so hängt) - und ob sich dafür 'ne sinnige Anwendung findet...


(***) Kann es sein, daß es 'ne Diskrepanz zwischen Figure22-1 und Table 22-4 gibt?
Laut dem Bild steuert REFS0 den MUX und REFS1schaltet den auf den ADC oder eben nicht.
Laut Tabelle gilt
REFS[1:0]=01 -> AVCC(intern)
REFS[1:0]=11 -> 2,56V-Referenz(intern)
also genau andersrum...
 
Nein!
AVCC bildet mit AGND die Spannungsversorgung der analogen Innereien des Controllers, also üblicherweise des ADC, des DAC, des AC und sicher auch der ISRC.
Außerdem werden die Push/Pull-Treiber von I/O-Pins, die auch durch analoge Innereien verwendet werden können meist (hier hab ich im DB nichts konkretes dazu gefunden - würde aber davon ausgehen) über diese Pins versorgt.
Wie jedes andere Spannungsversorgungspärchen sind die beiden mit einem Kerko zu puffern.
Wenn die Genauigkeit es erfordert, sind Einkopplungen von digitalen Teilen der Schaltung zu vermeiden, zB indem Du die fern davon routest.
AGND wird dann oft nur über einen Punkt an GND angebunden, AVCC über einen RC- oder besser LC-Tiefpaß an VCC.

Wenn der Analogteil nicht versorgt wird, kann es zu parasitärer Versorgung über die Ableitdioden der I/O-Pins kommen (-> @dino03 ).
Das ist natürlich absoluter Blödsinn, was ich da geschrieben habe, natürlich muss AVCC verschaltet werden...
Mehr weiter unten...
Aref hingegen ist bei vielen anderen AVRs nur eine von mehreren Optionen für dieses Bein - hier scheint es nur als Ein-/Ausgang für AREF bzw ISRC verwendbar zu sein.
Also als erstes Kapitel 23 - ISRC ansehen, Figure 23-1.

ISRCEN kann die 100µA-Stromquelle auf den Pin schalten (wenn dann ein Widerstand gegen Gnd drangeklemmt wird, kann der ADC den Spannungsabfall messen)
AREFEN kann hingegen die gewählte interne(!) Referenz auf den Pin legen.

Grundsätzlich ist der Pin dann als interner Eingang auf den ADC (Input Multiplexer) verdrahtet:
Kapitel 22 - ADC, Figure 22-1.

Da siehst Du oben links nochmal das ganze dargestellt. Da geht auch ein Pfeil mit ISRC ab, der sich ganz unten am Eingangsmultiplexer (ADC0..ADC10, Bandgap usw) wiederfindet.

Zurück nach oben.
REFS1 legt fest, ob die Ausgangsspannung des Referenzmultiplexers als Referenz auf den ADC geschaltet werden soll, oder nicht.
REFS0 schaltet den Referenzmultiplexer auf AVCC (intern) oder die interne 2,56V-Referenz (und wirft diese überhaupt erst an).
(***)

Der ADC kann also so entweder gegen Vcc (intern) oder gegen 2,56V (intern) messen.
Alternativ kann man den Referenzmux auch abgekoppelt lassen, und 'ne externe Referenz auf den Pin legen.

Wenn eine interne Referenz gewählt ist, kannst Du die auch auf den AREF-Pin schalten, um sie dort über einen Kerko zu puffern (und sie ggf auch für andere Sachen zu kanibalisieren).
Nach einer Diskussion haben wir uns dazu entschieden die Schaltung zu ändern und es richtig zu machen.
Das heißt im Einzelnen:
Spannungsversorgung: ein Infineon TLE4270-2D wird genommen, ein automotiv LDO 5V, 650mA, 2%. Der Chip bringt alles mit, was man braucht, davor kommt nur eine 36V bidirektionale TVS Diode, ein 10µF Elko und 100nF Kerko gegen die 2A und 2B Impulse, das reicht aus.
Referenz: ein Infineon TLS115B0EJ Voltage Tracker wird verwendet. Ist ebenfalls ein automotiv Ding, 150mA und 0,1% Genauigkeit.

AVCC und AREF vom Atmega hängen am TLS115, ich glaube, das passt so, zumindest laut User Manual passt es:
The ADC has a separate analog supply voltage pin, AVCC. AVCC must not differ more than ±0.3V from VCC.
Liest sich für so, als man für VCC und AVCC unterschiedliche Spannungsquellen nehmen kann, solange AVCC sich nicht um mehr als ±0.3V von VCC unterscheidet.

Der CJ125 hat für den analogen Teil eine extra Spannungsversorgung, VCCS und VCCSS, diese ist ebenfalls an den TLS115 angeschlossen.
Nunja, dürfen darfst Du alles, ist ja Dein Chip. Die Frage ist, was das für Konsequenzen hat, und ob Du die willst...
Naja, eher nicht. Das Zitat begoz sich auf:
If the user has a fixed voltage source connected to the AREF pin, the user may not use the other reference voltage options in the application, as they will be shorted to the external voltage.
bedeutet: kaputt... ist ja nicht das, was ich will :D
AREF wir dann so konfiguriert:
1637263560392.png
Du verwendest den Pin entweder als Referenzeingang, oder als Referenzausgang (Pufferkerko), oder als Ausgang für die ISRC.
Tatsächlich gabs bei irgend'nem Pollin-Board mal, daß extern VCC auf den Pin geroutet waren - vollkommener Quatsch, da dadurch keine andere interne Referenz mehr wählbar war (ohne die zu grillen, 'ne präzise externe Referenz erst recht nicht mehr anschließbar war), und VCC auch intern hätte aufgeschaltet werden können.
Wenn Du dann die interne Referenz aufschaltet, versucht diese, die Spannungsversorgung auf 2,56 (oder was auch immer) zu zwingen - was sie nicht lange mitmacht...
Diese Beschaltung war dann noch oft in allen möglichen Forenbeiträgen als falscher Quasi-Standard zu finden...
Genau das steht weiter oben.
Bei Deinem Chip bin ich mir jetzt nicht sicher, ob man die ISRC als Referenz nutzen kann (je nachdem, was dann am AREF noch so hängt) - und ob sich dafür 'ne sinnige Anwendung findet...
Ich auch nicht, deswegen lieber extern, wo ich weiß, was er macht.
Das Beispiel für die ISRC-Nutzung ist auch eher theoretisch... aber LIN ist nicht meine Welt.
(***) Kann es sein, daß es 'ne Diskrepanz zwischen Figure22-1 und Table 22-4 gibt?
Laut dem Bild steuert REFS0 den MUX und REFS1schaltet den auf den ADC oder eben nicht.
Laut Tabelle gilt
REFS[1:0]=01 -> AVCC(intern)
REFS[1:0]=11 -> 2,56V-Referenz(intern)
also genau andersrum...
Wie kommst Du drauf? Ich würde sagen, es passt:

1637263505125.png
Zumindest so deute ich es.

Ich habe die Schaltung angehängt (schematic.pdf). Wobei es sicherlich nicht die letzte Version ist... es wird aktuell diskutiert, ob es nicht sinnvoll wäre noch einen zweiten CJ125 drauf zu machen, weil V-Motoren ja zwei Abgasstränge haben, sonst braucht man zwei Platinen, was nicht so cool ist... für mich kann es nur von Vorteil sein :)
 

Anhänge

  • 1637261665258.png
    1637261665258.png
    9,6 KB · Aufrufe: 1
  • 1637262117687.png
    1637262117687.png
    15,8 KB · Aufrufe: 1
  • 1637263546115.png
    1637263546115.png
    12,5 KB · Aufrufe: 1
  • schematic.pdf
    35,5 KB · Aufrufe: 2
Hmm...
Der voltage tracker ist doch eher sowas wie ein robuster LDO (@dino03 ?), und seine Präzision erbt er von der Referenz an seinem Adjust-Eingang. Wenn ihr da 'nen einfachen Linearregler drauflegt, bringt das nichts.
Und wenn Du gegen die Spannung von AVCC messen willst, solltest Du die interne Verbindung nutzen. Ggf mit externem Kerko an Aref.

Wenn Du willst, kann ich auch gern mal die konkrete Arbeitsweise des ADC erklären.
 
Du hast absolut Recht, das ist mir schon beim Shreiben irgendwie aufgefallen...
Kurzum: die IC ist an der Stelle eigentlich Schwachsinn... ich brauche eher sowas wie ein TI REF5050 oder so, also eine echte Referenz, kein Tracker.
 
So in der Art. Allerdings benötigen die ne höhere Eingangsspannung als sie selbst ausgeben können.
Dein Controller hat hingegen ne interne Referenz mit 2,56V, wenn ich mich recht erinnere.

Ich würde an eurer Stelle ggf einen Prototypen entwerfen, der erstmal auf die interne 2,56V-Referenz ausgelegt ist, mit Kerko an Aref - aber im Layout 'ne externe Referenz mitrouten ohne die zu bestücken. Dann kann man das später bei Bedarf noch ergänzen...

Zur Datenblatt - Diskrepanz:
Laut Tabelle wählt REFS1 zwischen AVCC und der 2,56V-Referenz - laut Schema steuert REFS0 den Referenz Selection MUX.
Laut Schema befindet sich hinter dem MUX ein Analogschalter, der durch REFS1 gesteuert wird, laut Tabelle ist für die beiden internen - "Referenzen" aber REFS0 zu setzen...
 
Zuletzt bearbeitet:
Aber wenn ich auf interne 2,56V Referenz umschalte, dann kann ich doch keine 5V messen oder doch?

Ich werde den TLS115 jetzt gegen einen REF5050A-Q1 (0,1%) ersetzen und dann ist Ruhe im Karton.
 
richtig, aber Du kannst die zu messende Spannung vorher runterteilen (was natürlich tendenziell zu Genauigkeitsverlusten führt).

Deine Referenz will jetzt allerdings eine um mindestens 0,2V höhere Spannungsversorgung haben, als seine mit 5,0V angegebene Ausgangsspannung. Also irgendwas zwischen 5,2 und 18V...
 
Die Referenz wird vom UBat (über einen S1J als Verpolschutz und eine unidirektionale 18V TVS-Diode) versorgt.
 
Kannst Du irgendwie sicherstellen, daß der keine Spannung liefert, wenn die Schaltung mit dem Controller spannungslos ist?
 
Die Referenz wird aus derselben Quelle mit Spannung versorgt, habe die aktuelle Schaltung angehängt.

Der Startablauf ist wie folgt:
1. Zündschloss ist auf AUS
2. Zündschloss wird auf "Zündung an" gedreht
3a. Motorsteuergerät fährt hoch
3b. Motorsteuergerät zieht das "main relay" an und bekommt die Spannung für die Treiber vom "main relay" (Treiber für Einspritzventile, H-Brücken für Drosselklappensteller, Sensoren, ...)
3c. diese Schaltung (WBO genannt) wird auch bestromt und fährt hoch
4. Anlasser an, Motor wird gestartet
5. Motor läuft (Übergang von "Starten" zum "Laufen" erfolgt, Leerlauf wird erkannt (>500rpm))
6. Motorsteuergerät aktiviert WBO, die Sonde wird kalibiert
7. die Sonde wird leicht angewärmt (1,5v für 10 Sekunden, damit das Kondenswassert weg ist)
8. die Sonde wird auf Betriebstemperatur gebracht (Rampe von 8,5v bis 13v mit einer Steigung von 0,4v / Sekunde)
9. die Sonde ist heiß und liefert die Werte (es wird alle 10ms eine CAN-Botschaft an das Motorsteuergerät gesendet)

Das ist jetzt stark vereinfacht, da passiert viel mehr, aber man sieht im Groben, wie das abläuft.
 

Anhänge

  • schematic.pdf
    35 KB · Aufrufe: 3

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)