Forum: Compiler & IDEs AD beim AVR mit verschiedenen Potis - Probleme mit FLOAT


von Samuel (Gast)


Lesenswert?

Hallo zusammen,

ich möchte am ADC verschiedene Potis anschließen können.
Den Wert, den ich verarbeiten möchte soll 0 - 127 sein.
Daher muss ich ja bei jedem Wechsel des angeschlossenen Potis das ganze 
neu "kalibrieren".

Folgender Ansatz:
ich stelle einmal den Minimal und dann den Maximalwert des Potis ein.
Ich speichere bei der Kalibrierung:
1. "adc0min": den Minimalwert (falls das Poti einfach nicht auf 0 kommt)
2. "adc0cal": ich teile den Maximalwert durch 127

Die variablentypen:
float adc0cal;
int adc0min;

folgendes Codebeispiel für die Berechnung:
return = ADC-Wert  / adc0cal - adc0min;

Mein Problem ist dabei nun, das der scheinbar adc0cal nicht als Float 
behandelt sondern als integer mit berechnet. Somit stimmt return nicht 
und ich bekomme Werte deutlich über 127 zurück. Muss ich irgendetwas 
beachten, damit der AVR das verünftig berechnet?

Vielen Dank für die Hilfe,
Samuel

von Samuel (Gast)


Lesenswert?

einen wichtigen Codeausschnitt vergessen.
Die Ermittlung von adc0_cal erfolgt wie folgt:

adc0_cal = (float)(ADC-WERT / 127);


lg
Samuel

von hans (Gast)


Lesenswert?

Versuch mal

return = ADC-Wert  / (adc0cal - adc0min);

von Samuel (Gast)


Lesenswert?

momentan habe ich adc0_min komplett rausgelöscht.

Gerade habe ich versucht:
in adc0_max (vom Typ uint16_t) den maximalen Wert den das Poti erreicht 
speichern und dann:

(int)(ceil(ADC-WERT / (float)( adc0_max / 127)))


mit dem selben Ergebnis...

von Stefan E. (sternst)


Lesenswert?

adc0_cal = (float)(ADC-WERT / 127);
->
adc0_cal = (float)ADC-WERT / 127;

von Samuel (Gast)


Lesenswert?

neuer Versuch:
ich habe den Wert für adc0_cal manuell berechnet und hart in den Code 
eingetragen. Das funktioniert wie gewünscht:

return = (ceil(ADC-WERT / 7.3149606)));

warum geht meine Float Variable adc0_cal nicht, bzw. wo läuft es falsch.
Schon beim Ermitteln von adc0_cal, beim Speichern, beim weiterberechnen.
Ich habe ja inzwischen versucht alles zu casten, ohne Erfolg.

Sammy

von Samuel (Gast)


Lesenswert?

@Stefan Ernst

damit gehts es. Danke!

adc0_cal = (float)ADC-WERT / 127;

von Matthias L. (Gast)


Lesenswert?

DU solltest lieber durch 128 rechnen!

von Samuel S. (samuel)


Lesenswert?

@Matthias:
ja, du hast recht...

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.