Forum: Mikrocontroller und Digitale Elektronik Winkel über Poti und ADC. ADC stimmt, aber Winkel nicht


von Timo B. (shortcircuit)


Lesenswert?

Hey,

ich lese über einen Poti einen ADC Wert aus (0...1024), was auch ohne 
Probleme klappt. Aber sobald ich folge Formel anwende, erhalte ich nur 
widersprüchliche Ergebnisse:
1
const short POTI_MAX_ANGLE = 270;
2
short CurrentLeverAngle;
3
short angleOffset  = -135;
4
uint16_t adc;
5
6
CurrentLeverAngle = (short)(10 * (POTI_MAX_ANGLE * adc / 1024.0 + angleOffset));
Die gerechneten Winkel sind immer negativ und am einen Anschlag habe 
-121,3° und am Anderen -135°. Dazwischen geht es mal hoch auf ca. -90° 
und dann fällt es wieder.
Muss ich noch was bezüglich Typenkonvertierung beachten? Die Formel 
stimmt, hab ich getestet

von Easylife (Gast)


Lesenswert?

die berechnung passt nicht in den short. nimm int (32 bit)

von Timo B. (shortcircuit)


Lesenswert?

oh mann. Ja klar bei POTI_MAX_ANGLE * adc. Hab ich nicht beachtet.
1
CurrentLeverAngle = (short)(10 * ((int32_t)POTI_MAX_ANGLE * adc / 1024.0 + angleOffset));
So gehts.

Vielen Dank

von eProfi (Gast)


Lesenswert?

Die Float-Berechnung ( /1024.0) kannst Du sparen, indem Du das 10* mit 
in die Klammer nimmst:
CurrentLeverAngle = 10L  POTI_MAX_ANGLE  adc / 1024 + angleOffset;

Das (short) brauchst Du nicht, weil es automatisch gemacht wird 
(CuLeAngle ist short).
Das (int32_t) wird durch das 10L erledigt.
Das /1024 wird durch einfaches Schieben berechnet.

Was passiert mit dem Wert danach?
Dezimalrechnung nutzt nur einen Teil des darstellbaren Wertebereiches.
Deshalb so weit es geht binär / hex weiterrechnen.

von eProfi (Gast)


Lesenswert?

Das doppelte Malzeichen wurde durch Fettschrift ersetzt.
1
CurrentLeverAngle = 10L * POTI_MAX_ANGLE * adc / 1024 + angleOffset;

von Walter (Gast)


Lesenswert?

eProfi schrieb:
> CurrentLeverAngle = 10L  POTI_MAX_ANGLE  adc / 1024 + angleOffset;

der TO wollte das eigentlich so:
CurrentLeverAngle = 10L * (POTI_MAX_ANGLE * adc / 1024 + angleOffset);

ist aber etwas sinnfrei, das Ergebnis springt dann in 10er Schritten,
Ich würde die 10 in POTI_MAX_ANGLE und angleOffset reinziehen um eine 
genauere Berechnung zu erreichen

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.