- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 6 von 6

Thema: STM32F4 NaN ohne erkennbaren Fehler

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578

    STM32F4 NaN ohne erkennbaren Fehler

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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:

    Code:
        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

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Im Wikipedia-Artikel stehen die verschiedenen Bedingungen für NaN beschrieben.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    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
    Code:
    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

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    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

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    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.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    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

Ähnliche Themen

  1. VHDL - Fehlermeldung ohne Fehler?
    Von robo_tom_24 im Forum Software, Algorithmen und KI
    Antworten: 8
    Letzter Beitrag: 27.02.2013, 09:58
  2. [ERLEDIGT] Welchen Typ von Vias nimmt nan für Platinen runde oder eckige ?
    Von Ritchie im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 2
    Letzter Beitrag: 22.02.2013, 12:41
  3. LCD Libary für STM32F4
    Von Stones im Forum Software, Algorithmen und KI
    Antworten: 3
    Letzter Beitrag: 13.07.2012, 13:55
  4. ATMega8 wird heiss (ohne erkennbaren Grund)
    Von Jaecko im Forum AVR Hardwarethemen
    Antworten: 15
    Letzter Beitrag: 07.03.2007, 16:24
  5. Target-Fehler: Power ohne Supply
    Von OnkelTobi im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 1
    Letzter Beitrag: 15.09.2006, 00:42

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress