Wie auf Float verzichten?

OP #5032356
Hallo,

ich programmiere einen STM32F103C Mikrocontroller. Ich habe eine ISR 
Funktion, die mit 60µs Takt aufgerufen wird. Da der STM32F1 keinen FPU 
hat, möchte ich die paar Gleitkomma Berechnungen mit Shifts realisieren, 
klappt leider nicht.


Die Implementierung mit Float:
1
volatile float angle_vel_L = 0.0f;
2
void angleEstimate_L(void) {
3
  float angle_pL = angle_L + angle_vel_L * 0.000064f;
4

5
  float measured_angle_L = (float) ((hallCounterL << 6) - (hallCounterL << 2));
6

7
  float errAngle_L = measured_angle_L - angle_pL;
8
  angle_L = angle_pL + 0.03340962f * errAngle_L;
9
  angle_vel_L += 0.05676238f * errAngle_L;
10

11
}


mit Integer:
1
#define SCALE 28
2

3
volatile int angle_L = 0;
4
volatile int angle_vel_L = 0;
5
void angleEstimate_L(void) {
6
  int angle_pL = angle_L + (angle_vel_L >> 14);
7
  int measured_angle_L = ((hallCounterL << 6) - (hallCounterL << 2)) << SCALE;
8

9
  int errAngle_L = measured_angle_L - angle_pL;
10
  angle_L = angle_pL + (errAngle_L >> 5);
11
  angle_vel_L += (errAngle_L >> 4);
12

13
}
14

15
int getAngle(void) {
16
    return angle_L >> SCALE;
17
}

Weiß jemand vielleicht wo der Fehler liegt.

Vielen Dank im Voraus.
Persönliche Seite #5032362
Hmm, das mit dem Schieben erscheint mir seltsam ...

Normalerweise einigt man sich (mit sich selbst^^) auf die Anzahl der 
Bits von Vor- und Nachkomma.

Bei 32Bit beispielsweise 24.8

Dann konvertiert man die Konstanten zB 0.000064 * 2^8 und stellt fest, 
dass das schon mal nicht ausreicht ;-)

Bei dir waren 28Bit Vorkomma? Dann blieben 4Bit Nachkomma übrig ...

Also kein Wunder, dass das nicht funktioniert.

Nächster Versuch: 16.16 ... 0.000064 * 65536 = 4,19 ...

Das ginge gerade so ...
#5032370
Stm M. schrieb:

> #define SCALE 28
> [...]
> int measured_angle_L = ((hallCounterL << 6) - (hallCounterL << 2)) <<
> SCALE;


Bis Du Dir sicher dass Du da innerhalb der 31 Bits (Vorzeichen!) 
bleibst? Sieht für mich nämlich nicht danach aus. Und: Der Überlauf ins 
Vorzeichenbit ist in C nicht definiert.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.