Forum: Mikrocontroller und Digitale Elektronik ATMega328p / ADC nutzen


von Digilog (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Forum,

ich würde gern mit einem uC unterscheiden, ob die Versorgung der 
Schaltung mit 48V, 50V oder 60V erfolgt.

Dazu würde ich gern den Onboard-ADC des bereits vorhandenen ATMega328p 
verwenden.
Da ich bisher noch nie mit einem ADC gearbeitet habe, habe ich mir 
anhand des Datenblattes und eines Online Tutorials die angehängte 
Schaltung erdacht.

Als Referenzspannung würde ich die interne Referenz von 1.1V verwenden.

Am Spannungsteiler entstehen nach meiner Rechnung folgende 
Teilspannungen:

U1: 60 V ==> U2: 3.10 V
U1: 50 V ==> U2: 2.59 V
U1: 48 V ==> U2: 2.48 V

Meine Fragen dazu wären:

1) Ist die Schaltung und die Rechnung so korrekt?

2) Kann ich die anderen Pins des ADC Ports weiterhin als digitale I/Os 
benutzen? Es sollen eine LED und ein Transistor geschaltet werden - 
allerdings nicht, während eine Messung gemacht wird...

3) Laut ADC Tutorial hier auf uC.net sollte zwischen AVCC und VCC noch 
eine Induktivität von 10uH gesetzt werden oder ersatzweise einfach 47R. 
Was wäre denn hier besser?

Die Messung selbst würde ich anhand von Mittelwerten durchführen. Also 
mehrmals messen und das Ergebnis vermitteln.

Würde mich über Ratschläge sehr freuen.

Vielen Dank, Dietmar

von Robert G. Malloc (Gast)


Lesenswert?

Digilog schrieb:
> 1) Ist die Schaltung und die Rechnung so korrekt?

Vermutlich

Digilog schrieb:
> 2) Kann ich die anderen Pins des ADC Ports weiterhin als digitale I/Os
> benutzen? Es sollen eine LED und ein Transistor geschaltet werden -
> allerdings nicht, während eine Messung gemacht wird...

Ja

Digilog schrieb:
> 3) Laut ADC Tutorial hier auf uC.net sollte zwischen AVCC und VCC noch
> eine Induktivität von 10uH gesetzt werden oder ersatzweise einfach 47R.
> Was wäre denn hier besser?

Induktivität.

Digilog schrieb:
> Die Messung selbst würde ich anhand von Mittelwerten durchführen. Also
> mehrmals messen und das Ergebnis vermitteln.

Ja - geht auch anders (-> Artikel).

Kannst Du bitte verraten, warum Du

Digilog schrieb:
> Als Referenzspannung würde ich die interne Referenz von 1.1V verwenden.

zur Messung von

Digilog schrieb:
> Am Spannungsteiler entstehen nach meiner Rechnung folgende
> Teilspannungen:
>
> U1: 60 V ==> U2: 3.10 V
> U1: 50 V ==> U2: 2.59 V
> U1: 48 V ==> U2: 2.48 V

verwenden willst?

von S. Landolt (Gast)


Lesenswert?

Also die Werte für U2 sind mir unklar, ich errechne andere; und wie, 
bitte, sollen größere Spannungen als Uref gemessen werden können?

von S. Landolt (Gast)


Lesenswert?

> noch nie mit einem ADC gearbeitet

Ach so, pardon, das erklärt es.

von Einer K. (Gast)


Lesenswert?

Zu 1:
Spannungsteiler überarbeiten.
Zusätzlich:
Stützkondensator vorsehen, da doch recht hochohmig, oder für hohe 
Abtastraten einen Impedanzwandler vorsehen.

Zu 2:
Grundsätzlich ja.


Zu 3:
Natürlich ein L!
Welch eine Frage...
(besser ein richtiger R als ein falsches L)



-----------------
Tipp:
Datenblatt aufmerksam lesen.

von Gerhard O. (gerhard_)


Lesenswert?

Digilog schrieb:
> Hallo Forum,
>
> ich würde gern mit einem uC unterscheiden, ob die Versorgung der
> Schaltung mit 48V, 50V oder 60V erfolgt.
>
> Dazu würde ich gern den Onboard-ADC des bereits vorhandenen ATMega328p
> verwenden.
> Da ich bisher noch nie mit einem ADC gearbeitet habe, habe ich mir
> anhand des Datenblattes und eines Online Tutorials die angehängte
> Schaltung erdacht.
>
> Als Referenzspannung würde ich die interne Referenz von 1.1V verwenden.
>
> Am Spannungsteiler entstehen nach meiner Rechnung folgende
> Teilspannungen:
>
> U1: 60 V ==> U2: 3.10 V
> U1: 50 V ==> U2: 2.59 V
> U1: 48 V ==> U2: 2.48 V
>
> Meine Fragen dazu wären:
>
> 1) Ist die Schaltung und die Rechnung so korrekt?
Grundsätzlich ja. Es empfiehlt sich VCC und AVCC mit einem kleinen R 
oder Drossel und C an AVCC zu entkoppeln. (Siehe diesbezügliche 
Datenblatt Empfehlungen)

Am ADC0 Eingang parallel zum 20K nach Masse schließe in parallel einen 
10n-0.1uF C an um dem ADC zum Samplen genug Ladestrom zu geben. Bei den 
inneren Umschaltvorgängen werde intern kleine Cs aufgeladen. Das muss 
schnell gehen. Da ist es immer günstig die Vin mit einem C zu puffern.
>
> 2) Kann ich die anderen Pins des ADC Ports weiterhin als digitale I/Os
> benutzen? Es sollen eine LED und ein Transistor geschaltet werden -
> allerdings nicht, während eine Messung gemacht wird...
Dafür sind uC gemacht:-) Sollte kein Problem sein solange der 
Programmablauf und ISR Regime sinnvoll ist.
>
> 3) Laut ADC Tutorial hier auf uC.net sollte zwischen AVCC und VCC noch
> eine Induktivität von 10uH gesetzt werden oder ersatzweise einfach 47R.
> Was wäre denn hier besser?
Siehe oben. Ich nehme meistens einen 10 Ohm her und 0.1-1uF nach Masse 
um Stoerungen von versauter Vcc zu abzuschwächen. Drossel ist oft 
Overkill. Die VDD vom uC sollte mindestens zwei MAl abgeblockt werden. 
2x 0.1uF Keramik und 10uF TAntal oder guter Elko. Jedes VDD/VSS 
Pin-Pärchen sollte so nahe wie möglich den 0.1uF verpaßt kriegen. Der 
10uF kann ein bißchen weiter weg sein.
>
> Die Messung selbst würde ich anhand von Mittelwerten durchführen. Also
> mehrmals messen und das Ergebnis vermitteln.
Ja. Man kann den ADC im Interrupt Betrieb laufen lassen und dann dort 
die Werte mitteln. Mache ich meistens so. Man muss nur bei den 
Einstellungen aufpassen, daß die ADC ISR Frequenz nicht die CPU 
Ressourcen zu sehr beansprucht. Es ist zweckmäßig die ADC Clock so 
einstellen, daß die ADC Umwandlungen etwas Zeit brauchen oder mit einem 
existierenden TIMER Interrupt durch setzen eines ADC CTL Bits den ADC 
zur Umwandlung triggern.
Fuer viele Anwendungen reicht es aus, den ADC alle 1ms zu triggern und 
der CPU spuert das kaum. Natürlich darf kein zeitraubender Code in der 
ADC ISR sein - Also keine Float Berechnungen.

Wenn man mit 16-Bit Int arbeitet kann man bequem bis zu 64 Messungen 
ohne Überlauf zusammenzählen  und dann durch Rechtsschieben sehr schnell 
dividieren solange man sich auf 2er Potenzen beschränkt. Man soll dann 
zum Schluss die Hälfte des Mittelwert Divisors dem Resultat dazu rechnen 
um LSB 0/1 Bit Unsicherheiten zu minimieren.

Z.B. 16 * ADC-Wert addieren, dann durch 16 dividieren und 8 dazu 
addieren.

Manche Leute verwenden auch gerne Running Average oder Tiefpass 
Algorithm Kommt darauf an was man machen will. Fuer viele Anwendungen 
bei der DC Messung reicht aber die einfache Mittelwertbildung.

Aufpassen, das man den so erfaßten ADC Wert atomisch abruft. Das heißt, 
Man soll bei 8-Bittern bevor man den Wert liest global die Interrupts 
abschalten und nach der Erfassung wieder einschalten. Sonst kann es 
passieren, daß im Zeitpunkt des Werte Lesens, ein Interrupt fröhlich 
daher kommt und ein falscher Wert gelesen wird weil im Hintergrund der 
Wert verändert werden könnte.

Das steht alles in vielen Büchern und Webseiten und im Forum.

Übrigens, nimm für die Beispiels Spannungen VREF=VCC her. Bei 1.1V darf 
die maximale ADC Eingangsspannung nicht mehr als VREF betragen. Eine 
höhere VREF ergibt ruhigere Meßwerte. Viele Leute ziehen manchmal eine 
externe Referenz wie 4.096V oder 2.5-3V vor. Es gibt günstige 
Spannungsreferenzen in allen möglichen Spannungen und Qualitäten. 4.096V 
ist insofern bequem weil es ein Vielfaches vom ADC MAX Wert ist. 1BIT 
ist dann genau 4mV wert; 1023 = 4092mV. Ist aber nicht zu wichtig.

>
> Würde mich über Ratschläge sehr freuen.
>
> Vielen Dank, Dietmar



Gruss,
Gerhard

von Digilog (Gast)


Lesenswert?

Hi Robert,

Danke für Deine Antworten.

Tja - also, die Sache mit der Referenzspannung habe ich ehrlichgesagt 
noch nicht ganz verstanden.

Aus dem Tuorial, dem Datenblatt und auch der im Tutorial verlinkten 
Analyse der typischen Toleranzen bei der der internen VREF habe ich 
entnommen, dass es sich grundsätzlich empfiehlt, die interne Referenz zu 
verwenden, die beim ATMega328p 1.1V beträgt.

Was ich noch nicht verstanden habe ist, ob die zu messende Spannung am 
ADC Eingang kleiner sein muss, als VREF... also in diesem Fall kleiner 
als 1.1V.
Im Datenblatt steht: "0 to VCC ADC input voltage range"...

Wenn Du es bemängelst, tippe ich mal, dass die interne VREF nicht die 
richtige Wahl ist, oder?

LG, Dietmar

von Gerhard O. (gerhard_)


Lesenswert?

Digilog schrieb:
> Im Datenblatt steht: "0 to VCC ADC input voltage range"...

Das bezieht sich nur elektrisch. Die ADC Eingangsspannung darf VREF 
nicht überschreiten sonst kriegt man nur 1023 Maximalwert.

Bei VREF=1.1V darf die maximale Spannung rund 1.098V (1023) betragen.

von Digilog (Gast)


Lesenswert?

Gerhard O. schrieb:
> Gruss,
> Gerhard

Vielen Dank für die ausführliche Antwort, Gerhard.
Damit wären auch die restlichen Unklarheiten geklärt.

Ich werde mir das gleich mal so auf dem Steckbrett zurecht bauen.

1000 Dank!!!

von Einer K. (Gast)


Lesenswert?

Digilog schrieb:
> Wenn Du es bemängelst, tippe ich mal, dass die interne VREF nicht die
> richtige Wahl ist, oder?

Welche Alternativen gibt es?

Ohne zusätzliche Bauteile geht halt nur die Interne oder Vcc.
Und dem Vcc ist eher nicht zu trauen.(?!?!?)

Mantra:
Ratiometrische Messungen, dann Ref = Vcc
Absolute Messungen, dann interne oder externe Ref.

von c-hater (Gast)


Lesenswert?

Digilog schrieb:

> Wenn Du es bemängelst, tippe ich mal, dass die interne VREF nicht die
> richtige Wahl ist, oder?


Nö. Es sind nur die Widerstände für den Spannungsteiler nicht sinnvoll 
gewählt. Bei der höchsten zu messenden Spannung sich halt nur 1.1V 
ergeben, wenn man gegen eine 1.1V-Referenz messen möchte.

Besser noch: 10% weniger, wegen der möglichen Abweichung der Referenz.

von Gerhard O. (gerhard_)


Lesenswert?

Hier ist ein Beispiel einer (billigen) Shunt Spannungsreferenz:

https://www.digikey.ca/product-detail/en/texas-instruments/LM385Z-2.5-NOPB/LM385Z-2.5NS-NOPB-ND/148189

TL431C laesst sich auch verwenden.

Gibt es in TO-92 Gehäuse.

von Schorsch X. (bastelschorsch)


Lesenswert?

Ich hab den Eindruck, dass der Spannungsteiler nicht richtig gerechnet 
ist. Dahinter vielleicht noch einen Tiefpass 10k/100n o.ä., damit nicht 
jeder Blödsinn durchkommt. Und ansonsten das Kapital ADC nochmal 
durchlesen, dann wird es schon klarer. Bei einer Ref von 1.1V sollte 
auch die Eingangsspannung dazu passen.

von Gerhard O. (gerhard_)


Angehängte Dateien:

Lesenswert?

Vielleicht hätte es in der Anwendung Sinn den Meßbereich mit 
Nullpunktunterdrückung zu versehen. Mit einem RR-OPV ließe sich das 
schön machen. Wenn z.B. Batteriespannung gemessen wird, dann hat man so 
viel mehr Auflösung.

Man könnte den Meßbereich somit von 40 auf 60V begrenzen.

Mit einem als Differenzverstärker geschalteten Rail to Rail OPV der die 
Eingangsspannung am nicht invertierenden Eingang bekommt und am 
Invertierenden Eingang so wie hier mit 1.00V bekommt, liefert dann eine 
Ausgangsspannung von 0-1V. Ganz bis auf Null gehen nur die wenigsten 
OPVs. Aber fürs Prinzip reicht es. Die V1 kann man (hochohmig) aus der 
VREF gewinnen und auf 1V abgleichen.

Vout = (R1/R2)(V2-V1)

R1=R2=10K0.

Um einen Meßbereich von 40-60V zu haben vergrößert man den R1 am Eingang 
um einen 40:1 Teiler zu erhalten. (Siehe ZeroSuppressionAmp.jpg) . Es 
fallen dann zwischen 40-60V dort 1-1.5V ab. R4/R6 skaliert um mit den 
gewählten Werten einen 0-1V Meßbereich zu erhalten der dann direkt dem 
ADC AIN0 Eingang zugeführt werden kann.

Z.B. Meßbereich 40-60V

Dann ergibt sich am Ausgang des OPV:

40V => 0V
50V => 0.5V
60V => 1.0V

Die Auflösung wird mit 20mV/Bit also wesentlich besser sein.

von Stefan F. (Gast)


Lesenswert?

Digilog schrieb:
> Ist die Schaltung und die Rechnung so korrekt?

Ungefähr ja.

60V / 350kΩ x 20kΩ = 3,428V

Aber diese 3,428V kannst du mit der internen 1,1V Referenz nicht 
erfassen, da sie höher ist. Außerdem solltest du bedenken, dass die 
interne Referenz zwar einigermaßen stabil ist, aber durchaus um 10% vom 
Nennwert abweichen kann.

> Kann ich die anderen Pins des ADC Ports weiterhin als
> digitale I/Os benutzen?

Ja

> Laut ADC Tutorial hier auf uC.net sollte zwischen AVCC und VCC
> noch eine Induktivität von 10uH gesetzt werden oder ersatzweise
> einfach 47R. Was wäre denn hier besser?

Ich denke, dass du bei deiner Anwendung einfach AVCC direkt mit VCC 
verbinden kannst. Geringfügiges Rauschen ist hier egal, gerade weil du 
per Software filtern wirst (Mittelwerte bilden).

Arduino Fanboy D. schrieb:
> Zusätzlich: Stützkondensator vorsehen, da doch recht hochohmig

Guter Hinweis. Und der braucht zwischen den Messungen genug Zeit, sich 
wieder aufzuladen. Sonst wird jede aufeinander folgende Messung einen 
kleineren Wert liefern.

Digilog schrieb:
> Was ich noch nicht verstanden habe ist, ob die zu messende Spannung am
> ADC Eingang kleiner sein muss, als VREF... also in diesem Fall kleiner
> als 1.1V.

Genau so ist es. Plane noch 10% Reserve ein, da die Referenz im 
ungünstigsten Fall auch 1V haben kann. Spannungen darüber (bis 5) sind 
zwar erlaubt, können aber nicht sinnvoll gemessen werden, denn schon bei 
Erreichen der Referenzspannung liefert der ADC den maximal möglichen 
Wert 1023. Höhere Spannungen liefern ebenfalls den Wert 1023.

von Manfred (Gast)


Lesenswert?

Digilog schrieb:
> Am Spannungsteiler entstehen nach meiner Rechnung
> folgende Teilspannungen:

Rechnen von Spannungsteilern musst Du noch lernen, die Werte passen 
nicht. Vergleiche mal den Rechengang
Stefanus F. schrieb:
> 60V / 350kΩ x 20kΩ = 3,428V
mit Deinem.

Arduino Fanboy D. schrieb:
> Zu 3:
> Natürlich ein L!
> Welch eine Frage...

Gerade der 'Fanboy' sollte Schaltbilder der Arduinos kennen und wissen, 
dass es dort keine Drossel in der AVCC gibt. Oh Wunder, aus 
unerklärlichen Gründen kann man damit trotzdem Spannungen messen.

Gerhard O. schrieb:
> Vielleicht hätte es in der Anwendung Sinn den Meßbereich mit
> Nullpunktunterdrückung zu versehen. Mit einem RR-OPV ließe sich das
> schön machen.

Ich denke nicht, dass dieser Aufwand notwendig ist. Der AT328 löst 10 
Bit auf, bei 60 Volt also rund 60mV. Das macht unten von 50 auf 48 Volt 
immer noch 30 Schritte, was ich für beherrschbar halte.

Für die Überwachung einer Batterieversorgung ist die interne Bandgap der 
328 stabil genug, da sehe ich auch den TL431 als unnötig.

Meistens habe ich Zeit genug, Oversampling zu machen: Ich hole mir 20 
Meßwerte mit jeweils 2ms Pause, werfe den kleinsten und größten weg und 
rechne den Mittelwert - das Ergebnis ist immer sehr stabil.

von Einer K. (Gast)


Lesenswert?

Manfred schrieb:
> Arduino Fanboy D. schrieb:
>> Zu 3:
>> Natürlich ein L!
>> Welch eine Frage...
>
> Gerade der 'Fanboy' sollte Schaltbilder der Arduinos kennen und wissen,
> dass es dort keine Drossel in der AVCC gibt.

Was ich alles weiß....
Und du mir alles unterstellen möchtest...

Seltsam seltsam...

Die Arduino Schaltbilder und Aufbauten halten sich nicht an die 
strengsten Vorgaben des Datenblattes. Da sind die Clone/Nachbauten teils 
besser aufgestellt, als die Originale.

Das wissen wir doch beide!
Oder?

Manfred schrieb:
> Oh Wunder, aus
> unerklärlichen Gründen kann man damit trotzdem Spannungen messen.
Mit verschenkter Genauigkeit.

Was dann dazu führt, dass irgendwelche Leute, die es selber auch nicht 
besser machen wollen, mit eigentlich unnötigen Rechenspielchen usw. die 
Genauigkeit im Nachhinein wieder raus holen wollen.
Z.B. Du:
Manfred schrieb:
> Meistens habe ich Zeit genug, Oversampling zu machen: Ich hole mir 20
> Meßwerte mit jeweils 2ms Pause, werfe den kleinsten und größten weg und
> rechne den Mittelwert - das Ergebnis ist immer sehr stabil.



Wenn für dich Arduino das Maß der Dinge, oder der Nabel der Welt, ist...
Von mir aus.
Aber für jemanden, welcher eigene Schaltungen entwickelt, so wie in 
diesem Thread, sollte es das nicht sein. (so lautet mein Vorschlag)

Klar kann man da mal rüber schauen, und vergleichen. Aber das ist doch 
alles kein Grund, das eigene Hirn abzuschalten. Oder das Datenblatt zu 
ignorieren.

-----

Bemerke!
Die Frage lautete:

Digilog schrieb:
> 3) Laut ADC Tutorial hier auf uC.net sollte zwischen AVCC und VCC noch
> eine Induktivität von 10uH gesetzt werden oder ersatzweise einfach 47R.
> Was wäre denn hier besser?

Und was ist besser?
Deiner Meinung nach?
Weg lassen, ist besser?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.