Hallo,
würde gerne die Spannung einer 1,2 V Batterie Messen,
ADC einlesen klappt auch schon hab ich mit Poti getestet,
nun also ich zieh den Input Pin auf Masse, und dazwischen klemm ich dann
den Plus Pol eine 1,2 Batterie an, dann müsste es doch einen Wert
ausgeben,
bei mir liest er immer nur 0 aus was könnte da falsch sein?
muss ich noch etwas beachten?
Walizer wrote:
> Hallo,>> würde gerne die Spannung einer 1,2 V Batterie Messen,> ADC einlesen klappt auch schon hab ich mit Poti getestet,
...schön...
> nun also ich zieh den Input Pin auf Masse,
...wozu das denn?
> und dazwischen klemm ich dann den Plus Pol eine 1,2 Batterie an,
"dazwischen"... ...zwischen WAS?!?
Hier wird der Kontakt zwischen die Versorgungsspannung und den
Eingangspin geschaltet.
Damit bei offener Schalterstellung kein undefiniertes Signal am
Controller ansteht, wird zwischen den Eingangspin und die Masse ein
Pull-Down Widerstand geschaltet. Dieser dient dazu, den Pegel bei
geöffneter Schalterstellung auf logisch 0 zu halten.
also jetzt liefert er mir einen Wert :)
nun klappt jedoch die Umrechnung in V nicht so richtig:
die Berechnung müsste doch so stimmen oder?
int u = adc / 1024 * 2.56;
Wenn Du so was mit C programmierst, achte drauf, dass erst multipliziert
und dann dividiert wird. Denn der Compliler hat Zwischenergebnisse auch
als int, und da geht die Genauigkeit verloren.
Machmal hilft es, long int Variablen zu deklarieren, und ganz am Ende
wieder zu int gehen.
> int u = adc / 1024 * 2.56;
Selbst wenn du die Reihenfolge umdrehst...
int u = adc * 2.56 / 1024;
wirst du damit nicht glücklich werden, da dann als mögliche Ergebnisse
nur die Zahlen 0, 1 und 2 in Frage kommen.
>> Dann ist u in hundertsten von Volt ausgedruckt, also 120 für eine 1,2V> Zelle
Die Division kann man sich sparen, wenn man den ADC 8-bittig ausliest.
...
jetzt bin ich verwirrt :)
kapier jetzt garnix mehr,
ich kann doch nicht einfach den Wert den der AD Wandler einliest durch 4
teilen?
ich möchte ja den AD wert in V umrechnen.
>ich möchte ja den AD wert in V umrechnen.
Ja klar, aber denk doch mal nach !
>int u = adc / 1024 * 2.56;
Setz doch einfach mal Werte ein:
0 / 1024 * 2.56 = 0 => integer 0
512 / 1024 * 2.56 = 1.28 => integer 1
1023 / 1024 * 2.56 = 2.55 => integer 2
integer hat keine Nachkommastellen !
Wenn du Nachkommastellen haben möchtest
musst du einen Skalenfaktor benutzen.
Für zwei Stellen hinter dem Komma ist das 100.
Dann sparst du dir auch die float Multiplikation.
512 / 1024 * 256 = 128 => integer 128
Das stellst du dann günstig um:
adc * 256 / 1024
und das ist
adc / 4
ahh ok das check ich jetzt,
ok gut nur ich möchte den Messwert dann gerne auf einem LCD ausgeben
da ist es halt bissl blöd wenn die Werte dann ohne Komma angezeigt
werden...
melde mich nochmal, das ganze klappt wohl doch noch nicht so wie es
sollte...
habe jetzt ein paar Messungen durchgeführt und es kam immer nur so ca
0,4 - 0,6 V raus dann dacht ich mir das kann nicht sein und hab mit dem
Multimeter nachgemessen dort waren es dann 1,2 was könnte die
Fehlerursache sein?
aber wenn ich so überleg könnte das durchaus sein, denn ich bekam ja als
Messwert 0,6 raus und mit multimeter 1,2 aber es ist doch egal wo aref
angeschlossen ist wenn man im AD-Wandler einstellt das er die interne
2,56 Ref Spannung nehmen soll oder?
Walizer wrote:
> aber wenn ich so überleg könnte das durchaus sein, denn ich bekam ja als> Messwert 0,6 raus und mit multimeter 1,2 aber es ist doch egal wo aref> angeschlossen ist wenn man im AD-Wandler einstellt das er die interne> 2,56 Ref Spannung nehmen soll oder?
Na weißt Du denn nicht, was Du in ADMUX als Messquelle, Referenzquelle
und Resultatausrichtung eingestellt hast? Der ADC würfelt seine
Referenz-Quelle nicht aus, sondern nimmt exakt das, was Du ihm per
Programm vorgegeben hast. Siehe Datenblatt -> ADMUX
An AREF gehört übrigens (bei neueren AVRs) nur ein Glättungskondensator
angeschlossen. Die Auswahl der Referenz intern oder AVcc erfolgt über
ADMUX. Nur wenn eine externe Referenz benötigt wird, darf diese an AREF
angeschlossen werden, dann ist aber darauf zu achten, dass mit ADMUX
nicht versehentlich auf intern oder AVCC umgeschaltet wird.
...
Walizer wrote:
> doch natürlich, ich hab dort eingestellt das die interne 2,56 V ref> Spannung benutzt werden soll
...wir wollen / müssen Code sehen.
Gruß,
Magnetus
c
' Die an den ADC-Ports 0 und 1 anliegende Spannung wird in eine digitale
Zahl
' zwischen 0 und 1023 umgewandelt. Der diesem Wert ensprechende
Spannungswert
' wird auf dem LCD Display angezeigt. Bei einem Überlauf wird " HHHH V"
ange-
' zeigt.
Dim wert1, wert2 As Single ' Deklaration der
globalen
Dim zeile1(10) As Char ' Variablen
Dim zeile2(10) As Char
'-----------------------------------------------------------------------
--------
' Hauptprogramm
'
Sub main()
LCD_Init() ' Display wird initialisiert
LCD_ClearLCD() ' Display wird gelöscht
LCD_CursorOff() ' Cursor wird ausgeschaltet
zeile1=" 0.00" ' default Wert für Zeile1
zeile2=" 0.00" ' default Wert für Zeile2
Do While (True) ' Endlosschleife wird gestartet
ADC_Set(ADC_VREF_VCC,0) ' Port 0 des A/D
Wandlers wird initialisiert
' Vcc
(5V) ist Referenzspannung
wert1 = ADC_Read()*5.0/1024.0 ' Der analoge Zahlenwert des ADC
Portes 0
' wird in die Variable "wert1"
gespeichert
' "5.0/1024.0" dient zur Umrechnung
in den
' ensprechenden Spannungswert
ADC_Set(ADC_VREF_VCC,1) ' Port 1 des A/D Wandlers wird
initialisiert
' Vcc (5V) ist Referenzspannung
wert2 = ADC_Read()*5.0/1024.0 ' Der analoge Zahlenwert des ADC
Portes 1
' wird in die Variable "wert1"
gespeichert
' "5.0/1024.0" dient zur Umrechnung
in den
' ensprechenden Spannungswert
Ausgabe() ' Durch diesen Funktionsaufruf
werden die
'
Messwerte auf dem Display ausgegeben.
AbsDelay(500) ' 500ms Verzögerung bis zur nächsten
Messung
End While
End Sub
' Displayausgabe des 2 Kanal Voltmeters
' erforderliche Library: IntFunc_Lib.cc, LCD_Lib.cc
'-----------------------------------------------------------------------
--------
' Displayausgabe
'
Sub Ausgabe()
Dim einheit(3) As Char ' Deklaration der globalen
einheit = " V" ' Festlegung der angezeigten
Einheit
If wert1>4.99 Then ' Bei zu großen Messwerten an ADC0
wird
zeile1=" HHHH" ' " HHHH" in Zeile1 angezeigt.
Else
Str_WriteFloat(wert1,2,zeile1,1) ' Die Floatvariable
"wert1" wird in
End If ' einen Text mit 2
Dezimalstellen
' und einem Offset von 1
umgewandelt
If wert2>4.99 Then ' Bei zu großen Messwerten an
ADC1 wird
zeile2=" HHHH" ' " HHHH" in Zeile2 angezeigt.
Else
Str_WriteFloat(wert2,2,zeile2,1) ' Die Floatvariable "wert2"
wird in
End If ' einen Text mit 2
Dezimalstellen
' und einem Offset von 1
umgewandelt
LCD_CursorPos(0x00) ' Der Cursor wird an den Anfang
der ersten
' Zeile
gesetzt.
LCD_WriteText(zeile1) ' Variable "zeile1" wird
ausgegeben
LCD_WriteText(einheit) ' Einheit wird ausgegeben
LCD_CursorPos(0x40) ' Der Cursor wird an den Anfang
der zweiten
' Zeile gesetzt.
LCD_WriteText(zeile2) ' Variable "zeile1" wird
ausgegeben
LCD_WriteText(einheit) ' Einheit wird ausgegeben
End Sub
/C
Hier hast Du mal Code zum austoben allerdings in Basic und für
CC-Control
Lies dir mal das Tuturial durch.
Gruß Murmel