Hallo Liebe Leute,
von einem Beschleunigungssensor wollte ich den Winkel ausrechnen.
Ich messe über ADC1 ADC2 die 2 Beschleunigungen und weise diese an atan2
zu.
1
2
floataX=(float)ADC_GetConversionValue(ADC1);
3
floataZ=(float)ADC_GetConversionValue(ADC2);
4
5
printf("aX: %f \n",aX);
6
printf("aZ: %f \n",aZ);
7
8
/*bis hier funktioniert problemlos*/
9
10
floatwinkel=(float)atan2(aZ,aX);
/* hier wenn ich aZ, aX als Variable zuweise rechnet atan2 weiter nicht
mehr. arm-none-eabi kompiliert ohne problem. wenn ich das elf datei auf
controller lade, passiert im µcontroller leider nichts, als würde alles
stehen bleiben. */
1
floatwinkel=(float)atan2(10,10);
/* wenn ich da oben so als variable 10 zuweise, funktioniert ganz gut.
*/
was habe ich falsch gemacht.
Entschuldigung für mein fehlerhaftes Deutsch.
Verwende mal die float-Version "atan2f" anstelle der double-Version
"atan2", da deine Eingabe und Ausgabewerte onehin float sind und die FPU
außerdem nur "float" kann, aber nicht "double".
so eine Fehlermeldung kriege ich. atan2 gab es diese nicht.
warning: incompatible implicit declaration of built-in function 'atan2f'
[enabled by default]
Dr. Sommer schrieb:> Verwende mal die float-Version "atan2f" anstelle der double-Version> "atan2", da deine Eingabe und Ausgabewerte onehin float sind und die FPU> außerdem nur "float" kann, aber nicht "double".
achso, warum double aus mysteriösen Gründen nicht funktionierte.
Li Wang schrieb:> das hier ist der ausgabe vom makefile
Füge mal noch -std=c99 zu den Flags hinzu. Eigentlich sollte es die
Funktion geben:
http://en.cppreference.com/w/c/numeric/math/atan2
Bei mir funktioniert das auch mit dem gcc-arm-embedded.
Li Wang schrieb:> achso, warum double aus mysteriösen Gründen nicht funktionierte.
Funktionieren schon, aber sehr ineffizient da die CPU nur
single-precision-float (32bit) unterstützt, du aber die
double-precision-float (64bit) Funktion aufrufst, die dann alles in
Software, ohne FPU, rechnen muss.
main.c:174:5: warning: implicit declaration of function 'atan2f'
[-Wimplicit-function-declaration]
main.c:174:19: warning: incompatible implicit declaration of built-in
function 'atan2f' [enabled by default]
main.c: In function 'SerialEmpfangen':
main.c:191:9: warning: implicit declaration of function 'PrintChar'
[-Wimplicit-function-declaration]
arm-none-eabi-objcopy -O ihex prog.elf prog.hex
jetzt funktioniert nicht mal usart. :(
Dr. Sommer schrieb:> Li Wang schrieb:>> jetzt funktioniert nicht mal usart. :(> Dir fehlen ziemlich sicher ein paar #include Anweisungen...
wenn ich -std=c99 Flag entferne geht usart
Li Wang schrieb:> wenn ich -std=c99 Flag entferne geht usart
Wohl weil C dann weniger streng ist. Füge die fehlenden #include
Anweisungen in deinem Quellcode hinzu.
Li Wang schrieb:> funktioniert immer noch nicht> hab allerdings nötige headers schon inkludiert
Dann machst du was falsch. Zeige den aktuellen Code und die komplette
aktuelle Ausgabe von "make".
Das kann nicht der richtige Code sein. Diese Datei hat keine Zeile 175
(wegen *main.c:175:5:* warning: implicit declaration of function
'atan2f').
Der Code funktioniert bei mir mit -std=c99 und ohne.
Li Wang schrieb:> ich glaube es liegt evtl. bei fpu configuration
Die hat keinen Einfluss auf den Compiler.
ich habe im makefile "-mfloat-abi=softfp" mit hard fpu getauscht
geschrieben.
es geht mit warnung aber hauptsache es funktioniert. danke Herr Dr.
Sommer! :)
Li Wang schrieb:> aber warum das so ist, würde ich sehr gerne wissen.
Wenn du den tatsächlichen *vollständigen* Code und die dazugehörigen
make-Ausgabe zeigen würdest (als Anhang!), könne man das vielleicht
sagen.
Die Messwerte das du von sensoren bekommst sind normal doch integer ?
Versuche mal Ax und Ay als integer zu deklarieren. Vermutlich akzeptiert
atan2() nur integers. Bei mir funtioniert das so problemlos (discovery
stm32F100).
RP6conrad schrieb:> Versuche mal Ax und Ay als integer zu deklarieren. Vermutlich akzeptiert> atan2() nur integers.
Quatsch. Wie gesagt ist atan2 für double und atan2f für float. Ax und Ay
als integer zu deklarieren würde zum Genauigkeitsverlust führen da er ja
dividiert. Jetzt sehe ich aber gerade dass er die Division komplett als
Integer rechnet, daher mal folgendermaßen abändern:
eine dumme Frage.
float a = 10.1;
float a = 10.1f;
float a = (float)101/10;
sind das alle selbe oder? welche Deklaration ist besser?
Viele Grüße aus Innsburg
Li Wang schrieb:> die warnung war deswegen da ich oben> float atan2f(float y, float x); funktionsprototyp nicht deklariert> habe. ich vergesse es oft.
Das braucht man auch seit ca. 30 Jahren nicht mehr zu machen. Du musst
nur "#include <math.h>" schreiben, denn die math.h enthält eben diesen
Funktionsprototyp. Das funktioniert so auch normalerweise...
Li Wang schrieb:> float a = 10.1;
Diese definiert einen double vom Wert 10.1 und konvertiert diesen in
einen float.
> float a = 10.1f;
Diese definiert direkt einen float mit dem Wert 10.1 und ist daher am
besten.
> float a = (float)101/10;
Das ist viel zu umständlich und fehleranfällig.
Dr. Sommer schrieb:> Li Wang schrieb:>> die warnung war deswegen da ich oben>> float atan2f(float y, float x); funktionsprototyp nicht deklariert>> habe. ich vergesse es oft.> Das braucht man auch seit ca. 30 Jahren nicht mehr zu machen. Du musst> nur "#include <math.h>" schreiben, denn die math.h enthält eben diesen> Funktionsprototyp. Das funktioniert so auch normalerweise...
math.h ist schon dabei.
ich müsste den prototyp schreiben sonst meckert der compiler
> Li Wang schrieb:>> float a = 10.1;> Diese definiert einen double vom Wert 10.1 und konvertiert diesen in> einen float.>> float a = 10.1f;> Diese definiert direkt einen float mit dem Wert 10.1 und ist daher am> besten.>> float a = (float)101/10;> Das ist viel zu umständlich und fehleranfällig.
super danke!!
Li Wang schrieb:> math.h ist schon dabei.> ich müsste den prototyp schreiben sonst meckert der compiler
Das kann gar nicht sein, das muss funktionieren. Welchen Compiler
genau verwendest du? Zeig doch mal ein komplettes Beispiel mit
komplettem Code...
Dr. Sommer schrieb:> Li Wang schrieb:>> math.h ist schon dabei.>> ich müsste den prototyp schreiben sonst meckert der compiler> Das kann gar nicht sein, das muss funktionieren. Welchen Compiler> genau verwendest du? Zeig doch mal ein komplettes Beispiel mit> komplettem Code...
summon-arm-toolchain bzw. arm-none-eabi-gcc
ich bin in c anfänger.
mein komplete Code ist zu doof und lächerlich. ich will nicht dass Ihr
vor Lachen stirbt.
Li Wang schrieb:> mein komplete Code ist zu doof und lächerlich. ich will nicht dass Ihr> vor Lachen stirbt.
Na, jeder hat so angefangen. Kürze ihn halt soweit dass das Problem noch
auftritt.
Li Wang schrieb:> summon-arm-toolchain bzw. arm-none-eabi-gcc
summon kenne ich nicht, aber mit dem gcc-arm-embedded von
https://launchpad.net/gcc-arm-embedded funktioniert es definitiv, und
sollte auch mit jedem Compiler der C99 unterstützt funktionieren...