mikrocontroller.net

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


Autor: Samuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Samuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
einen wichtigen Codeausschnitt vergessen.
Die Ermittlung von adc0_cal erfolgt wie folgt:

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


lg
Samuel

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch mal

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

Autor: Samuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
adc0_cal = (float)(ADC-WERT / 127);
->
adc0_cal = (float)ADC-WERT / 127;

Autor: Samuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Samuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Stefan Ernst

damit gehts es. Danke!

adc0_cal = (float)ADC-WERT / 127;

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DU solltest lieber durch 128 rechnen!

Autor: Samuel S. (samuel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Matthias:
ja, du hast recht...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.