PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : STM32F4 NaN ohne erkennbaren Fehler



Che Guevara
04.03.2015, 12:30
Hi,

ich habe ein kleines Problem auf meinem STM32F417VET6. Der µC läuft stabil auf 168MHz mit 3V3, programmiert wird mit EM::Blocks.
Bei folgenden Codezeilen erhalte ich manchmal ein NaN in RollAngleGyro & NickAngleGyro:



RollAngleGyro = ((RollAngleGyro+(GyroX*0.001f))*GyroInfluence) + (RollAngleAcc*AccInfluence);
NickAngleGyro = ((NickAngleGyro+(GyroY*0.001f))*GyroInfluence) + (NickAngleAcc*AccInfluence);

GyroZTmp = GyroZ * (0.001f/90.0f);
SinGyroZAngle = arm_sin_f32(GyroZTmp);
CosGyroZAngle = arm_cos_f32(GyroZTmp);

AngleTmp1 = (SinGyroZAngle*NickAngleGyro) + (CosGyroZAngle*RollAngleGyro);
AngleTmp2 = (CosGyroZAngle*NickAngleGyro) - (SinGyroZAngle*RollAngleGyro);

RollAngleGyro = AngleTmp1;
NickAngleGyro = AngleTmp2;


Ich hab mir die Werte im Debugger angesehen, alle haben die richtigen Werte bis eben auf RollAngleGyro & NickAngleGyro.
Ansonsten werden die Werte nirgends verändert, nur ausgelesen. Alle Variablen sind global als float32 definiert.

Ich hab schon einigemale dieses Verhalten beobachtet und bin langsam mit meinem Latein am Ende.
Es kommt keine Division vor, auch die Wurzel wird nicht gezogen. Was für Gründe kann ein NaN sonst noch haben?

Vielen Dank & Gruß
Chris

Sisor
04.03.2015, 18:07
Im Wikipedia-Artikel (http://de.wikipedia.org/wiki/NaN)stehen die verschiedenen Bedingungen für NaN beschrieben.

Che Guevara
06.03.2015, 09:53
Hi,

danke für die Antwort, aber das kannte ich schon. Hab mir auch schon ein paar pdfs von IEEE angesehen und nichts gefunden, was bei mir zutreffen könnte.
Allerdings hab ich nochmal nbischen debuggt und herausgefunden, dass bei


SinGyroZAngle = arm_sin_f32(GyroZTmp);

ein Wert von ca 2Pi (6.2830286) rauskommt, obwohl GyroZTmp = -7.798953E-8 und die Sinusfunktion ja eigentlich nur Werte von -1 bis 1 ausgeben sollte.
Woran könnte das den liegen?

Gruß
Chris

Wsk8
06.03.2015, 13:20
Berechnungen in einzelne Zeilen aufteilen, durchdebuggen und selbst per Hand (Taschenrechner etc.) nachrechen und mit den Ergebnissen beim debuggen vergleichen, dann siehste wo ein Fehler auftritt.

mfg

Sisor
06.03.2015, 14:11
Dein Beispiel sieht eher aus die Ausgabe der Umkehrfunktion, sprich des arcsin.
6.2830286 - 2PI = -1.567072E-4
Könnte für ne ungenauere schnelle Implementierung passen.
Das würde dann auch die Fehlermeldung erklären, da der arcsin nur für -1...1 definiert ist.

Ist aber sehr komisch.

Che Guevara
06.03.2015, 14:19
Hi,

ich denke, der Fehler (oder zumindest einer) liegt auf jeden Fall in der Sinus Funktion, den der Wert ist falsch!
Da werd ich mal ein paar Zufallsvariablen durchjagen und mal schauen, was rauskommt bzw. ob der Fehler reproduzierbar ist.
Achja, was auch noch erwähnenswert ist, dass das NaN (also der Fehler) nur manchmal auftritt, sprich ich stecke die Spannungsquelle an, entweder es ist sofort NaN oder es funktioniert. Wenns nicht funktioniert, nochmal stromlos machen, wieder anstecken und dann passts entweder oder eben nicht, dann wieder abstecken ...
Die Funktion arm_sin_f32 gehört zu der CMSIS Lib von STM, die sollte eigentlich schon funktionieren?
Im Debugger wird mir ein Array namens "SinTable_f32" angezeigt, also denke ich, die Funktion ist ne lineare Interpolation zwischen einigen LookUp Punkten.

Vielen Dank & Gruß
Chris