-         

Ergebnis 1 bis 7 von 7

Thema: Sinus-Funktion Fehlerhaft?!

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544

    Sinus-Funktion Fehlerhaft?!

    Anzeige

    Hallo Leute,

    habe mir jetzt einen 8-Bit DAC aus 10k bzw. 20k R, einem TLC272 und einem BC337-16 gebaut. Das ganze funktioniert ganz gut, bis auf dass ich max. 3.6V ca. Ausgangsspannung habe. Das liegt aber glaube ich daran, dass der TLC272 und der BC337-16 die restliche Spannung "verbrauchen".

    Das ist jetzt auch garnicht mein Problem!
    Ich möchte mir damit einen Sinus ausgeben lassen, was ich auch mit folgendem Code schön hinbekommen habe:

    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    $framesize = 80
    $hwstack = 80
    $swstack = 80
    
    Config Portc = Output
    Portc = 0
    
    Dim X As Byte
    
    X = 0
    
    Dim Y As Byte
    
    
    Do
    
    Incr X
    If X = 120 Then X = 0
    
    Y = Lookup(x , Dta)
    
    Y = Y / 2
    
    Portc = Y
    
    Waitus 1
    
    Loop
    
    End
    
    Dta:
    Data 128 , 134 , 141 , 147 , 154 , 160 , 167 , 173 , 179 , 185 , 191 , 197 , 202 , 208 , 213 , 218 , 222 , 227 , 231 , 234 , 238 , 241 , 244 , 247 , 249 , 251 , 252 , 253 , 254 , 255 , 255 , 255 , 254 , 253 , 252 , 251 , 249 , 247 , 244 , 241 , 238 , 234 , 231 , 227 , 222 , 218 , 213 , 208 , 202 , 197 , 191 , 185 , 179 , 173 , 167 , 160 , 154 , 147 , 141 , 134 , 128 , 121 , 114 , 108 , 101 , 95 , 88 , 82 , 76 , 70 , 64 , 58 , 53 , 47 , 42 , 37 , 33 , 28 , 24 , 21 , 17 , 14 , 11 , 8 , 6 , 4 , 3 , 2 , 1 , 0 , 0 , 0 , 1 , 2 , 3 , 4 , 6 , 8 , 11 , 14 , 17 , 21 , 24 , 28 , 33 , 37 , 42 , 47 , 53 , 58 , 64 , 70 , 76 , 82 , 88 , 95 , 101 , 108 , 114 , 121 , 128
    Jedoch möchte ich mir die Werte durch den µC selbst ausrechnen lassen, mit der Sinus funktion! Hier mal mein Programm dazu:

    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    $framesize = 80
    $hwstack = 80
    $swstack = 80
    $baud = 19200
    
    
    Dim X As Single
    Dim Y As Single
    
    
    Do
    
    For X = 0 To 90 Step 5
    
    Y = Sin(x)
    
    Y = Y * 250
    
    Print "Ausgabewert: " ; Y
    Print ""
    
    Wait 1
    
    Next X
    
    Loop
    
    End
    Die Zeile
    y = y * 250
    ist nur dazu da, damit ich Werte zwischen ca. 0 und 250 bekomme, welche ich dann direkt auf den Portc geben möchte, da dort mein DAC angeschlossen ist!

    Allerdings kommen dabei bei der
    y = sin(x)
    funktion ganz andere Werte als beim Taschenrechner raus, teilweise sind diese auch negativ!
    Ist das ein Bug meiner Version (1.11.9.1) oder mache ich etwas falsch??

    Danke schon mal für eure Antworten!

    Gruß
    Chris

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    "0 to 90" klingt irgendwie nach "Grad"
    die SIN() braucht aber Bogenmass, das ist am PC genauso
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    hallo Robert,

    wie muss ich es dann machen?
    Mit Sinus, Cosinus und Tangens kenn ich mich noch nicht so aus!

    Welche Werte brauche ich für X??
    0<X<1 oder wie?
    Oder sollte ich eine andere Funktion benutzen, z.B. Rad2Deg oder so?

    Gruß
    Chris

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    37
    Beiträge
    1.269
    Hi!
    Winkel[rad] = Winkel[°] / 180 * PI
    Für einen Winkel zwischen 0° und 360° bekommst du daher einen Winkel in rad zwischen 0 und 6,28 heraus (6,28 entspricht 2 * PI).
    Ob Bascom eine eigene Funktion für die Winkelumrechnung hat weiss ich nicht...
    Viele Grüße, William
    -> http://william.thielicke.org/

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    Hallo William,

    danke für deine Antwort!
    Jedoch habe ich es entweder falsch verstanden oder falsch umgesetzt...

    Hier mal mein Code:
    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    
    
    Config Portc = Output
    Portc = 0
    
    
    'Winkel[rad] = Winkel[°] / 180 * PI
    
    Dim X As Single
    Dim Y As Single
    Dim Z As Single
    
    Const Div_1 = 180 * 3.14159265
    
    Do
    
    For X = 0 To 90
    
    Y = X / Div_1
    Z = Rad2deg(y)
    
    Z = Z * 20
    
    Portc = Z
    
    Waitus 10
    
    Next X
    
    Loop
    
    End
    Vielleicht kannst du dir den Code ja mal ansehen, oder hast du vielleicht ein konkretes Beispiel??

    Gruß
    Chris

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von vohopri
    Registriert seit
    11.09.2004
    Ort
    südlich der Alpen
    Beiträge
    1.708
    Hallo Chris,

    du dividierst ja durch pi, anstatt mit pi zu multiplizieren, wie William vorgeschlagen hat.

    / 180 * pi

    heisst nicht

    / (180 * pi)

    sondern

    pi / 180

    multipliziere deine Gradwerte einfach mit der Konstanten 3.14 / 180.0 .

    grüsse,
    Hannes

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    37
    Beiträge
    1.269
    Zusätzlich zu vohopris Korrektur:
    Ersetze Z = Rad2deg(y) durch Z= sin(y) und schon nimmt z einen Wert zwischen 0 und 1 an (den du dann mit 255 multiplizieren kannst und an deinen DAC schickst)
    Viele Grüße, William
    -> http://william.thielicke.org/

Berechtigungen

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