Guten Morgen zusammen,
Ich würde gerne 6 Spannungen messen. Genauigkeit kann bei +-0,3 oder
sogar +-0,5 Volt liegen
Im Grunde möchte ich nämlich nur wissen. Ist diese Spannung an der
richtigen! Position vorhanden. Es soll ein Versorgungsspannungscheck
werden.
Ich müsste +6,+12,+24 und-6,-12,-24 Volt messen.
Ich hatte mir das "einfach" gedacht das ich 6 ADC Eingänge das Megas
nutze.
Desweiteren könnten natürlich Spannungen vertauscht sein.
Aber das erst mal zur Hardware.
Meine erste Frage bezieht sich auf die Software. Die ADCs laufen im
10-Bit betrieb und das kann ich mir auch ordentlich auf einem LCD
anzeigen lassen
habe einfach ein Poti an 5V und Masse gehangen und mit dem Schleifer auf
den ADC Eingang. und ich bekomme so auch 0-1023 Zustände angezeigt.
nun würde ich aber auch gerne die Spannung auf dem Display sehen.
Dazu habe ich folgendes Software geschrieben:
1
uint16_tadcval;
2
uint16_tvoltage;
3
4
5
while(1)
6
{
7
adcval=ADC_Read_Avg(0,10);// Kanal 0, Mittelwert aus 10 Messungen
adcval=ADC_Read_Avg(1,10);// Kanal 1, Mittelwert aus 10 Messungen
16
17
set_cursor(0,4);
18
sprintf(Out,"ADC: %u ",adcval);
19
lcd_string(Out);
20
21
_delay_ms(500);
22
}
23
}
Aber die umwandlung ist doch garnicht so leicht. Wenn ich das so
schreibe Funktioniert es theoretisch ich bekomme dann für 0 bis 1023
Zustände eine Spannung von 0,000V bis 5,115 V angezeigt.
Die Spannung stimmt natürlich nicht weil ich ja keine 5mv pro Zustand
habe sondern nur 5V/1024 = 4,88 mV pro Zustand.
Meine Frage
Aber mit Kommazahlen wollte ich auf dem kleinen uC nicht rechnen. Gibt
es eine elegantere Lösung auf die 4,88 mV in der Ausgabe zu kommen ?
Und 3 stellen hinter dem Komma sind unötig für mich. Eine bis 2 reichen
vollkommen.
mit dem einfachen versuch ((5*adcval)) % 100) Modulo 100 und %02d V hat
es nicht geklappt da stimmt der Spannungswert überhaupt nicht mehr so
als wenn er eine null verschlucken würde.
Ich hoffe jemand kann mir weiter helfen.
Danke
Euer Phil
aber wenn dich die eigentliche Werte gar nicht interessieren, warum dann
umrechnen? Mach es doch in die anderen Richtung, rechne die +-6,12,24V
in ADC-Einheiten um und vergleiche diese dann mit den Messwerten...
Phil schrieb:> Aber die umwandlung ist doch garnicht so leicht. Wenn ich das so> schreibe Funktioniert es theoretisch ich bekomme dann für 0 bis 1023> Zustände eine Spannung von 0,000V bis 5,115 V angezeigt.>> Die Spannung stimmt natürlich nicht weil ich ja keine 5mv pro Zustand> habe sondern nur 5V/1024 = 4,88 mV pro Zustand.>> Meine Frage> Aber mit Kommazahlen wollte ich auf dem kleinen uC nicht rechnen. Gibt> es eine elegantere Lösung auf die 4,88 mV in der Ausgabe zu kommen ?
1) warum nicht?
dem µC ist es egal, ob er Däumchen dreht, oder ob er was rechnet.
Und für Flah-Speicher, den du nicht benutzt, kriegst du kein Geld
zurück. Dein Mega32 hat 32Kb Flash Speicher zur Verfügung, von
dem du zum jetzigen Zeitpunkt gerade mal ein paar 100 Bytes
belegst.
2) rechne dir doch erst mal sie Spannung selber aus. Allerdings nicht
in Volt sondern in Millivolt.
Dein ADC hat 1024 Stufen und die Referenzspannung war 5V.
Also entspricht ein ADC Wert von 'adcval' einer Spannung
von
1
volt = adcvalue * 5 / 1024;
da aber Millivolt angepeilt sind, möchtest du das 1000-fache
davon haben. Also
1
volt = adcvalue * 5 * 1000L / 1024;
jetzt hast du also die Spannung in Millivolt vorliegen.
Eine Spannung von 3.870 Volt würde dir eine Zahl von 3870
liefern. Und du kannst du dann wieder getrennt nach Vorkomma
und Nachkomma wie gehabt ausgeben.
> Und 3 stellen hinter dem Komma sind unötig für mich. Eine bis 2 reichen> vollkommen.
Na dann rechnest du dir die Spannung eben nicht in Millivolt aus,
sondern in "Hunderter-Volt". Eine Spannung von 3.870V soll dann ein
Ergebnis von 387 bringen. Anstatt * 1000, rechnest du eben nur mal 100
1
volt = adcvalue * 5 * 100L / 1024;
> mit dem einfachen versuch ((5*adcval)) % 100) Modulo 100 und %02d V hat> es nicht geklappt da stimmt der Spannungswert überhaupt nicht mehr so> als wenn er eine null verschlucken würde.
Trenne die Dinge!
Das eine ist die Umrechnung des ADC WErtes in eine Spannung. Das andere
ist dann das Zerlegen dieses Ergebnisses, so dass du es wie gewünscht
anzeigen kannst. Die Sache mit dem % und der / dient dazu ein Ergebnis
wie 387 so aufzubereiten, dass an der Anzeige nicht 387 sondern 3,87
steht. Das ist aber eine ganz andere Baustelle.
Dankeschön. Jetzt widme ich mal der Hardwäre zum messen der 6
Spannungen. Da könnten eventuell auch noch ein paar fragen kommen :)
Aber erst versuche ich es selber
Phil schrieb:> Ich müsste +6,+12,+24 und-6,-12,-24 Volt messen.> Ich hatte mir das "einfach" gedacht das ich 6 ADC Eingänge das Megas> nutze.
Naja, einfach ist relativ, 24V am mega32 würden für magischen Rauch
sorgen... Das ist noch recht einfach zu lösen (Spannungsteiler+Z-Diode),
aber die negativen Spannungen... Haben die die gleiche Masse wie die
Positiven?
> Desweiteren könnten natürlich Spannungen vertauscht sein.
D.h. jeder Eingang muss mit jeder Spannung zurecht kommen bzw. darf
zumindestens nicht abrauchen. Hm...
Guten Morgen,
Ja aber ich wollte das nochmal vor Augen haben und mir aufmalen.
Vorallem muss der ADC geschützt sein wenn man eine Spannung mal
vertauscht.
So hätte ich mir das Vorgestellt.
Schöne Grüße
Phil schrieb:> Aber mit Kommazahlen wollte ich auf dem kleinen uC nicht rechnen.
Warum nicht?
Der rechnet 1000-mal schneller als Du ablesen kannst.
Die float-Lib braucht einmalig 1kB, also ab ATtiny24 (2kB) ist genug
Flash vorhanden.
Leg die Spannungsteiler auf +/-30V aus, das sollte reichen.