Forum: Mikrocontroller und Digitale Elektronik Mehrere Spannungen messen Mega32


von Phil (Gast)


Lesenswert?

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_t adcval;
2
  uint16_t voltage;
3
  
4
  
5
  while(1)
6
    {
7
        adcval = ADC_Read_Avg(0, 10);  // Kanal 0, Mittelwert aus 10 Messungen
8
      
9
    set_cursor(0,3);
10
    char Out[100];
11
    sprintf( Out,"ADC: %4u V:%d,%03d V",adcval, (5*adcval) /1000, ((5*adcval)) % 1000);
12
  
13
    lcd_string( Out );
14
    
15
    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

von Bastler (Gast)


Lesenswert?

Ändere doch die Referenzspannung.
Es gibt nicht umsonst "krumme" Werte wie 2,56V oder 4,096V...

von Justus S. (jussa)


Lesenswert?

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...

von Karl H. (kbuchegg)


Lesenswert?

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.

von Phil (Gast)


Lesenswert?

Ja Hervoragend jetzt habe ich es glaube ich verstanden.
1
//Zweistellige Ausgabe
2
        adcval = ADC_Read_Avg(0, 10);  // Kanal 0, Mittelwert aus 10 Messungen
3
    voltage = adcval * 5 * 100L / 1024;  
4
    
5
    set_cursor(0,3);
6
    char Out[100];
7
    sprintf( Out,"ADC: %4u V:%d,%02d V",adcval, voltage / 100, voltage % 100 );
8
    lcd_string( Out );
9
    
10
    //Dreistellige Ausgabe
11
    adcval = ADC_Read_Avg(1, 10);  // Kanal 1, Mittelwert aus 10 Messungen
12
    voltage = adcval * 5 * 1000L / 1024;    
13
    
14
    set_cursor(0,4);
15
    sprintf( Out,"ADC: %4u V:%d,%03d V",adcval, voltage / 1000, voltage % 1000 );
16
    lcd_string( Out );
17
    
18
    _delay_ms(500);


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

von troll (Gast)


Lesenswert?

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...

von Wusel D. (stefanfrings_de)


Lesenswert?

Man könnte die Spannungen mit Spannungsteilern auf ein Zehntel 
reduzieren und mit OP-Amps 2,5V addieren.

von Phil (Gast)


Angehängte Dateien:

Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.