ADCSRA|=(1<<ADSC);//ADC einmal starten um Dummy zu lesen, sonst passiert nix
20
21
result=ADCW;//ADCW einmal lesen sonst beim naechsten mal keine Uebernahme
22
23
result=0;
24
25
for(i=0;i<4;i++)
26
{
27
ADCSRA|=(1<<ADSC);//single conversion
28
while(ADCSRA&(1<<ADSC))
29
{
30
;//Warten auf Konvertierung
31
}
32
result+=ADCW;//Wandlungsergebnis aufaddieren
33
}
34
35
ADCSRA&=~(1<<ADEN);//ADC deaktivieren
36
37
result=result/4;//Wandlungsergebnis durch Anzahl Messungen
38
39
returnresult;
40
}
41
42
intmain(void)
43
{
44
uint16_tbat_mess_wert;
45
charstring[20];
46
sei();
47
uart_init(UART_BAUD_SELECT(9600,F_CPU));
48
49
bat_mess_wert=ADC_Read(0);
50
itoa(bat_mess_wert,string,10);
51
uart_puts(string);
52
uart_puts_P("\r\n");
53
return(0);
54
55
}
Ich will damit die Spannung eines Akkus messen, zur Zeit haengt er auf
5V mit einem Spannungsteiler 2*10k.
Externe Referenzspannung ist 3,3V.
Jetzt sollte mir ueber UART theoretisch nach Formel:
ADC=(U_in*1024)/U_Ref=(2,5*1024)/3,3=775 angezeigt werden, aber ich
bekomme nur 460+/-5 angezeigt.
Hab ich jetzt einen Denkfehler oder stimmt was mit dem ADC nicht?
Vielen Danke
Daniel
kay, herzlichen danke,
hab jetzt mit:
DDRA = 0x00;
PORTA = 0x1;
den Eingangs-Pull-Up aktiviert und krieg jetzt 1023+/-1 angezeigt, das
sieht schon besser aus.
Leider hab ich den Akku nicht da, kann also nicht testen ob bei
Spannungsverringerung dich der Adc wert ändert, aber das sollte jetzt ja
passen oder?
Mit Pullup kommt der max. Wert raus, könnte passen, ohne Pullup sollte
dann gegen 0 gehen.
Wenn die Ref aber nur 3.3V hat, der Pullup aber 5V liefert, weiss ich
nicht ob das so gut für den ADC ist.
Testen kannst Du mit einem Poti, oder einfach 2 Widerständen.
@ Daniel:
Ein fehlendes "DDRA=" ist sicher nicht das Problem, denn da du den Pin
nirgendwo auf Ausgang stellst, ist er bereits ein Eingang.
So nebenbei:
Deine Dummy-Messung geht als erste Messung mit in das Ergebnis ein, weil
du nicht auf das Ende dieser Messung wartest.
Lass das mit dem dummy-lesen einfach weg. Das steht zwar so im Tutorial,
ist aber nur erforderlich, wenn auch der allererste Wert nach
Power-On-Reset schon fehlerfrei sein muß.
Oliver
Jetzt bin ich ein bisschen verwirrt, also die Routine ist der im
GCC-Tutorial nachempfunden, da steht das so drin, deswegen verwundert
mich das die Dummy-Abfrage so nicht funktionieren soll.
Also muss ich auch nicht den PULL-UP aktivieren?
Wie gesagt, wenn ich den Pull-up deaktiviere komm ich auf einen Wert von
460.
Meine Anwendung soll sein, ich werd einen Lithium-Ionen Akku
anschliessen der hat voll aufgeladen 3,7V, jetzt will ich mit dem ADC
feststellen wie weit der entladen ist. Die Spannung greif ich ueber
einen Spannungsteiler 2*10k ab, so das ich als abgegriffene Spannung
3,7V/2 haben sollte.
Da ich den Akku bis jetzt noch nicht da hab, hab ich 5V Versorgung
genommen, auch uebers Spannungsteiler 2*10k, sollten 2,5V rauskommen,
kommen auch, das mit der ADC Formel: ADC=2,5*1024/3,3=775 sollten
angezeigt werden.
Wie gesagt wird aber nicht?
Gruß
Daniel
Daniel wrote:
> Jetzt bin ich ein bisschen verwirrt, also die Routine ist der im> GCC-Tutorial nachempfunden, da steht das so drin,
Nein, dort wird auf die Dummy-Messung gewartet.
Du solltest als erstes mal nachmessen, welche Spannungen du denn
tatsächlich an Vref und am ADC-Eingang hast.
>Hab ich jetzt einen Denkfehler oder stimmt was mit dem ADC nicht?
Ich habe schonmal einen Mega32 mit zerschossenenm ADC-Eingang, der
direkt an 5V 200mA gezogen hat. Der würde dir natürlich die
Eingangspannung vom Spannungsteiler in den Keller ziehen. Das sollte
sich aber schnell nachmessen lassen.
Der ADC selber hat dabei immer noch richtig gemessen, ohne Vorwiderstand
stimmte alles. Nur der Stromverbrauch war dann etwas hoch :-)
Oliver
> Jetzt bin ich ein bisschen verwirrt, also die Routine ist der im> GCC-Tutorial nachempfunden, da steht das so drin,
Wie schon geschrieben wurde, steht da was anderes.
Der Kommentar in deiner Version
1
//ADC einmal starten um Dummy zu lesen, sonst passiert nix
ist auf jeden Fall verkehrt. Der dummy-read ist ein ganz normlaes
Auslesen des ADC's, es kann nur vorkommen, daß der erste gelesene Wert
nach einer bestimmten Aktion fehlerhaft ist. Insofern musst du da auch
ganz normal auf das Ende der Konversion warten.
Welche Aktionen zu fehlerhaften Werten führen, steht im Datenblatt. Ob
gewollt oder nicht, unterscheiden sich die Datenblätter der
verschiedenen AVR's da etwas. Das des Mega32 lese ich so, daß in deinem
Fall kein dummy-Read erforderlich ist. Solange kein
timimg-Problemcauftritt, schadet der dummy-read natürlich nicht.
Oliver
also danke das mit dem dummy-Read hab ich verbessert,
so hab dann mal an Vref und ADC-Eingang gemessen:
Vref=3,29V
Vadc=2,49V
sollten nach Formel: 779 geben, krieg aber jetzt 450 ohne Pullup.
Hmmm
Wie sieht dein Programm jetzt aus?
Kannst du mal ein Poti an den ADC Eingang hängen, den ADC kontinuierlich
in einer Schleife auslesen (und natürlich den Wert anzeigen) und mal
nachsehen, ob sich der Wert mit Drehen am Poti verändern lässt?
Ein Li-Ion Akku hat voll aufgeladen eine Spannung von 4,2 V pro Zelle.
Und an AVCC muss die selbe Spannung liegen wie an den restichen VCC
pins.
Michael
Sorry Leute, ich muss mich entschuldigen, ich bin manchmal so ein Depp,
ich hab es leider voll verrissen, Es war der falsche Pin^^ Ich hin gar
nicht an PORTA.0 sondern an 7. Bin da auch nicht draufgekommen weil an
der A.0 auch was hing, na gut danke fuer die zahlreichen Tipps und sorry
bezueglich meiner Bloedheit
Gruß
Daniel