mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AD5933 Probleme mit Datentypen.


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich versuche zur Zeit dem AD5933 ein paar sinnige Messungen zu 
entlocken.
Die Kommunikation an sich funktioniert via I²C.

An der Weiterverarbeitung der Daten scheitert es im Moment.
#include <avr/io.h>
#include <inttypes.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include <math.h>
#include "uart.h"
#include "funktionen.h"
#include "i2cmaster.h"

int16_t   realData = 0;
int16_t   imagData = 0;
int64_t   realData2 = 0;
int64_t   imagData2 = 0;
double    magnitude =0;

//aus main
   while(1){
      if (TASTER0_Pressed){
         AD5933_GetValues();   //neue Daten für realData & imagData 

         {char Buffer[20]; itoa(realData, Buffer, 10); uart_puts(Buffer);}
         uart_puts_P(" / ");
         {char Buffer[20]; itoa(imagData, Buffer, 10); uart_puts(Buffer);}
         uart_puts_P("\n");

         realData2 = realData*realData;
         imagData2 = imagData*imagData;
         {char Buffer[20]; ltoa(realData2, Buffer, 10); uart_puts(Buffer);}
         uart_puts_P(" / ");
         {char Buffer[20]; ltoa(imagData2, Buffer, 10); uart_puts(Buffer);}
         uart_puts_P("\n");

         uart_puts_P("magnitude: ");
         magnitude = sqrt((realData2)+(imagData2));
         {char Buffer[30]; dtostrf(magnitude, 20, 4, Buffer); uart_puts(Buffer);}
         uart_puts_P("\n\n");

         _delay_ms(20);
   }


Die Daten aus "AD5933_GetValues()" sind offensichtlich korrekt.
Ich habe eine Excel Tabelle mit der ich alle nachfolgenden Berechnungen 
korrekt durchführen konnte.
Nur diese Rechnungen auf dem 8Biter zu realisiern ist mein Problem 
inklusive der richtigen Datentypen.

Es wäre super wenn mir jemand den Wink mit dem Zaunpfahl geben könnte.
Ich nutze im Moment AVR Studio 4.18 mit WinAVR-20100110

Werte für realData & imagData können sollten bis +-20000 verarbeitet 
werden.

Die Ausgabe im Terminal sieht bei dem code von oben so aus:
-56 / -71<\n>
3136 / 5041<\n>
magnitude:              90.4268<\n>
<\n>
24 / 12<\n>
576 / 144<\n>
magnitude:              26.8328<\n>
<\n>
4289 / -4690<\n>
-20095 / -23996<\n>
magnitude:                  NAN

Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Leider hast du den Datentyp double nicht beim avr-gcc der ist nur single 
oder float, sprich 32bit insgesamt.

Autor: Motlib (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei der Multiplikation hier rechnest Du mit 16 bit Werten, bevor das 
Ergebnis in einen int64_t geschrieben wird. Daher kommt es in deinem 
letzten Beispiel zum Überlauf an dieser Stelle:
realData2 = realData*realData;
imagData2 = imagData*imagData

Du must vor der Multiplikation die Operanden auf 64 bit casten (genau 
genommen mindestens einen der beiden):
realData2 = ((int64_t)realData) * ((int64_t)realData);

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.