- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 14

Thema: Problem Sinus durch eigene Funktion ersetzen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.698
    ... Das Rechnen mit Vielfachen ist sinnvoll, weil die Berechnung mit Ganzzahlen deutlich schneller abläuft als die Fließkomma-Berechnung ...
    Ja - Ganzzahlen - prima bei kleinen Computern. Und mit ner guten Rechenformel braucht man auch keine Tabelle. Wir hatten mal das Problem für den ATAN auf nem mega8 gelöst, deutlich schneller als mit der GCC-Bibliothek und (für unsere Anwendung - Rückwärtsschnitt) ausreichende Genauigkeit (was um alles in der Welt sind schon <<1 % ????).

    Auch wenns kein Sinus ist - nur als Beispiel:
    Code:
        Näherungsweise Berechnung des atan                            N_atan     = Näherungsweiser ARCTAN nach der Formel aus                
                                        für 0 < x[rad] < π/2                
                                    Beispiel :     = WENN( E9 < 1; E9 / ( 1 + 0,28 *E9 * E9 ); 1,5707963268 - E9 / ( E9 * E9  + 0,28 ) )                
    
        x [ Grad ]        x [ RAD ]    tan-Excel (x)        atan_Excel        N_atan        N_atan / atan         => Fehler %     
                                                        
         1        0,017453    0,017455065        0,017453        0,017454        1,00001624         0,002    
         5        0,087266    0,087488664        0,087266        0,087302        1,000402179        0,040    
        10        0,174533    0,176326981        0,174533        0,174805        1,001560063        0,156    
        20        0,349066    0,363970234        0,349066        0,350952        1,005404629        0,540    
        30        0,523599    0,577350269        0,523599        0,528064        1,008528467        0,853    
        40        0,698132    0,839099631        0,698132        0,700917        1,003990322        0,399    
        50        0,872665    1,191753593        0,872665        0,869879        0,996807742       -0,319    
        60        1,047198    1,732050808        1,047198        1,042732        0,995735766       -0,426    
        70        1,221730    2,74747742         1,221730        1,219844        0,99845582        -0,154    
        80        1,396263    5,671281822        1,396263        1,395991        0,999804992       -0,020    
        89,9      1,569051    572,9572411        1,569051        1,569051        1                  0,000    
                                                        
                                            Rückrechnung : Grad aus Arcustangens            
                                            Grad (Excel-atan)        Grad (N_atan)    
         1        0,017453    0,017455065        0,017453        0,017454         1         1,000    
         5        0,087266    0,087488664        0,087266        0,087302         5         5,002    
        10        0,174533    0,176326981        0,174533        0,174805        10        10,016    
        20        0,349066    0,363970234        0,349066        0,350952        20        20,108    
        30        0,523599    0,577350269        0,523599        0,528064        30        30,256    
        40        0,698132    0,839099631        0,698132        0,700917        40        40,160    
        50        0,872665    1,191753593        0,872665        0,869879        50        49,840    
        60        1,047198    1,732050808        1,047198        1,042732        60        59,744    
        70        1,221730    2,74747742         1,221730        1,219844        70        69,892    
        80        1,396263    5,671281822        1,396263        1,395991        80        79,984    
        89,9      1,569051    572,9572411        1,569051        1,569051        89,9      89,900
    ... und das ging schon recht flott - siehe Posting(s) im Geodaetenforum.
    Ciao sagt der JoeamBerg

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    34
    Beiträge
    1.192
    @damfino: Ich meinte eigentlich ob du nochmal den neuen Teil der Sinusfunktion zeigen kannst, so wie du es umgesetzt hast.
    Grüße, Bernhard

  3. #3
    HaWe
    Gast
    wie Odometrie funktioniert, ist mir auch klar - und ich meinte auch keine allgemeinen Tabllen wie von Oberallgeier:

    ich meinte (auch) DEINEN Tabellen-array-Sinus128 in Gegenüberstellung zum echten sin(x)*128, selber von dir aufgerufen so wie du es dann auch in deiner Anwendung machen willst.

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.08.2008
    Ort
    Graz
    Beiträge
    521
    So wie vorher, hatte nur die while Schleifen eingebaut.

    Code:
    #include <sincos.h>
    #include <avr/pgmspace.h> 
    
    //static const char sinusdaten[91] PROGMEM =
    static const char sinusdaten[92] PROGMEM = 
    {0,2,4,7,9,11,13,16,18,20,22,24,27,29,31
    ,33,35,37,40,42,44,46,48,50,52,54,56,58
    ,60,62,64,66,68,70,72,73,75,77,79,81,82
    ,84,86,87,89,91,92,94,95,97,98,99,101
    ,102,104,105,106,107,109,110,111,112,113
    ,114,115,116,117,118,119,119,120,121,122
    ,122,123,124,124,125,125,126,126,126,127
    ,127,127,128,128,128,128,128,128,128};
    
    short sinus(short winkel)
    {
    short result=0;
    while(winkel<0){winkel+=360;}
    while(winkel>=360){winkel-=360;}
    
    
    if (winkel<=90) result = (short)(pgm_read_word(&sinusdaten[winkel]));
    if ((winkel>90)&&(winkel<=180)) result = (short)(pgm_read_word(&sinusdaten[180-winkel]));
    if ((winkel>180)&&(winkel<=270)) result = -(short)(pgm_read_word(&sinusdaten[winkel-180]));
    if (winkel>270) result = -(short)(pgm_read_word(&sinusdaten[360-winkel]));
    
    return (result);
    }
    
    short cosinus(short winkel)
    {
    short result=0;
    while(winkel<0){winkel+=360;}
    while(winkel>=360){winkel-=360;}
    
    
    if (winkel<=90) result = (short)(pgm_read_word(&sinusdaten[90-winkel]));
    if ((winkel>90)&&(winkel<=180)) result = -(short)(pgm_read_word(&sinusdaten[winkel-90]));
    if ((winkel>180)&&(winkel<=270)) result = -(short)(pgm_read_word(&sinusdaten[270-winkel]));
    if (winkel>270) result = (short)(pgm_read_word(&sinusdaten[winkel-270]));
    
    return (result);
    }
    Da die odomentrie Ergebnisse um den Faktor 100 abweichen müssen hier Werte weit größer als 128 rausgehen, aber wie?
    alles über meinen Rasenmäherroboter (wer Tippfehler findet darf sie gedanklich ausbessern, nur für besonders kreative Fehler behalte ich mir ein Copyright vor.)

  5. #5
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Code:
    static const char sinusdaten[92] PROGMEM = 
                 ^^^^
    
    ... pgm_read_word(&sinusdaten[winkel]));
                 ^^^^
    MfG
    Stefan

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.08.2008
    Ort
    Graz
    Beiträge
    521


    Danke!!
    alles über meinen Rasenmäherroboter (wer Tippfehler findet darf sie gedanklich ausbessern, nur für besonders kreative Fehler behalte ich mir ein Copyright vor.)

Ähnliche Themen

  1. 1600MHz RAM durch 1333MHz RAM ersetzen?
    Von Thor_ im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 0
    Letzter Beitrag: 10.08.2012, 19:45
  2. Sinus-Funktion Fehlerhaft?!
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 15.07.2009, 17:24
  3. Wait durch Timer ersetzen?
    Von TobiasBlome im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 26
    Letzter Beitrag: 05.02.2009, 21:03
  4. Funreichweite AM durch FM ersetzen?
    Von Tido im Forum Elektronik
    Antworten: 15
    Letzter Beitrag: 27.12.2006, 08:45
  5. atmel 90s1200 durch attiny2313 ersetzen problem
    Von Morpheus85 im Forum Assembler-Programmierung
    Antworten: 7
    Letzter Beitrag: 06.10.2006, 09:55

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress