Forum: Mikrocontroller und Digitale Elektronik Microchip PIC24 cos() function


von Simon (Gast)


Lesenswert?

1
    #include <math.h>
2
3
    float f;
4
    f = 356.1398;
5
    f = cos(f);

Wieso kommt hierbei -0.4177479 raus und nicht die erwarteten 0.997 ?

von Anton (Gast)


Lesenswert?

Simon schrieb:
> #include <math.h>
>
>     float f;
>     f = 356.1398;
>     f = cos(f);
>
> Wieso kommt hierbei -0.4177479 raus und nicht die erwarteten 0.997 ?

Weil es das korrekte Ergebnis ist.  Stichwort: Bogenmaß.

von Stefan L (Gast)


Lesenswert?

Das Ergebnis ist korrekt. sin und cos erwarten ein Winkel in rad, nicht 
in °. Du musst also den Winkel zunächst umrechnen.

von Peter II (Gast)


Lesenswert?

Simon schrieb:
> Wieso kommt hierbei -0.4177479 raus und nicht die erwarteten 0.997 ?

weil Computer allgemein nicht mit grad sondern mit radians arbeiten.

von Simon (Gast)


Lesenswert?

Gibt es da ein einfachen weg um das umzurechnen?

Folgendes soll berechnet werden:
Vielleicht das man das irgendwie auch optimiert und keine math.h braucht
1
    float f;
2
    word  w;
3
4
    f = 5066;  // keine Konstante
5
    f *= 0.0703;
6
    f = cos(f);
7
    w = f * 100;

von Peter II (Gast)


Lesenswert?

Simon schrieb:
> Folgendes soll berechnet werden:
> Vielleicht das man das irgendwie auch optimiert und keine math.h braucht

feste Tabelle:

f sollte auch kein float sein und in einen überschaubaren Wertebereich 
liegen.

word costab[] = {0,2,3,4,65,76,78,98,9, .... }
w = costab[f];

von BeastyK (Gast)


Lesenswert?

Moin Simon,

schau dir auch mal den Link an:

Beitrag "Winkelberechnung mit PIC"

Gruß
Beast

von Simon (Gast)


Lesenswert?

Die Multiplikation f *= 0.0703; kann ich lassen wie gewohnt?
eventuell kann man das ja aufbohren auf 703 so hat man dann ein höheren 
wert.

Nur da kommt auch ein anderes cos() ergebnis raus.

Wie funktioniert das mit der Tabelle genau? welche werte werden da 
vorher abgelegt?

von Peter II (Gast)


Lesenswert?

Simon schrieb:
> Wie funktioniert das mit der Tabelle genau? welche werte werden da
> vorher abgelegt?

sinnvoller weise die cos werte.

Das ist doch dir überlassen, es ist einfach eine Tabelle die aus einem 
wert einen anderen macht also eine Vorberechnung.

Wenn bei dir nur ein paar hundert Winkel möglich sind, dann kann man für 
diese Winkel sich einfach vorher die Daten berechnen.

von Klaus (Gast)


Lesenswert?

BeastyK schrieb:
> Moin Simon,
>
> schau dir auch mal den Link an:
>
> Beitrag "Winkelberechnung mit PIC"

Hier gehts um einen PIC24, 16 Bit 16MHz oder mehr, da macht man keine 
Klimmzüge (da war ein IBM AT viel langsamer).

MfG Klaus

von Simon (Gast)


Lesenswert?

Es geht um die Berechnung von einem versatz zwischen Spannung und strom.

also sprich dem cos(phi) im Wechselstromnetz.
Ich bekomme von einem chip den Wert geliefert.

Als 16Bit WORD, z.B. ebend 5066 und möchte das auf einen Winkel 
Umrechnen.

Ich bin mir also nicht sicher ob das mit so einer Tabelle ausreichend 
genau ist. Vorallem wie groß soll die Tabelle den sein?
Ich spare mir damit CPU leistung zu lasten von Speicher.

von Klaus (Gast)


Lesenswert?

Simon schrieb:
> Ich spare mir damit CPU leistung zu lasten von Speicher.

Für nicht benutzte CPU Takte gibt es keine Rückvergütung. Wenn es also 
gerechnet schnell genug ist, ist alles gut.

MfG Klaus

von Peter II (Gast)


Lesenswert?

Simon schrieb:
> Als 16Bit WORD, z.B. ebend 5066 und möchte das auf einen Winkel
> Umrechnen.
und was ist der wert 5066?

> Ich spare mir damit CPU leistung zu lasten von Speicher.

genau das ist der Sinn einer Tabelle.

von Peter II (Gast)


Lesenswert?

Klaus schrieb:
> Für nicht benutzte CPU Takte gibt es keine Rückvergütung.

für nicht genutzten Flash auch nicht.

außerdem wollte er ja scheinbar nicht rechnen:
> keine math.h braucht

von Pandur S. (jetztnicht)


Lesenswert?

Die gesuchte funktion waere dann arccos. Wie genau muss es an denn sein? 
Bitte keinen 0.1 Grad Furz...

von Simon (Gast)


Lesenswert?

Also rauskommen soll ein WORD, also wenn cos phi 0.99 ist könnte ich gut 
mit
99 leben z.B.

von Peter II (Gast)


Lesenswert?

Simon schrieb:
> Also rauskommen soll ein WORD, also wenn cos phi 0.99 ist könnte ich gut
> mit
> 99 leben z.B.

99 was?

ein cos phi 0,99 sind doch keine 99Grad Phasenverschiebung.

von Simon (Gast)


Lesenswert?

Peter II schrieb:
> ein cos phi 0,99 sind doch keine 99Grad Phasenverschiebung.

Nein nein, ich hätte es nur *100 genommen um es in ein WORD ohne komma 
zu bekommen also die 99 würden 0.99 entsprechen

von Peter II (Gast)


Lesenswert?

und welchen Wert bekommst du extern rein? Wird doch wohl kein float 
sein? Wie ist diese Wertebreich definiert?

von hp-freund (Gast)


Lesenswert?

Simon schrieb:
> Ich bekomme von einem chip den Wert geliefert.
>
> Als 16Bit WORD, z.B. ebend 5066 und möchte das auf einen Winkel
> Umrechnen.

Das ist der Schlüssel.
Was liefert der Chip? Bananen? RAD?
Was sagt das Datenblatt zum "Chip"?

von Pandur S. (jetztnicht)


Lesenswert?

Weshalb braucht man denn einen Gradwert ? Meist kann man mit 
proportionalen Werten weiterrechnen. Dh 2345 ist ebensogut wie 89, meist 
eher schneller und genauer.
Ich rechne nur fuer Benutzerinteraktionen auf Bentuzerwerte wie 
Grad-winkel, oder Grad-Celsius um, die Rechnungen sind in integer, meist 
Longint.

von Simon (Gast)


Angehängte Dateien:

Lesenswert?

Also das was er ausgibt ist ebend dieser 16 Bit wert 5066 z.B.
Der wird anhand der formel unten berechnet

von hp-freund (Gast)


Lesenswert?

Also alles Integer.
703 mal den Registerwert und das Komma an die richtige Stelle...

...Fertig.

von hp-freund (Gast)


Lesenswert?

Ich meine Longint. (STM32 geschädigt ;-) )

von hp-freund (Gast)


Lesenswert?

War wohl etwas voreilig. Das ist dann erst der Phasenwinkel.
Davon brauchts dann noch den cos.
Würde ich als Tabelle mit 000 bis 100 für cos Phi anlegen und dem 
Registerwert als Index.

von Simon (Gast)


Lesenswert?

hp-freund schrieb:
> Also alles Integer.
> 703 mal den Registerwert und das Komma an die richtige Stelle...

Willst du mir damit sagen, ich hab so nen aufriss gemacht, obwohl es so 
leicht hätte sein können. oh man

von hp-freund (Gast)


Lesenswert?

Nein, sorry hatte erst den Phasenwinkel im Hinterkopf.
Du willst aber den cos davon.

von Simon (Gast)


Lesenswert?

Ich habs gerade bemerkt, ja das ergebnis stimmt schon, aber ebend 
erspart mir das den cos() nicht

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.