Forum: Mikrocontroller und Digitale Elektronik ADC Messen und Spannung ausgeben


von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Servus,

ich arbeite mich in das Thema uC Programmierung in C ein und sieht 
soweit nicht schlecht aus. Ich komme nur bei dem Thema Rechnen mit 
Kommazahlen nicht zu recht.

Ziel: Batteriespannung messen und mit 12.3V vergleichen. Die 
Eingangsschaltung sieht aus wie im Anhang.

Status: Ich lese erfolgreiche den ADC Wert raus. Jedoch stimmt was nicht 
an meiner Formel.

float     Voltage;
uint16_t  Voltage16;

Voltage16 = ADC_Read_Avg(0,10) //Kanal 0, 10x auslesen und durch 10
Voltage = (float)((Voltage16*(5/1024))*6.6);

if (Voltage < 12.3){
    SET_OUT1;
}

Egal welche Spannung ich anlege auch 20V der Output wird immer gesetzt, 
d.h. Voltage ist immer grösser 12.3V.
Kann mir einer sagen was ich falsch mache?

Gruss Thomas

von Norbert (Gast)


Lesenswert?

Versuch' mal 5.0/1024.0 und berichte.

von Thomas (Gast)


Lesenswert?

ne oder? So einfach? Es funktioniert!

von as (Gast)


Lesenswert?

Hey,
wofür ist dieses *6,6  gut?

von lt1014 (Gast)


Lesenswert?

as schrieb:
> Hey,
> wofür ist dieses *6,6  gut?

Wegen dem Spannungsteiler Am Eingang (1 / 6,6)

von Jim M. (turboj)


Lesenswert?

as schrieb:
> wofür ist dieses *6,6  gut?

Schau Dir mal das Verhältnis am Spannungsteiler genau an...

von Sascha (Gast)


Lesenswert?

Verhältnis ist 0,1515 und 1/0,15 ist das gleiche wie 1*6,6.

Teiler: R2/R1+R2

Ergibt 10/10+56 = 10/66 = 0,1515.

Da kann jetzt natürlich auch ein Denkfehler drin sein, wie das immer so 
ist.

von Ingo L. (corrtexx)


Lesenswert?

Warum rechnest du den Kram überhaupt in Float? Festkomma wäre sicherlich 
besser...
1
Voltage = ((uint32_t)Voltage16 * 3300)/1024;

von Sascha (Gast)


Lesenswert?

Ingo L. schrieb:
> Warum rechnest du den Kram überhaupt in Float? Festkomma wäre
> sicherlich
> besser...Voltage = ((uint32_t)Voltage16 * 3300)/1024;

Naja, jetzt weiss er wie es geht, falls er es wirklich mal braucht ;)

von Pandur S. (jetztnicht)


Lesenswert?

Naja, das Ganze geht natuerlich auch viel einfacher :

MyInt = ReadADC(); // Integer Wert zwischen 0 .. 1023

if (Myint < Irgendwas){ SET_OUT1; } else {Clear_Out1; }

Und das Irgendwas (integer) kann ich ja mit dem Taschenrechner schnell 
ausrechnen

.. Tsss .. :-)

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.