ich versuche eine Spannung zumessen und einen Strom mithilfe des ADC im
ATmega8.
Die schaltung um strom zu messen ist Diese hier:
http://www.mikrocontroller.net/articles/Operationsverst%C3%A4rker-Grundschaltungen
Verstärkergrundschaltungen
[Bearbeiten] Grundbeschaltung mit Berechnung Bild b
Mein zumessender strom beträgt 3Ampere
Die ADC-Routiene hab ich vom Tutorial hier,
nun ist meine Frage wie reche ich die Spannung vom OPV in einen
Stromwert um und gebe sie dann auf die uart aus
1
/* ADC initialisieren */
2
voidADC_Init(void){
3
4
uint16_tresult;
5
uint16_tampere;
6
uint16_tvolt;
7
8
9
ADMUX=(0<<REFS1)|(1<<REFS0);
10
11
// Bit ADFR ("free running") in ADCSRA steht beim Einschalten
12
// schon auf 0, also single conversion
13
ADCSRA=(1<<ADPS1)|(1<<ADPS0);// Frequenzvorteiler
14
ADCSRA|=(1<<ADEN);// ADC aktivieren
15
16
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
17
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
18
19
ADCSRA|=(1<<ADSC);// eine ADC-Wandlung
20
while(ADCSRA&(1<<ADSC)){// auf Abschluss der Konvertierung warten
21
}
22
/* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
23
Wandlung nicht übernommen. */
24
result=ADCW;
25
}
26
27
/* ADC Einzelmessung */
28
uint16_tADC_Read(uint8_tchannel)
29
{
30
// Kanal waehlen, ohne andere Bits zu beeinflußen
31
ADMUX=(ADMUX&~(0x1F))|(channel&0x1F);
32
ADCSRA|=(1<<ADSC);// eine Wandlung "single conversion"
33
while(ADCSRA&(1<<ADSC)){// auf Abschluss der Konvertierung warten
Um den Strom zu messen, der durch ein Bauteil fliesst, musst du die
Spannung vor dem Bauteil und die Spannung hinter dem Bauteil messen. Die
Spannungsdifferenz, zusammen mit dem Ohmschen Gesetz und dem bekannten
Innenwiderstand des Bauteils ergibt dann den Strom, der durch das
Bauteil fliesst.
(die 2.te Spannung kann natürlich auch 0 sein, wenn das Bauteil direkt
an Masse hängt. Dann brauchst du nur U = R * I )
Rainer schrieb:> Vielleicht kann mir jemand behilflich sein um den Strom auszugeben.
Was ist denn dein konkretes Problem? Wo haperts denn?
Grundsätzlich sieht das ja nicht so dumm aus. Bis auf das, dass deine
Variable ganz oben 'ampere' heißt, du aber unten das Rechenergebnis
einer Variablen 'Strom' (mit großem S) zuweisen möchtest, die Ausgabe
dann aber von einer Variablen 'strom' (mit kleinem s) machst. Einige
dich auf einen Variablennamen und benutze den dann auch.
PS:
Ändere deinen Formatspezifizierer zu %2d.%03d
dann kriegst du im 'Nachkommaanteil' auch führende 0-en
spannung=((long)adcval*1000)/1024;// A/D-Wert in Spannung umrechnen (AREF=5V, 10 Bit A/D-Wandler:
Wenn du da aber eine richtige Spannung in Volt haben willst, dann
solltest du aber mit 5000 multiplizieren. Denn "Vollausschlag" vom ADC
bedeutet ja 5V oder eben 5000mV
Und noch ein PS:
Das wird jetzt geschätzt bei dir nicht den großen Unterschied machen,
aber du solltest trotzdem beides, die Spannung und den Strom, von ein
und derselben Messung ausrechnen. dh. Messung machen. Daraus die
Spannung ausrechnen und aus derselben Messung den zu dieser Spannung
gehörenden Strom ausrechnen. Den theoretisch könnte sich der
entsprechende Wert ja zwischen 2 Messungen ja auch signifikant
verändern. Bei dir ist aber der angezeigte 'Strom' ja nur eine andere
Anzeigeform deiner 'Spannung'. Die beiden gehören zusammen.
Erstmal vielen Dank für ihre antwort,
Das mit den Variablen Name da ist mir hier ein kleiner Fehler beim
erstellen unterlaufen.
Ich werde dann nur eine messung machen.
Mein problem ist derzeit wie ich den Stromwert richtig angezeigt bekomme
ob meine rechnung für den strom überhaubt richtig ist,
Das ist ein problem
Mfg
Rainer schrieb:> Mein problem ist derzeit wie ich den Stromwert richtig angezeigt bekomme
Was heißt 'richtig angezeigt'?
Kommt denn über die UART eine Ausgabe aufs Terminal?
> ob meine rechnung für den strom überhaubt richtig ist,> Das ist ein problem
Echt?
10 Äpfel kosten 23 Euro
wieviel kosten 8 Äpfel?
1024 entsprechen 5000mV entsprechen 3000 mA
adcval entspricht y mV entsprechen x mA
----------------------------------
3000 * adcval
x = ---------------
1024
(direkter Dreisatz: Merkregel: Zahl über x, mal Stumpf, durch Spitz)
würde mal sagen: Das ist korrekt.
Ausserdem muss dir das ja auch deine Ausgabe bestätigen.
Lass einen (bekannten) STrom fliessen und miss ihn.
Mit dem Voltmeter misst du am ADC Pin nach, welche Spannung das
Voltmeter feststellt. Dann schaust du auf deine Anzeige:
Dort muss dieselbe SPannung auftauchen wie am Voltmeter
Und wenn dort diese Spannung auftaucht und es tatsächlich so ist,
dass 5V den 3 Ampere entsprechen, dann muss die in Ampere
umgerechnete Spannungsangabe dann auch dem bekannten Strom
entsprechen, der tatsächlich fliesst.
bischen mehr Selbstvertrauen! Das ist doch soweit alles in Ordnung im
Programm (bis auf den Patzer in den Volt). Jetzt musst du nur noch
lernen, wie man sich selber Testszenarien ausdenkt. Leg 5V an den ADC
und auf deiner ANzeige muss 5.000V stehen (fast) bzw. 3.000A (auch
wieder: fast). Dann machst du 2.5V an den ADC Eingang (Poti als
SPannungsteiler) und auf der Anzeige muss wieder 2.5V stehen bzw. 1.5A
Ähm.
In deinem ersten Beispiel fällt mir was auf.
Du versuchst zwar über die UART auszugeben. Du initialisierst die UART
aber nirgends.
Das geht natürlich nicht. Du musst schon auch eine funktionierende UART
haben!