Forum: Mikrocontroller und Digitale Elektronik EFM32LG230F256


von Lukas (Gast)


Lesenswert?

Hallo,

da ich mich aktuell mit Funkmodulen beschäftige, genau genommen mit 
diesen Geräten hier 
https://www.digi.com/products/embedded-systems/digi-xbee/rf-modules/sub-1-ghz-modules/digi-xbee-sx-868, 
sind bei mir ein paar Fragen bezüglich der äußeren Beschaltung des ADC 
Eingangs aufgetaucht.
Auf diesen Modulen sind folgende Mikrocontroller verbaut EFM32LG230F256. 
Jetzt suche ich vergeblich nach einer Angabe einer maximal zulässigen 
Eingangsimpedanz (Eingangswiderstand) an den ADC Eingängen, um präzise 
Messungen zu erhalten????

Und zwar geht es um eine Spannungsmessung mittels einfachem 
Spannungsteiler. Schaltung sieht wie folgt aus:
1
-----10V
2
  |
3
  R1
4
  |
5
----------ADC0
6
  |     |
7
  R2    C1
8
  |     |
9
----------GND
R1 = 1MOhm, R2 = 82kOhm, C1 = 10µF

Als Referenzspannung des ADC wird die interne 1,25V Spannung genutzt. 
Eine exterene Referenz wäre wahrscheinlich besser, ist aber bei den 
Modulen oben nicht möglich anzulegen.

Da es sich bemerkbar macht, dass der ADC bei dieser Anordnung stärker 
schwankt (~3-4 Bits) muss es also einen maximal zulässigen 
Eingangswiderstand vom ADC0 PIN aus gesehen geben. Doch in den 
Datenblättern vom MCU und vom XBee Modul steht dazu nichts.

Nun die eigentlichen Fragen:
- Gibt es solch eine Angabe und wo ist diese zu finden, bezüglich des 
maximalen Eingangswiderstandes??
- Passt die hochohmige Schaltung, oder wählt man bei ADC Eingängen 
niederohmige Spannungsteiler (bzw. Impedanzwandler, ist in meinem Fall 
aber leider keine Option)??

von Jörg R. (solar77)


Lesenswert?

Lukas schrieb:
> da ich mich aktuell mit Funkmodulen beschäftige...

Hättest dich auch mal mit einem aussagekräftigen Titel beschäftigen 
sollen?

von Mike J. (linuxmint_user)


Lesenswert?

Lukas schrieb:
> - Passt die hochohmige Schaltung, oder wählt man bei ADC Eingängen
> niederohmige Spannungsteiler (bzw. Impedanzwandler, ist in meinem Fall
> aber leider keine Option)??

Es kommt darauf an wie hoch der Strom ist der fließt.

Du willst also maximal 16,5V messen.
Wie oft willst du das tun? Bedenke dass du bei jeder Messung den 
Sample&Hold-Kondensator im ADC auflädst und eine gewisse Ladungsmenge in 
ihn rein fließt. Je mehr Ladungen pro Sekunde verloren gehen, desto 
größer ist der Stromfluss.

C1 ist wirklich groß, hier dauert es etwa 50 Sekunden bis sich der 
Kondensator gefüllt hat.
Eine leichte Änderung welche in der zu messenden Spannung auftritt 
braucht auch etwa 1 Minute bis sie am ADC sichtbar wird.

Versuche es einfach ein mal mit 100nF. Es kommt aber natürlich darauf an 
was du damit machen möchtest. Erzähle etwas mehr und wir können dir 
etwas besser helfen.

Hast du die echte Referenzspannung deines Controllers ermittel?
Die interne 1,25 V Referenz kann 1,2V bis 1,3V liefern.
Ich ermittle diesen Wert immer über ein kleines Programm welches ich 
über UART steuere, einer angelegten Referenzspannung, danach werden die 
ermittelten Werte in den EEprom geschrieben und noch mal getestet ob der 
richtige Wert angezeigt wird.

von Lukas (Gast)


Lesenswert?

Mike J. schrieb:
> Du willst also maximal 16,5V messen.
> Wie oft willst du das tun? Bedenke dass du bei jeder Messung den
> Sample&Hold-Kondensator im ADC auflädst und eine gewisse Ladungsmenge in
> ihn rein fließt. Je mehr Ladungen pro Sekunde verloren gehen, desto
> größer ist der Stromfluss.
>
> C1 ist wirklich groß, hier dauert es etwa 50 Sekunden bis sich der
> Kondensator gefüllt hat.
> Eine leichte Änderung welche in der zu messenden Spannung auftritt
> braucht auch etwa 1 Minute bis sie am ADC sichtbar wird.
>
> Versuche es einfach ein mal mit 100nF. Es kommt aber natürlich darauf an
> was du damit machen möchtest. Erzähle etwas mehr und wir können dir
> etwas besser helfen.
>
> Hast du die echte Referenzspannung deines Controllers ermittel?
> Die interne 1,25 V Referenz kann 1,2V bis 1,3V liefern.
> Ich ermittle diesen Wert immer über ein kleines Programm welches ich
> über UART steuere, einer angelegten Referenzspannung, danach werden die
> ermittelten Werte in den EEprom geschrieben und noch mal getestet ob der
> richtige Wert angezeigt wird.

Maximal möchte ich eine Spannung von 15V überwachen, dies am besten sehr 
energiesparend. Die Widerstände habe ich hier noch rumliegen deswegen 
habe ich diese ausgewählt. Das Messintervall soll verstellbar sein, 
mindestens aber bei 1 s liegen.

Wie kommst du auf diese zeitlichen Größenordnungen? Die Zeitkonstante 
des Spannungsteiler mit Kondensator beträgt doch nur 757,86 ms und 
braucht somit 3,789 s zur Aufladung.

Das ganze wird über einen 6V Akku gespeist, wonach ein Spannungsregler 
geschaltet ist für die 3V3 Versorgung. Da die letzten Bits (10-Bit ADC) 
immer kippeln und dies sich stärker bemerkbar macht bei hochohmigen 
Spannungsteilern, muss es dort doch eine Angabe zu geben???

Werde die interne Referenz mal noch messen.

von Mike J. (linuxmint_user)


Lesenswert?

Lukas schrieb:
> Spannungsteiler. Schaltung sieht wie folgt aus:-----10V
>   |
>   R1
>   |
> ----------ADC0
>   |     |
>   R2    C1
>   |     |
> ----------GND
> R1 = 1MOhm, R2 = 82kOhm, C1 = 10µF

Wie rechnest du?

Tau=R*C=1.000.000 Ohm*0,00001F=10s
Nach 5*Tau kann man sagen dass sich die Spannung zu 98% angeglichen hat.

Lukas schrieb:
> Das ganze wird über einen 6V Akku gespeist, wonach ein Spannungsregler
> geschaltet ist für die 3V3 Versorgung. Da die letzten Bits (10-Bit ADC)
> immer kippeln und dies sich stärker bemerkbar macht bei hochohmigen
> Spannungsteilern, muss es dort doch eine Angabe zu geben?

Das hat eigentlich nichts mit "hochohmig" zu tun, das solltest du gut 
hinbekommen.
Weshalb speist du deine Schaltung nicht aus einer LiIon-Zelle (3,6V - 
4,2V)? Ein LowDrop-3,3V Regler (XC6206P332MR) liefert dir die Spannung 
bis die Zelle leer ist.
Du nutzt ja keine 24bit ADC, mit dem ordentlichen Tiefpass bekommst du 
das aber nur hin wenn du alle Parameter beachtest.

Ich mache es bei Akku-gespeisten Schaltungen so dass ich die 
Versorgungsspannung des Spannungsteilers mit einen P-Kanal MosFET 
abschalte und nur wenn ich messen möchte den Transistor rechtzeitig 
davor zuschalte.
Selbst wenn du einen Spannungsteiler (Tiefpass) mit z.B. 10kOhm 
Widerstand und 10nF als Ladungsspeicher nutzt, dann braucht es noch 
0,5ms bis sich die Spannung (für den blödesten Fall) angeglichen hat.

Lukas schrieb:
> Werde die interne Referenz mal noch messen.

Hast du dort auf deiner Platine einen externen Kondensator an dem 
Controller an dem man die Referenzspannung messen kann?
Ich habe jedenfalls gesehen dass der Controller AVdd Pins hat, sind die 
mit den IOVdd-Pins verschaltet oder wurde das entkopelt.

Pin 40 heißt "DECOUPLE" , das ist der Pin wo der Abblockkondensator 
(X5R-Typ) dran hängt, der sollte 1µF groß sein.
Miss dort ein mal die Spannung, sie sollte im Bereich von 1,2V bis 1,3V 
liegen.
1,25V sind es nur wenn du zufällig mal Glück hattest.
Ich hatte schon Controller mit einer internen Referenz die ganz am 
äußersten Ende der Spezifikation lagen.

: Bearbeitet durch User
von Lukas (Gast)


Lesenswert?

Mike J. schrieb:
> Lukas schrieb:
>> -----10V
>>   |
>>   R1
>>   |
>> ----------ADC0
>>   |     |
>>   R2    C1
>>   |     |
>> ----------GND
>> R1 = 1MOhm, R2 = 82kOhm, C1 = 10µF
>
> Tau=R*C=1.000.000 Ohm*0,00001F=10s
> Nach 5*Tau kann man sagen dass sich die Spannung zu 98% angeglichen hat.

R1 und R2 sind parallel vom Kondensator C1 aus betrachtet, daher gilt 
(R1||R2)*C. Damit komme ich auf die geringen Zeitwerte.
Nach deiner Rechnung verändert sich durch die riesen Zeitkonstante am 
ADC Eingang ja nichts und es würde auch kein Bit kippeln.

> Weshalb speist du deine Schaltung nicht aus einer LiIon-Zelle (3,6V -
> 4,2V)? Ein LowDrop-3,3V Regler (XC6206P332MR) liefert dir die Spannung
> bis die Zelle leer ist.
>
> Ich mache es bei Akku-gespeisten Schaltungen so dass ich die
> Versorgungsspannung des Spannungsteilers mit einen P-Kanal MosFET
> abschalte und nur wenn ich messen möchte den Transistor rechtzeitig
> davor zuschalte.

Die Speisung mit einer LiIon-Zelle werde ich vorerst zum Testen 
anwenden, der LDO ist ein LT1529-3.3.

An einer Lösung mit einem Transistor hatte ich auch bereits überlegt, 
doch leider habe ich aktuell nur NPN Bip. Transistoren hier rum liegen. 
Werde es aber noch mit einem PNP oder P-MOSFET ausprobieren und kleinere 
Widerstände für den Spannungsteiler nehmen.

> Lukas schrieb:
>> Werde die interne Referenz mal noch messen.
>
> Hast du dort auf deiner Platine einen externen Kondensator an dem
> Controller an dem man die Referenzspannung messen kann?
> Ich habe jedenfalls gesehen dass der Controller AVdd Pins hat, sind die
> mit den IOVdd-Pins verschaltet oder wurde das entkopelt.

Das Problem ist, dass der µC nicht direkt erreichbar ist auf dem 
Funkmodul. Der Ref PIN ist auch nicht herausgeführt, somit ist keine 
Messung von VRef an einem Ausgangspin möglich.

von Mike J. (linuxmint_user)


Lesenswert?

Lukas schrieb:
> R1 und R2 sind parallel vom Kondensator C1 aus betrachtet, daher gilt
> (R1||R2)*C. Damit komme ich auf die geringen Zeitwerte.
> Nach deiner Rechnung verändert sich durch die riesen Zeitkonstante am
> ADC Eingang ja nichts und es würde auch kein Bit kippeln.

Ich habe dir vereinfacht gezeigt was beim aufladen passiert, der 
Kondensator wird aber durch einen viel kleineren Widerstand entladen.

Das Kippeln der Bits kann verschiedene Gründe haben.
Die Spannung am Kondensator ist vielleicht stabil wie eine 1, aber die 
Störungen kommen intern aus dem Controller.

Beim AVR gibt es einen Schlafmodus bei dem quasi nur der ADC läuft und 
der Controller keine Puls-Ströme aus der Versorgung zieht. Das sorgt 
dafür dass man die 10 Bit zu 100% verwenden kann.

Aus dem ATmega8 Datenblatt:
(The ADC features a noise canceler that enables conversion during sleep 
mode to reduce noise induced from the CPU core and other I/O 
peripherals.)

Vielleicht gibt es solch ein ähnliches Feature bei deinem Controller 
auch.

Wenn du neben der AD-Wandlung noch andere Dinge machst und vielleicht 
auch eine 12 Bit Auflösung haben möchtest, dann sind das eben ungünstige 
Bedingungen verbunden mit einem empfindlicheren Wandlern.

Das ist so als ob du auf einer Baustelle neben einem Rüttler und 
Abbruchhammern sitzt und dabei versuchst ein Haar durch ein Nadelöhr zu 
fädeln.

Du weißt auch nicht ob auf deiner Fertig-Platine die analoge 
Versorgungsspannung entkoppelt ist oder ob die einfach mit der digitalen 
zusammen gelegt worden ist. (Schaltung ist auf der Hersteller-Webseite 
verfügbar?)
Digital-GND und Analog-GND müssten auch mindestens durch Ferrit-Perlen 
entkoppelt sein.

Du könntest den ADC vielleicht einfach etwas langsamer arbeiten lassen 
und die Taktfrequenz des ADC reduzieren.

von Andi B. (andi_b2)


Lesenswert?

Eine EFM32 bitte nicht mit irgendwelchen Atmegas vergleichen. Die Atmel 
Dinger sind das reinste Spielzeug im Vergleich dazu und Erfahrungen 
damit, sollten nicht auf EFM32 umgelegt werden.

Zur Referenz - die interne zu verwenden ist schon gut. Auch wenn die 
nicht exakt ist, der EFM32 ist darauf kalibriert. Und die Kalibrierwerte 
für die 1,25V Einstellung, werden sogar automatisch beim Reset 
reingeladen.

Quellimpedanz - generell wird immer geringe gefordert für hohe 
Genauigkeit. Deine ca. 76k resistiv sind natürlich für einen ADC schon 
sehr hoch. Der C macht das Ganze aber wieder sehr niederohmig für 
dynamische Vorgänge. Da der EFM32 einen maximalen Leckstrom von 40nA 
spezifiziert, ist der externe R allerdings nicht ganz so wichtig wie bei 
den meisten anderen Controllern. Und mit einem C so wie hier, kriegst du 
die Umladevorgänge der internen C's ziemlich gut in den Griff.

Wenn du deinen EFM32 im Standard 12Bit Mode betreibst, sind deine 3-4 
Digits grad mal etwas über 1mV. Und somit noch immer um Welten besser 
als z.B. 1 Digit bei einem 8Bit ADC an 3,3V. Deine Leitungen vom C zum 
ADC und die ADC Siebung, die Pins des EFM32, GND, ... müssen da schon 
sehr gut sein wenn du was besseres haben willst. Aber du schreibst 
leider nicht, mit welcher Auflösung du den ADC betreibst.

Die Eingangsschaltung des ADC ist leider in der Tat nicht exakt 
beschrieben. Zumindest war das früher so. Da mußte man sich manches aus 
dem Supportforum zusammensuchen. Aber ich denke so tief willst du gar 
nicht einsteigen. Du kannst noch mit der Sampling Rate spielen in der 
SW, hast ja anscheinend eh ewig Zeit bei der externen Zeitkonstante, 
aber vor allem mit de Aquisition Time. Ja, die kann man beim EFM32 in 
sehr großem Bereich extra einstellen. Auch könntest noch Oversampling 
einschalten und damit praktisch in HW weiter filter, oder wenn's 
wirklich sein muss, auch noch in SW. Dein Ungenauigkeit wird aber 
höchstwahrscheinlich an der nicht perfekten Hardware und deren Störungen 
liegen. Wenn du die nicht verbesserst, sind alle meine obigen Vorschläge 
eh nur kosmetisch.

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.