Forum: Mikrocontroller und Digitale Elektronik Sinus array erzeugen


von William (Gast)


Lesenswert?

Hallo,
ich möchte:
Sinuszahlen aus konstanter Tabelle auslesen & per PWM ausgeben.

das dürfte kein Problem sein
aber:
die Tabelle an sich. Wie kann ich die Sinuswerte generieren (vorher 
offline in extra program auf pc!)?

mit
#include <math.h>
#define anzahl 100
for(i=0;i<anzahl;i++){
  z++;
  sinustabelle[i]=(sin(anzahl));
      }

kommen nur 0en raus

& mit  (hab ich irgendwo aus dem Forum:)

#include <math.h>
#define anzahl 100
#define pi 3.1415926

for(i=0;i<anzahl;i++){
  z++;
  sinustabelle[i]=((127.5+127.5*sin(2.0*pi*i/anzahl)));
    }

kommt was sinusartiges raus aber es ist nicht rund, also der anfangswert 
ist nicht der endwert (ich versteh die gleichung auch nicht)

ich weiß es gibt viele einträge dazu aber
ich versteh die mathematik vom sinus einfach nicht
kann mir jemand helfen?

von Karl H. (kbuchegg)


Lesenswert?

William schrieb:

> die Tabelle an sich. Wie kann ich die Sinuswerte generieren (vorher
> offline in extra program auf pc!)?

Ja. ist die beste Variante

von William (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ja. ist die beste Variante

Ja, aber wie?

von sin (Gast)


Lesenswert?

mit
1
for(i=0;i<anzahl;i++){
2
  z++;
3
  sinustabelle[i]=(sin(anzahl));
4
      }

wird 100mal der wert sin(100) ins array abgelegt....kein wunder, dass da 
nur 0en drinnenstehen ;)

von Karl H. (kbuchegg)


Lesenswert?

William schrieb:


> #include <math.h>
> #define anzahl 100
> for(i=0;i<anzahl;i++){
>   z++;
>   sinustabelle[i]=(sin(anzahl));
>       }
>
> kommen nur 0en raus

Was ist eigentlich so schwer daran, IMMER Datentypen anzugeben.
Welchen Typ hat sinustabelle?
Dir ist klar, dass der Sinus aller Winkel eine Zahl zwischen 0 und 1 
ist?

Und ob du den Sinus von Werten zwischen 0 und 100 haben willst, wage ich 
auch zu bezweifeln. Das Argument an den Sinus wird in Radianten 
angegeben.
Also  0° <==> 0
     90° <==> PI / 2
    360° <==> 2 * PI


> #include <math.h>
> #define anzahl 100
> #define pi 3.1415926
>
> for(i=0;i<anzahl;i++){
>   z++;
>   sinustabelle[i]=((127.5+127.5*sin(2.0*pi*i/anzahl)));
>     }
>
> kommt was sinusartiges raus aber es ist nicht rund, also der anfangswert
> ist nicht der endwert (ich versteh die gleichung auch nicht)

Solltest du aber. Das ist nix anderes als ein Dreisatz, der den Bereich 
0 bis anzahl in den Bereich 0 bis 2*PI abbildet, davon den Sinus rechnet 
und dann die Werte hochskaliert und verschiebt in den Bereich 0 bis 255. 
Das der Anfangswert nicht mit dem Endwert übereinstimmt, ist so gewollt. 
Denn der Sinus von 0° ist gleich dem Sinus von 360°. Den braucht daher 
kein Mensch, weil er ihn bei 0° sowieso schon hat.

> ich weiß es gibt viele einträge dazu aber
> ich versteh die mathematik vom sinus einfach nicht

Brauchst du auch nicht.
Stell dir ein Rad vor. Markier dir einen Punkt am Umfang. Der Punkt 
liegt rechts genau auf gleicher Höhe wie die Nabe. Jetzt drehst du das 
Rad. Der Punkt wandert nach oben (und nach links aber das ist beim Sinus 
uninteressant), kommt nach dem höchsten Punkt wieder runter geht unter 
die Nabe (wandert wieder nach rechts) und kommt wieder hoch, bis er dann 
einmal rum ist.
Der Abstand des Punktes von der waagrechten Linie auf der Nabe und 
Anfangspunkt lag, das ist der Sinus des Winkels um den das Rad gedreht 
ist. Gegeben also der Verdrehwinkel des Rades, sagt dir der Sinus des 
Winkels wie weit der Punkt hoch bzw. unter die 0-Linie gewandert ist. 
That's it. Das ist dann auch schon (fast) alles. :-)

Näheres in jedem Mathebuch, Stichwort "Trigonometrie".

Und der Rest. Das ist in beiden Fällen ein ganz simpler Dreisatz.
Ein Apfel kostet 2 Euro. Die Apfelkiste 5 Euro. Wieviel kosten 15 Äpfel, 
wenn man sie in der Kiste kauft.

> kann mir jemand helfen?

von Karl H. (kbuchegg)


Lesenswert?

William schrieb:
> Karl Heinz Buchegger schrieb:
>> Ja. ist die beste Variante
>
> Ja, aber wie?

zb mit Excel?

von Mr Tannnoy (Gast)


Lesenswert?

Wenn ich 7 Äpfel und 3 Birnen kaufe: Wie alt ist danach der Bauer????

von N.M. (Gast)


Lesenswert?

Mr Tannnoy schrieb:
> Wenn ich 7 Äpfel und 3 Birnen kaufe: Wie alt ist danach der Bauer????

Ich versuchs mal mit Deinen Angaben...hier die Möglichkeiten:

7 Äpfel - 3 Birnen = 4 Jahre
7 Äpfel + 3 Birnen = 10 Jahre
7 Äpfel * 3 Birnen = 21 Jahre
7 Äpfel / 3 Birnen = (float)2.3333 Jahre od. (int)2 Jahre
7 Äpfel % 3 Birnen = 1 Jahre

von William (Gast)


Lesenswert?

> Welchen Typ hat sinustabelle?
bisher int
> Dir ist klar, dass der Sinus aller Winkel eine Zahl zwischen 0 und 1
> ist?
war mir nicht klar. jetzt wo du's sagst ist unsigned int natürlich 
falsch... float? double?

> Also  0° <==> 0
>      90° <==> PI / 2
>     360° <==> 2 * PI

das hab ich verstanden

ok, dann ist also das richtig?:
>> #include <math.h>
>> #define anzahl 100
>> #define pi 3.1415926

unsigned int sinustabelle[anzahl];

unsigned int make_sinus_zahlen(void)
{
unsigned int i;

for(i=0;i<anzahl;i++){

>>
>> for(i=0;i<anzahl;i++){
>>   z++;
>>   sinustabelle[i]=((127.5+127.5*sin(2.0*pi*i/anzahl)));
>>     }

??richtig??

> (...)Das ist nix anderes als ein Dreisatz, der den Bereich
> 0 bis anzahl in den Bereich 0 bis 2*PI abbildet, davon den Sinus rechnet
> und dann die Werte hochskaliert und verschiebt in den Bereich 0 bis 255.

das heißt die anzahl 100 ist hier die Auflösung, richtig?? was fürn 
datentyp nehme ich nun um die auflösung riesig zu machen (mit 
nachkommastellen)? float? double?  mit unsigned davor?

> Das der Anfangswert nicht mit dem Endwert übereinstimmt, ist so gewollt.
> Denn der Sinus von 0° ist gleich dem Sinus von 360°. Den braucht daher
> kein Mensch, weil er ihn bei 0° sowieso schon hat.

versteh ich nicht: wiederspricht sich doch
von 0 bis 2pi = eine umdrehung vom Rad = anfangswert = endwert

dann müsste sich das bei
 sinustabelle[i]=((127.5+127.5*sin(3*pi*i/anzahl)));
ja wiederholen, also die periode nach 2*pi deckungsgleich wiederholen.
tuts auch, raus kommt für #define anzahl 64
127, 146, 164, 182, 198, 213, 226, 236, 245, 251, 254, 254, 252, 247, 
239, 229, 217, 203, 187, 170, 152, 133, 115, 96, 78, 61, 46, 33, 21, 12, 
5, 1, 0, 1, 5, 12, 21, 33, 46, 61, 78, 96, 115, 133, 152, 170, 187, 203, 
217, 229, 239, 247, 252, 254, 254, 251, 245, 236, 226, 213, 198, 182, 
164, 146,
sieht symmetrisch aus!

>
> Näheres in jedem Mathebuch, Stichwort "Trigonometrie".
 puuuuh

2*pi danke

von William (Gast)


Lesenswert?

hallo nochmal
um einige meiner fragen selbst zu beantworten:

> das heißt die anzahl 100 ist hier die Auflösung, richtig??
ja ist wohl richtig allerdings kann ich das ganze auf der y achse ja 
noch höher verschieben um keine doppelten zahlen zu bekommen und die 
auflösung noch höher zu machen.
kommt sich das mit dem PWM in die quere?

> was fürn datentyp nehme ich nun um die auflösung riesig zu machen (mit
> nachkommastellen)? float? double?  mit unsigned davor?
nachkommastellen brauch ich ja dann nicht!?

danke

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?


von µC (Gast)


Lesenswert?

Und wie kommst du eigentlich auf die Anzahl von 100 Stützstellen? Aus 
der Sicht eines µC ist das - nach Floating-Point - eine der krummsten 
Zahlen, die er sich vorstellen kann.

von Achim M. (minifloat)


Angehängte Dateien:

Lesenswert?

Hab da was in meinen Snippets gefunden.
Man kann übrigens aus einer Viertelperiode eine Ganze errechnen.

Dies wird
a)durch Achsenspiegelung an der Geraden x = pi/2
b)durch Verschiebung und Achsenspiegelung an der x-Achse
erreicht.
mfg mf

von Marko B. (Gast)


Lesenswert?

Mensch sind eure Programme alle kompliziert :P

Fuer die meisten Anwendungen braucht man gar keine negativen Sinuswerte. 
Z.B. fuer einen PWM Sinus rattert man die Tabelle abwechselnd vorwaerts 
und rueckwaerts ab (0 bis Pi/2 und wieder zurueck).
1
root@dockstar:~/c# cat sinetable.c
2
#include <stdio.h>
3
#include <stdlib.h>
4
#include <math.h>
5
#include <malloc.h>
6
7
int main(int argc, char **argv)
8
{
9
        int i;
10
        int * sinetable;
11
        int sinetblsiz = atoi(argv[1]);
12
13
        sinetable = malloc(sinetblsiz*sizeof(int));
14
15
        for (i=0; i<sinetblsiz; i++)
16
                sinetable[i] = 256*sin(M_PI_2*(i/(float)sinetblsiz));
17
18
        printf("PROGMEM uint8_t sinetable[] = { ");
19
        for(i=0; i<sinetblsiz; i++)
20
                printf("%i, ", sinetable[i]);
21
        printf("\b\b };\n");
22
}
23
root@dockstar:~/c# gcc -lm sinetable.c
24
root@dockstar:~/c# ./a.out 16
25
PROGMEM uint8_t sinetable[] = { 0, 25, 49, 74, 97, 120, 142, 162, 181, 197, 212, 225, 236, 244, 251, 254 };

von Helmut (Gast)


Lesenswert?

>kommt was sinusartiges raus aber es ist nicht rund, also der anfangswert
>ist nicht der endwert

Der Anfangswert soll auch nicht der Endwert sein. Sonst wird ein Wert 2 
mal ausgegeben.

von Hans (Gast)


Lesenswert?

/* Sinus */

prog_uint8_t sinewave[256] =
{
  64,   66,   67,   69,   70,   72,   73,   75,
  76,   78,   79,   81,   82,   84,   85,   87,
  88,   90,   91,   92,   94,   95,   96,   98,
  99,  100,  102,  103,  104,  105,  106,  107,
 109,  110,  111,  112,  113,  114,  115,  116,
 116,  117,  118,  119,  120,  120,  121,  122,
 122,  123,  123,  124,  124,  125,  125,  125,
 126,  126,  126,  127,  127,  127,  127,  127,
 127,  127,  127,  127,  127,  127,  126,  126,
 126,  125,  125,  125,  124,  124,  123,  123,
 122,  122,  121,  120,  120,  119,  118,  117,
 116,  116,  115,  114,  113,  112,  111,  110,
 109,  107,  106,  105,  104,  103,  102,  100,
  99,   98,   96,   95,   94,   92,   91,   90,
  88,   87,   85,   84,   82,   81,   79,   78,
  76,   75,   73,   72,   70,   69,   67,   66,
  64,   62,   61,   59,   58,   56,   55,   53,
  52,   50,   49,   47,   46,   44,   43,   41,
  40,   38,   37,   36,   34,   33,   32,   30,
  29,   28,   26,   25,   24,   23,   22,   21,
  19,   18,   17,   16,   15,   14,   13,   12,
  12,   11,   10,    9,    8,    8,    7,    6,
   6,    5,    5,    4,    4,    3,    3,    3,
   2,    2,    2,    1,    1,    1,    1,    1,
   1,    1,    1,    1,    1,    1,    2,    2,
   2,    3,    3,    3,    4,    4,    5,    5,
   6,    6,    7,    8,    8,    9,   10,   11,
  12,   12,   13,   14,   15,   16,   17,   18,
  19,   21,   22,   23,   24,   25,   26,   28,
  29,   30,   32,   33,   34,   36,   37,   38,
  40,   41,   43,   44,   46,   47,   49,   50,
  52,   53,   55,   56,   58,   59,   61,   62,
};

von Knut (Gast)


Lesenswert?

Mach das mit Excel, als Amplitude für den Sinus nimmste den halben 
PWM-Maximalwert und haust noch einen Offset von PWM-Maximalwert/2 drauf, 
fertig.


Knut

von Noch ein Hans :-) (Gast)


Lesenswert?

Hallo

Mir hat das hier bei einem ähnlichen Problem weitergeholfen.

http://www.afug-info.de/Schaltungen-Eigenbau/PIC-Sinus-Tabelle/

Schöner Sinus und übersichtliche Tabelle.

Hans

von Andreas R. (andreasr)


Angehängte Dateien:

Lesenswert?

Mit angehängter Exceltabelle wird eine Halbewlle als Integer abgelegt
- In Zelle F5 den Zieldateinamen eintragen
- in Zelle F11 die Frequenz eintragen
- In Zelle F14 die Anzahl der Schritte der Halbwelle eintragen
- In Zelle F17 den Max-Wert (bei 90 Grad) der Werte eintragen
- Button klicken

Es wird eine Include-Datei abgelegt, die mit folgendem C-Code umgeben 
werden kann:
1
static const uint16_t sine_tab[SINE_STEPS] PROGMEM = {
2
    #include "sinus200.cin"
3
};

Wird aktuell hier verwendet:
https://www.mikrocontroller.net/articles/Sinuswechselrichter_600W

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Sinus könnte man auch als Beleidigung auffassen! (Bei dem Zeitgeist 
heute . .  .)

von Zweifler (Gast)


Lesenswert?

Ich wundere mich eher, was dir eine Sinustabelle bzw eine 
sinusmodulierte PWM bringt wenn du nichtmal weißt, was die sinusfunktion 
überhaupt macht. Klar die Kurve sieht hübsch aus aber ich bezweifle dass 
mit dem Kenntnisstand was nicht explodierendes bei herauskommt.

von Anwalt (Gast)


Lesenswert?

Das Excel ist aber trotzdem hilfreich, finde ich.

Ich habe das hiermit gemacht:

Digitale Sinusfunktion

von Michael (Gast)


Lesenswert?

Na und ob das noch jemanden interessiert - mich zum Beispiel :-)

Sonst könnte man das Forum doch gleich schließen - ich fasse das Ganze 
schon irgendwie auch als Quelle zum Nachlesen und Nachschauen auf - es 
ist ja nicht so, dass technische Probleme zeitlich begrenzt oder auf nur 
einzelne Fragensteller begrenzt wären.
Selbst 2016 gibt´s noch viele, die sich für Commodore interessieren.
Also, cool down - immer mit der Ruhe. Ist doch schön, wenn hier was 
geschrieben wird, was anderen hilft.

von Alfred (Gast)


Lesenswert?

Das verstehe ich nicht.
Der Sinus-Tabellen-Artikel von Mikrocontroller arbeitet mit negativen 
Zahlen in der Tabelle - der µC soll aber doch von 0 bis +5 Volt den 
Sinus ausgeben (keine negativen Werte).
Was mache ich dann mit den negativen Zahlen?

Die Tabelle im Link von Hans
http://www.afug-info.de/Schaltungen-Eigenbau/PIC-Sinus-Tabelle/
verwendet dagegen nur positive Zahlen ohne Fließkomma und der Sinus 
sieht doch sehr schön aus.

Ach ja, ich arbeite hobbymäßig mit PICs.
Kann mir aber schlecht vorstellen, dass Atmel negative Zahlen 
"verstehen"  soll.

von Falk B. (falk)


Lesenswert?

@  Alfred (Gast)

>Der Sinus-Tabellen-Artikel von Mikrocontroller arbeitet mit negativen
>Zahlen in der Tabelle

Welche denn?

> - der µC soll aber doch von 0 bis +5 Volt den
>Sinus ausgeben (keine negativen Werte).

Kann er im Normalfall auch gar nicht.

>Was mache ich dann mit den negativen Zahlen?

Die Hälfte des Maximums jeweils dazu addieren. Oder gleich dir richtige 
Tabelle mit Offset nehmen.

von Sascha (Gast)


Lesenswert?

>Kann mir aber schlecht vorstellen, dass Atmel negative Zahlen
>"verstehen"  soll.

Ja, die negativen Zahlen waren 1996 nämlich noch nicht erfunden.

Tja was macht man mit den negativen Werten im Sinus wenn die 
Ausgangsspannung immer positiv ist.

Vorschläge:
- Ignorieren (ergibt Einwellen-Gleichrichtung)
- Nach oben umklappen (ergibt Vollbrückengleichrichtung)
- Nach oben verschieben (ergibt Sinus mit Gleichanteil)

Kommt jetzt drauf an was du mit dem Sinus vorhast. Wenn der nur aufm 
Oszi schön aussehen soll, kannst du den noch mit einem RC-Glied glätten 
und bist fertig.

von Alfred (Gast)


Lesenswert?

Danke für die Antworten.

Ich meinte diese Tabelle hier mit den negativen Fließkomma-Zahlen
http://www.mikrocontroller.net/articles/Sinus_Tabelle

Auch ansonsten findet man häufig Excel-Tabellen, die negative Zahlen 
ausgeben. Wenn ich diese Tabellen in dieser Form gar nicht verwenden 
kann, habe ich mich aus reinem Interesse gefragt, warum man so viel 
nicht brauchbares Zeugs als Sinus-Tabelle findet.

Es ist zwar richtig, dass ein PIN nur Hi oder Lo sein kann (mit dem 
Referenzspannungsausgang geht´s zwar auch anders), aber wenn ich mehrere 
PINs zusammenschalte (Spannungsteiler), dann brauche ich eine Tabelle, 
bei der auch ein Sinus rauskommt, und nicht irgendwelche Zahlen, die ich 
mir dann noch selbst zurechtbiegen muss.
Das ist keine Faulheit, aber als Anfänger ist das ziemlich verwirrend. 
Da braucht man halt ab und zu mal ein funktionierendes Beispiel, um auf 
den Zug aufspringen zu können. Wenn´s dann einmal läuft, kann man mit 
dem "biegen" anfangen und selbst experimentieren.

von Rolf M. (rmagnus)


Lesenswert?

Alfred schrieb:
> Was mache ich dann mit den negativen Zahlen?

Kommt drauf an, was du mit dem Sinus vor hast.

> Die Tabelle im Link von Hans
> http://www.afug-info.de/Schaltungen-Eigenbau/PIC-Sinus-Tabelle/
> verwendet dagegen nur positive Zahlen ohne Fließkomma und der Sinus
> sieht doch sehr schön aus.

Das ist dann aber kein reiner Sinus, sondern einer, wo noch ein Offset 
draufgerechnet wurde.

> Ach ja, ich arbeite hobbymäßig mit PICs.
> Kann mir aber schlecht vorstellen, dass Atmel negative Zahlen
> "verstehen"  soll.

Natürlich versteht Atmel negative Zahlen.

Alfred schrieb:
> Danke für die Antworten.
>
> Ich meinte diese Tabelle hier mit den negativen Fließkomma-Zahlen
> http://www.mikrocontroller.net/articles/Sinus_Tabelle
>
> Auch ansonsten findet man häufig Excel-Tabellen, die negative Zahlen
> ausgeben. Wenn ich diese Tabellen in dieser Form gar nicht verwenden
> kann, habe ich mich aus reinem Interesse gefragt, warum man so viel
> nicht brauchbares Zeugs als Sinus-Tabelle findet.

Wenn du bei deinem speziellen Problem nichts mit negativen Zahlen 
anfangen kannst, aber trotzdem einen Sinus brauchst, musst du dir eben 
überlegen, was du dann in diesem Fall stattdessen machst.

> Es ist zwar richtig, dass ein PIN nur Hi oder Lo sein kann (mit dem
> Referenzspannungsausgang geht´s zwar auch anders), aber wenn ich mehrere
> PINs zusammenschalte (Spannungsteiler), dann brauche ich eine Tabelle,
> bei der auch ein Sinus rauskommt, und nicht irgendwelche Zahlen, die ich
> mir dann noch selbst zurechtbiegen muss.

Das verstehe ich jetzt nicht. Ein Sinus hat nun mal negative Zahlen. 
"Irgenwelche Zahlen" musst du dir nur dann "zurechtbiegen, wenn du was 
sinusförmiges ohne negative Zahlen brauchst.

von Falk B. (falk)


Lesenswert?

@Alfred (Gast)

>Ich meinte diese Tabelle hier mit den negativen Fließkomma-Zahlen
>http://www.mikrocontroller.net/articles/Sinus_Tabelle

Liegt das nicht auf der Hand? Fließkommazahlen kann man so oder so nicht 
direkt in Hardwareregister schreiben. Die nutzt man nur für 
Berechnungen, an deren Ende eine Integerzahl steht.

>Es ist zwar richtig, dass ein PIN nur Hi oder Lo sein kann (mit dem
>Referenzspannungsausgang geht´s zwar auch anders), aber wenn ich mehrere
>PINs zusammenschalte (Spannungsteiler),

Das ist ein einfacher DA-Wandler.

>Das ist keine Faulheit, aber als Anfänger ist das ziemlich verwirrend.

Der Artikel ist auch nicht sonderlich anfängertauglich. Er ist auch 
nicht mal sonderlich gut, eher das Gegenteil.

: Bearbeitet durch User
von Random .. (thorstendb) Benutzerseite


Lesenswert?

In einem Projekt musste ich eine Drehung realisieren. Dachte dann, man 
könnte das schön mit einer 256 Werte grossen Tabelle sowie Überlauf & 
MASK realisieren, um sin und cos zu berechnen.
Dummerweise waren die Abweichungen zu ungenau, so dass das Muster an 
einigen Winkeln in sich zusammenfiel, die Drehung von einer Pumpbewegung 
überlagert wurde.

Lösung: 360 + 90 Werte:
1
const signed short sineTable[360+90] = {
2
   0,   17,   34,   52,   69,   87,  104,  121,  139,  156,  173,  190,  207,  224,  241,  258, 
3
 275,  292,  309,  325,  342,  358,  374,  390,  406,  422,  438,  453,  469,  484,  500,  515, 
4
 529,  544,  559,  573,  587,  601,  615,  629,  642,  656,  669,  682,  694,  707,  719,  731, 
5
 743,  754,  766,  777,  788,  798,  809,  819,  829,  838,  848,  857,  866,  874,  882,  891, 
6
 898,  906,  913,  920,  927,  933,  939,  945,  951,  956,  961,  965,  970,  974,  978,  981, 
7
 984,  987,  990,  992,  994,  996,  997,  998,  999,  999, 1000,  999,  999,  998,  997,  996, 
8
 994,  992,  990,  987,  984,  981,  978,  974,  970,  965,  961,  956,  951,  945,  939,  933, 
9
 927,  920,  913,  906,  898,  891,  882,  874,  866,  857,  848,  838,  829,  819,  809,  798, 
10
 788,  777,  766,  754,  743,  731,  719,  707,  694,  682,  669,  656,  642,  629,  615,  601, 
11
 587,  573,  559,  544,  529,  515,  500,  484,  469,  453,  438,  422,  406,  390,  374,  358, 
12
 342,  325,  309,  292,  275,  258,  241,  224,  207,  190,  173,  156,  139,  121,  104,   87, 
13
  69,   52,   34,   17,    0, - 17, - 34, - 52, - 69, - 87, -104, -121, -139, -156, -173, -190, 
14
-207, -224, -241, -258, -275, -292, -309, -325, -342, -358, -374, -390, -406, -422, -438, -453, 
15
-469, -484, -500, -515, -529, -544, -559, -573, -587, -601, -615, -629, -642, -656, -669, -682, 
16
-694, -707, -719, -731, -743, -754, -766, -777, -788, -798, -809, -819, -829, -838, -848, -857, 
17
-866, -874, -882, -891, -898, -906, -913, -920, -927, -933, -939, -945, -951, -956, -961, -965, 
18
-970, -974, -978, -981, -984, -987, -990, -992, -994, -996, -997, -998, -999, -999,-1000, -999, 
19
-999, -998, -997, -996, -994, -992, -990, -987, -984, -981, -978, -974, -970, -965, -961, -956, 
20
-951, -945, -939, -933, -927, -920, -913, -906, -898, -891, -882, -874, -866, -857, -848, -838, 
21
-829, -819, -809, -798, -788, -777, -766, -754, -743, -731, -719, -707, -694, -682, -669, -656, 
22
-642, -629, -615, -601, -587, -573, -559, -544, -529, -515, -500, -484, -469, -453, -438, -422, 
23
-406, -390, -374, -358, -342, -325, -309, -292, -275, -258, -241, -224, -207, -190, -173, -156, 
24
-139, -121, -104, - 87, - 69, - 52, - 34, - 17,    0,   17,   34,   52,   69,   87,  104,  121, 
25
 139,  156,  173,  190,  207,  224,  241,  258,  275,  292,  309,  325,  342,  358,  374,  390, 
26
 406,  422,  438,  453,  469,  484,  500,  515,  529,  544,  559,  573,  587,  601,  615,  629, 
27
 642,  656,  669,  682,  694,  707,  719,  731,  743,  754,  766,  777,  788,  798,  809,  819, 
28
 829,  838,  848,  857,  866,  874,  882,  891,  898,  906,  913,  920,  927,  933,  939,  945, 
29
 951,  956,  961,  965,  970,  974,  978,  981,  984,  987,  990,  992,  994,  996,  997,  998, 
30
 999,  999, 
31
};
32
33
#define SINETAB_MAXVAL    1000
34
35
// calculate rotation
36
x1 = point.x;   // preserve x, y
37
y1 = point.y;
38
point.x = (x1 * sineTable[rotate + 90]) - (y1 * sineTable[rotate     ]);
39
point.y = (x1 * sineTable[rotate     ]) + (y1 * sineTable[rotate + 90]);      
40
point.x /= SINETAB_MAXVAL;
41
point.y /= SINETAB_MAXVAL;

: Bearbeitet durch User
von Sinus (Gast)


Lesenswert?

Alfred schrieb:
> Auch ansonsten findet man häufig Excel-Tabellen, die negative Zahlen
> ausgeben. Wenn ich diese Tabellen in dieser Form gar nicht verwenden
> kann, habe ich mich aus reinem Interesse gefragt, warum man so viel
> nicht brauchbares Zeugs als Sinus-Tabelle findet.

Erstmal hat eine Excel-Tabelle nichts mit einem Microcontroller zu tun. 
Ein Sinus ist immer positiv oder negativ, je nach Quadrant, deshalb ist 
eine Exceltabelle mit negativen Zahlen immer richtig. Wenn Du Sinuswerte 
mit einem Mikrocontroller ausgeben willst, mußt Du die Werte immer 
irgendwie skalieren, damit Du auf sinnvolle Integerwerte kommst. Oder 
wie willst Du einen reinen Sinuswert von z.B. 0,0538729 auf einem 
Mikrocontroller ausgeben?
Es gibt auch externe DA-Wandler, die Werte von z.B. -128 bis +127 (8 
Bit) verarbeiten und ausgeben können, da kannst Du dann auch negative 
(Integer-)Werte verwenden.

von Joachim B. (jar)


Lesenswert?

Falk B. schrieb:
> Der Artikel ist auch nicht sonderlich anfängertauglich. Er ist auch
> nicht mal sonderlich gut, eher das Gegenteil.

zeige einen besseren! am besten deinen.

aber egal das Thema ist so trivial, das kann jeder der in Mathe nicht 
gepennt hat, einen Offset für nur positive Ausgaben raufrechnen auch und 
den Gleichanteil später per Ko abtrennen auch.

Man sollte aber den Unterschied von DEG und RAD kennen

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Joachim B. (jar)


>> Der Artikel ist auch nicht sonderlich anfängertauglich. Er ist auch
>> nicht mal sonderlich gut, eher das Gegenteil.

>zeige einen besseren! am besten deinen.

Da weiß ich ja gar nicht wo ich anfangen soll ;-)

LED-Matrix
LED-Fading
Royer Converter

Liste unvollständig.

>aber egal das Thema ist so trivial, das kann jeder der in Mathe nicht
>gepennt hat, einen Offset für nur positive Ausgaben raufrechnen auch und
>den Gleichanteil später per Ko abtrennen auch.

Wenn es denn so "!trivial" ist, warum ist dann der Artikel so schlecht?

>Man sollte aber den Unterschied von DEG und RAD kennen

Da gehen die Problemchen schon los ;-)

von Walter T. (nicolas)


Lesenswert?

William schrieb:
> Ja, aber wie?

Excel, Matlab, Python, C, ...

Ich nutze für soetwas Matlab, aber da bin ich in diesem Forum vermutlich 
in der Minderzahl.

von Alfred (Gast)


Lesenswert?

Danke für die vielen Antworten.

Ich hab mich wohl ein wenig missverständlich ausgedrückt, sorry dafür. 
Es geht nicht um Sinus-Berechnungen im Allgemeinen (die haben 
selbstverständlich immer negative Zahlen), sondern um eine Sinus-Tabelle 
gebrauchsfertig für Mikrocontroller.

Und da musste ich einfach feststellen, dass es µC-taugliche 
Sinus-Tabellen, bei denen dann auch wirklich ein Sinus rauskommt, 
seltene Mangelware sind.

Zwischenzeitlich habe ich die sinus-Tabellen von www.afug-info.de 
ausprobiert, die funktionieren einwandfrei. Damit bin ich jetzt einen 
großen Schritt weitergekommen.

Jetzt wäre es noch schön, wenn es eine Excel-Tabelle gäbe, die einem 
solche schönen, zuverlässigen Werte ausspuckt und man die Parameter (wie 
Anzahl der Stützpunkte etc.) selbst eingeben kann. träum

von Falk B. (falk)


Lesenswert?

Hier mal eine verbesserte Version des Generatorprogramms.

https://www.mikrocontroller.net/articles/Sinus_Tabelle

https://www.mikrocontroller.net/wikifiles/1/1b/Sinus_gen.zip

Bedienung über Commandozeile (CMD).

von Joachim B. (jar)


Lesenswert?

Alfred schrieb:
> Ich hab mich wohl ein wenig missverständlich ausgedrückt, sorry dafür.
> Es geht nicht um Sinus-Berechnungen im Allgemeinen (die haben
> selbstverständlich immer negative Zahlen), sondern um eine Sinus-Tabelle
> gebrauchsfertig für Mikrocontroller.

bitte das proggt man doch mal nach Belieben in einer ruhigen Minute.

> Jetzt wäre es noch schön, wenn es eine Excel-Tabelle gäbe, die einem
> solche schönen, zuverlässigen Werte ausspuckt und man die Parameter (wie
> Anzahl der Stützpunkte etc.) selbst eingeben kann. träum

auch das kann man mal machen, ich sammele ja auch viel im Netz, aber 
trival Zeugs, da dauert ja die Suche länger bis es gefällt als selber 
proggen.

Von 0 - 180° oder pi in beliebig kleinen Schritten normiert auf 0-255 
oder 0-(2^16-1).
Wer mag macht noch eine Tabelle und nimmt bei kleinsten Änderungen 
größere Schrittweiten und gibt das als Text in einer Sinus.h aus.

von Alex (Gast)


Lesenswert?

Na ein bißchen lesen musst Du schon...
Auf der von Dir zitierten Seite mit der Beispielschaltung gibt´s doch 
eine Libre Office Tabelle, die Dir die Sinus-Werte berechnet, und auch 
noch nach Deinen Wünschen.
Noch bequemer geht´s jetzt aber wirklich nicht mehr...

http://www.afug-info.de/Download/

von Alfred (Gast)


Lesenswert?

Alex, Danke für den Link.
Die Tabelle entspricht genau meinen Vorstellungen.

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.