PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Spannung mit ADC-Port messen



RHS
17.10.2005, 23:37
Hallo,

ich messe über einen Spannungsteiler von 1500 und 750 Ohm am
ADC(0)-Port des M128 einen Wert von 510. Es wird die interne
Ref-Spannung von 2,56V verwendet.

Welcher Gesamtspannung entspricht das nun?

Wenn ich rechne:

510 * (2,56/1023) * (1500+750)/750 komme ich auf 3,825 Volt am
ADC-Port. Mal Faktor 3 entspricht das also 11,475 Volt bei gemessenen
12 Volt. Also knapp 0,6 Volt zu wenig.

Bei gemessenen 15 Volt habe ich jedoch einen ADC-Wert von 518,
bzw. bei 9 Volt von 498. Und das kann nicht stimmen ... <grübel>

Danke: - Reinhard -

Werner_Just
18.10.2005, 09:35
Hallo Reinhard,

wo kommt der 2. Faktor 3 her?

Ciao,
Werner

RHS
18.10.2005, 11:08
Hallo Werner,



wo kommt der 2. Faktor 3 her?


gute Frage :-).

Lt. meiner Meinung (die muss nicht korrekt sein): (1500+750)/750 = 3

Ich hab gestern das "ganze" Internet danach abgesucht, aber kein
einziges Berechnungsbeispiel gefunden, welches aus einem ADC-Wert
auf die Gesamtspannung schliesst und den Weg dorthin genau erklärt.

Danke für Deine Mühe: - Reinhard -

Werner_Just
18.10.2005, 11:22
Hallo Reinhard,

Du schließt aus dem Messwert und der Reference-Spg auf Deinen ADC-Eingangsspannungswert und rechnest zurück, welche Spannung an Deinem Schaltungseingang anliegt.

Bei 2.56V Reference, Messwert 510 und einem vorgeschalteten Spannungsteiler 15k/750R, komm ich auf 3,82 V am Schaltungseingang.

Das das fast 12V ist, wenn man den Wert mit 3 multiplizert stimmt zwar, aber das ist wohl eher Zufall, weil der ADC bei 12 V Eingangspannung völlig
übersteuert und evt. dabei auch abgeraucht ist.

Mit 2.56V Ref und dem Spannungsteiler kannst Du nur Spannungen von 0.- 7,18V messen.

Ciao,
Werner

RHS
18.10.2005, 12:03
Hallo Werner,

ich rechne mal ein wenig:

Der Spannungsteiler besteht aus 1,5K (nicht 15k) und 750R
(bestehend aus 2x 1,5k parallel).

Bei einer Spannung von 12V: -> I=U/R -> 12/(1500+750) = 0,005333A
für ADC fallen ab -> U=R*I -> 0,005333A * 750 = 3,99975 Volt

Bei einer Spannung von 15V: -> I=U/R -> 15/(1500+750) = 0,006666A
für ADC fallen ab -> U=R*I -> 0,006666A * 750 = 4,9995 Volt

Ich könnte also max. 15 Volt messen ...

x. Teil am ADC: (1500+750)/750 = 3 -> Gesamtspannung ist also 3x
so hoch.

Gesamtspannung: 3 * 3,99975V = 11,99925 Volt (wäre ja richtig)


Mein Problem ist jetzt der ADC-Wert. Bei 15 Volt müsste ich 1023 haben,
bei 12 Volt entsprechend weniger.

ADC-Wert * Ref: 510 * (2,56/1023) = 1,2762

Und wie gehts dann weiter ...?


Gruß: - Reinhard -

Werner_Just
18.10.2005, 12:38
Hallo Reinhard,

> Ich könnte also max. 15 Volt messen ...
nur wenn Deine ReferenceSpannung 5V beträge.
Du kannst aber nur von Gnd bis Aref (am ADC Pin) messen. Also entweder eine externe 5V Referencespannung verwenden oder den Spannungsteiler anpassen.

> Mein Problem ist jetzt der ADC-Wert. Bei 15 Volt müsste ich 1023 haben,
> bei 12 Volt entsprechend weniger.
> ADC-Wert * Ref: 510 * (2,56/1023) = 1,2762
> Und wie gehts dann weiter ...?

... den Spannungsteiler rausrechnen
1.2762 / (750/2250) = 3,829 V

Das Stimmt aber nur, solange Dein Messwert korrekt ist und das ist nicht der Fall, da Deine Spannung am ADC Pin größer als Aref ist. Eigentlich sollte Dein Messwert also 1023 betragen sobald die Spannung größer als 7,68 V wird. Vorrausgesetzt Du betreibst den ADC im 10 bit Modus.

Warum Du einen kleineren Wert misst kann ich nur vermuten. Die wahrscheinlichste Variante ist imo, Du hast den ADC inzwischen geschossen.

Es kann aber noch andere Gründe haben.
- Uref nicht mit einem Kondensator am Aref-Anschluß stabilisiert.
- Du liest im Programm den ADC zu schnell aus.
- Du liest ihn nur einmal aus. (Der erste ADC Wert nach dem Start einem Messung war früher häufig falsch. Der M128 ist aber so neu, da sollte der Bug inzwischen ausgemerzt sein. )

Ciao,
Werner

RHS
18.10.2005, 13:02
Hallo Werner,



Es kann aber noch andere Gründe haben.
- Uref nicht mit einem Kondensator am Aref-Anschluß stabilisiert.
- Du liest im Programm den ADC zu schnell aus.
- Du liest ihn nur einmal aus.)


kurz noch zu diesen Punkten:

Punkt 1 muss ich prüfen (Hardware ist fertig, ich schreib nur die Soft).

Den ADC habe ich ausgelesen und danach diverse andere Aktionen
ausgeführt. Ca. alle 2 Sekunden wird der ADC ausgelesen. Ist das
zu schnell? Ist nur ein Testprogramm, könnte die Zeit also noch
strecken ...

Was mir dabei aufgefallen ist: 10-maliges Auslesen bringt meist
verschiedene Werte: 515, 514, 513 ... 510.

Und wie ist eigentlich die richtige Reihenfolge:


Start Adc
Do
Print Adc(0)
Wait 2
Loop
Stop Adc


oder


Do
Start Adc
Print Adc(0)
Stop Adc
Wait 2
Loop



Gruß: - Reinhard -

Werner_Just
18.10.2005, 13:41
Hallo Reinhard,

2 sec sind mit Sicherheit nicht zu schnell.

Zur Reihenfolge, das hängt davon ab wie Du den ADC konfiguriert hast, und ob Du Strom sparen willst oder nicht.

Wie hast Du den ADC konfiguriert?
'Start ADC' schaltet erstmal nur die Hardware im AVR ein.
'Stop ADC' schaltet sie aus.

Einen Messwert holt man normalerweise mit 'GetADC' und legt das Ergebnis in einer Wordvariable ab.

Ob das direkte Auslesen mit 'Print ADC(0)' korrekt funktioniert kann ich nicht sagen, habs nie ausprobiert. Wenn, dann geht das nur wenn der ADC als 'Free' konfiguriert ist.

Ciao,
Werner

RHS
18.10.2005, 16:29
Hallo Werner,

die Konfiguration des ADC ist so, wie in der Bascom-Hilfe
beschrieben (Config Adc = Single , Prescaler = Auto,
Reference = Internal)

Mein Hardware-Spezi sagt mir gerade, das wenn URef intern
zugeschaltet wird, lt. Atmel kein externer CRef nötig wäre.

Und, man könnte per Software 5 oder 2,56 Volt als Ref
wählen (muss ich noch nachlesen). Der Spannungsteiler
wäre so ausgelegt, das bei einer Spannung von 15 Volt am
ADC 5 Volt anliegen würde.

Ob ich nun mit Print Word-Variable oder direkt mit Print arbeite,
dürfte doch keinen Unterschied machen. Zumindest hatte ich
das gestern noch gemacht und die Werte waren identisch (falsch).

Gruß: - Reinhard -

RHS
18.10.2005, 23:35
@Werner,

Mit Config Adc=Single, Prescaler = Auto, Reference = AVCC
kann ich bei meiner Hardware 5V als Ref wählen.

Die Werte sind aber immer noch nicht korrekt.
Fazit: der ADC ist Schrott.

Gruß: - Reinhard -

Werner_Just
19.10.2005, 06:55
Morgen Reinhard,

> Mein Hardware-Spezi sagt mir gerade, das wenn URef intern
> zugeschaltet wird, lt. Atmel kein externer CRef nötig wäre.

nötig nicht, aber Atmel empfielt es in seinen AppNotes zum ADC.

> Mit Config Adc=Single, Prescaler = Auto, Reference = AVCC
> kann ich bei meiner Hardware 5V als Ref wählen.

"Config Adc=Single" sagt dem ADC er soll nur auf Aufforderung messen.
Print ADC(0) liest nur das ADC-Register aus, es sagt nicht, der ADC soll messen. By the way, BAscom spricht von "ADCD" für den direkten Zugriff auf das ADC-Data Register.

Probiers mal mit:
Config ADC=Free, ....
Start ADC
...
Print ADC(0) ' ADCD(0)???

oder...
Dim Analog0 as Word
Config ADC = Single, ....
Start ADC
...
Analog0 = GetADC(0)
Print Analog0


Ciao,
Werner

RHS
19.10.2005, 10:56
Hallo Werner,

oben war ein Vertipper: klar habe ich mit GetADC(0) bzw.
mit Print GetADC(0) "gemessen".

Mit Config ADC=Free, ... werde ich es noch probieren. In der
Kombination mit Internal=AVCC habe ich das noch nicht
benutzt.

Aber ich glaub, der ADC ist hin ... War aber nur ein Baumuster.
Besser jetzt als in einer Kleinserie ;-).

Gruß: - Reinhard -

Werner_Just
19.10.2005, 12:31
Hallo Reinhard,

> Aber ich glaub, der ADC ist hin ...
lass bei Gelegenheit mal hören was daraus geworden ist.

Ciao,
Werner

DerWarze
19.10.2005, 21:09
Hallo

Ich glaub der Fehler liegt auch darin das ideale Buelemente angenommen werden. Erstens wirken sich Toleranzen der Spannungsteilerwiderstände mitunter recht drastisch aus es sei den man verwendet engtolerierte und/oder ausgemessene Widerstände. Dann hat auch die Interne Referenz recht große Exemplarstreuungen, die ist eben nie genau 2,56V (Im Datenblatt kann man die Grenzwerte lesen). Also muß man immer noch mal nachmessen (mit ordenlichen hochohmigen Messgerät und nicht mit den Billigzappelmax aus dem Baumarkt) oder wenn es auf reproduzierbare genaue Werte ankommt externe Referenzen verwenden. Die wechselnden Werte lassen auf ungünstige Masseleitungsverlegung schließen Wobei die letzte Stelle immer etwas 'flattert' irgendwas streut immer ein und auch die Messpannung wird nicht auf 1mV stabil sein.

Rechnet man mit der Spannungsteilerformel Ua= (Uin*R2) / (R1+R2) nach kannst Du bei 2,56V Ref maximal 7,68V messen was darüber liegt bringt Fehler. bei 5V ref sinds dann 15V nur am Pin direkt sollten nicht wesentlich über 5V anliegen, wobei bei mir aber einer den ich kurz mit 10V gequält hatte trotzdem überlebt.

Werner_Just
20.10.2005, 14:43
Hallo Warze,

510 <-> 1023 würde ich nicht mehr mit Bauteiltoleranzen erklären.
Soooo schlecht ist die interne Spannungsreference nun auch nicht ;).

Ciao,
Werner

DerWarze
20.10.2005, 19:09
Na Ja dieser Bereich war ja auch nicht gemeint hatte mich da eigentlich auf 11,äppelstücke zu 12 V bezogen und vergessen das Zitat reinzusetzen.
Die Interne Ref ist ja durchaus stabil kein Problem. aber der Wert kann Exemplarbedingt laut Datenblatt von 2,3 bis 2,7 V sein und das ist schon heftig wenn man was in Serie aufbaut. Habe da ein Batteriemanagement da wird je nach Serie aus 36V Messannung (natütlich immer am gleichen Spannungsteiler gemessen) ein Anzeigewert von 33 bis 38 was für so eine Anwendung natürlich nicht geht.