Forum: Mikrocontroller und Digitale Elektronik Wie auf Float verzichten?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Stm M. (stmfresser)


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

: Bearbeitet durch User
von Mampf F. (mampf) Benutzerseite


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

von Jim M. (turboj)


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

von Stm M. (stmfresser)


Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank.

Ich hab in meinem Leichtsinn davon ausgegangen dass der Überlauf nicht 
gleich auftritt. ^^

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]
  • [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.