Sinus Tabelle

Wechseln zu: Navigation, Suche

von kruemeltee

Da die Sinusberechnung auf einem Mikrocontroller sehr zeitintensiv ist, kann man in vielen Fällen auch mit einer festen Sinustabelle arbeiten, aus welcher die Werte geholt werden.

Natürlich lässt sich dieses Prinzip analog auch für Cosinus, Tangens, usw. verwenden.

Hier ein Beispiel in C, welches eine kleine Sinustabelle im Programspace hält, die Werte ausliest und auf einem Display ausgibt. Dieses Beispiel gibt die Werte auf dem Display mit der Fleury-Display-Library aus.

#include <avr/io.h>
#include <stdio.h>
#include <avr/pgmspace.h>
#include "lcd.h"
 
const float sine_table_16_entries[16] PROGMEM =
{
     0.00000,
     0.38268,
     0.70711,
     0.92388,
     1.00000,
     0.92388,
     0.70711,
     0.38268,
     0.00000,
     -0.38268,
     -0.70711,
     -0.92388,
     -1.00000,
     -0.92388,
     -0.70711,
     -0.38268
};
 
int main()
{
    lcd_init (LCD_DISP_ON);
    lcd_clrscr();
 
    sprintf (buffer, "%f", pgm_read_float (&sine_table_16_entries[3]));
    lcd_gotoxy (0,0);
    lcd_puts (buffer);
 
    for(;;);
}

Zum Erstellen einer Sinustabelle wie im obigen Beispiel habe ich ein kleines Programm geschrieben, welches ein Headerfile mit einer Sinustabelle in beliebiger Grösse erzeugt.

Das Programm lässt sich hier herunterladen: Datei:Sintab.zip

Hier ist der Quellcode dazu:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
int main() {
    FILE *fp;
    char buffer[256];
    double sine, sine_base = 0.0;
    int x = 0;
    int steps;
 
    printf("Anzahl der gewuenschten Eintraege: ");
    scanf("%d", &steps);
 
    fp = fopen("sine_table.h", "w");
 
    sprintf (buffer, "#ifndef __SINE_TABLE_H__\n"
                     "#define __SINE_TABLE_H__\n\n"
                     "double sine_table_%d_entries[%d] = {\n"
                     , steps, steps);
    fputs(buffer, fp);
 
    while(x < steps) {
          sine = sin(sine_base);
          if(x != steps-1) sprintf(buffer, "     %0.5f,\n", sine);
          else sprintf(buffer, "     %0.5f\n", sine);
          fputs(buffer, fp);
          sine_base += ((2.0*M_PI)/steps);
          x++;  
    }
 
    fputs("};\n\n#endif\n", fp);
    fclose(fp);
    printf("Sinustabelle mit %d Eintraegen erzeugt (sine_table.h)!\n", steps);
    system("PAUSE");
    return 0;
}

Siehe auch[Bearbeiten]