PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sinus-Funktion Fehlerhaft?!



Che Guevara
15.07.2009, 15:54
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:



$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:



$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

PicNick
15.07.2009, 16:22
"0 to 90" klingt irgendwie nach "Grad"
die SIN() braucht aber Bogenmass, das ist am PC genauso

Che Guevara
15.07.2009, 16:28
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

Willa
15.07.2009, 16:47
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...

Che Guevara
15.07.2009, 16:58
Hallo William,

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

Hier mal mein 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

vohopri
15.07.2009, 17:19
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

Willa
15.07.2009, 17:24
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)