what?
17.03.2008, 10:01
hallo,
ich bräuchte mal etwas anschubs bei der auswertung von 'getadc()'...bitte.
ich habe den beschleunigungssensor sca610 an einem mega2560 und erhalte
über den adc werte von 0 - 5V entsprechenden -30° bis +30° horizontaler neigung.
die werte werden im code auf integer scaliert und jeweils eine bestimmte anzahl von werten gemittelt. den winkel errechne ich mit
adc * 5 / 1024.
das klappt soweit schon.
allerdings fällt bei der ausgabe im bascom-terminal auf, dass trotz ruhendem sensor die werte unregelmässig wechseln.
dadurch erhalte ich trotz mittelung (habs schon mit 100 schritten und mehr versucht) immer zwei verschiedene werte für den winkel.
das ist in soweit erstmal nicht so tragisch, weil sich die abweichungen auf die dritte dezimalstelle beschränken.
ich hätte es aber gerne noch genauer.
da mittelung nichts bringt, vermute ich den fehlerverursacher in der spannung.
so, jetzt wage ich mich auf noch dünneres eis, denn das ist alles absolutes neuland für mich, und weiss auch noch nicht, wie ich korrekt formulieren müsste.
könnten das wechseln der werte mit 'schwingungen' im gleichstrom zu tun haben? seit ein paar tagen taste ich mich an die bedienung eines oszilloskops (dso) ran. beim messen der spannung habe ich sowas ähnliches wie eine sinuskurve gesehen. daher die vermutung..=_0
$prog , 255 , &B11011001 , 'Quarz an / Teiler aus / Jtag aus
$regfile = "m2560def.dat"
$hwstack = 82 '80
$framesize = 68 '64
$swstack = 68 '44
$crystal = 16000000
'led (onboard)
Config Pind.5 = Output
'usb
Config Pine.5 = Input
Usb Alias Pine.5
Config Com4 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "com4:" For Binary As #4
'lcd
Config Lcd = 24 * 2
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.6 , Rs = Porta.4
'adc
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim W As Word
Dim Scale As Single
Dim Ref As Single
Dim Tmp As Single
Dim Grad As Single
Dim Tmp_long_1 As Long
Dim Tmp_long_2 As Long
Dim Degr As Integer
Dim I As Integer
Dim A As Integer
Dim Zeropos As Single
Dim Zeropos_long As Long
Dim Average As Long
Scale = 100000000
Ref = 5 * Scale
Ref = Ref / 1024
Zeropos = 2.5 * Scale
Zeropos_long = Zeropos
Average = 10
Degr = 60
Cursor Off
Initlcd
Wait 1
''''''
'main
''''''
For A = 1 To 3 Step 1
'mittelung
Tmp_long_2 = 0
Print #4 , ""
Print #4 , ""
Print #4 , "- schleife auf getadc()"
Print #4 , "- " ; Average ; " durchläufe alle 5ms"
For I = 1 To Average Step 1
W = Getadc(0)
Tmp = W * Ref
Tmp_long_1 = Tmp
Tmp_long_1 = Tmp_long_1 - Zeropos_long
Print # 4 , Tmp_long_1
Tmp_long_2 = Tmp_long_2 + Tmp_long_1
Waitms 5
Next I
'durchschnitt
Tmp_long_1 = Tmp_long_2 / Average
Print #4 , "---------"
Print #4 , Tmp_long_1 ; " <- errechneter durchschnitt"
'winkel
Tmp_long_2 = Tmp_long_1 * Degr
Grad = Tmp_long_2 / 5000000000
Cls
Waitms 10
Locate 1 , 1
Lcd "winkel ---> " ; Fusing(grad , "#.&##")
Print #4 , Fusing(grad , "#.&##") ; " <- winkel"
Next A
End
und hier die werte aus dem terminalfenster
- schleife auf getadc()
- 10 durchläufe mit 5ms pause
-3906256
-4394544
-4394544
-3906256
-3906256
-4394544
-3906256
-4394544
-3906256
-3906256
---------
-4101571 <- errechneter durchschnitt
-0.049 <- winkel
- schleife auf getadc()
- 10 durchläufe mit 5ms pause
-3906256
-3906256
-4394544
-3906256
-3906256
-3906256
-4394544
-3906256
-4394544
-3906256
---------
-4052742 <- errechneter durchschnitt
-0.048 <- winkel
vielen dank für jeden tip.
ciao, edgar
ich bräuchte mal etwas anschubs bei der auswertung von 'getadc()'...bitte.
ich habe den beschleunigungssensor sca610 an einem mega2560 und erhalte
über den adc werte von 0 - 5V entsprechenden -30° bis +30° horizontaler neigung.
die werte werden im code auf integer scaliert und jeweils eine bestimmte anzahl von werten gemittelt. den winkel errechne ich mit
adc * 5 / 1024.
das klappt soweit schon.
allerdings fällt bei der ausgabe im bascom-terminal auf, dass trotz ruhendem sensor die werte unregelmässig wechseln.
dadurch erhalte ich trotz mittelung (habs schon mit 100 schritten und mehr versucht) immer zwei verschiedene werte für den winkel.
das ist in soweit erstmal nicht so tragisch, weil sich die abweichungen auf die dritte dezimalstelle beschränken.
ich hätte es aber gerne noch genauer.
da mittelung nichts bringt, vermute ich den fehlerverursacher in der spannung.
so, jetzt wage ich mich auf noch dünneres eis, denn das ist alles absolutes neuland für mich, und weiss auch noch nicht, wie ich korrekt formulieren müsste.
könnten das wechseln der werte mit 'schwingungen' im gleichstrom zu tun haben? seit ein paar tagen taste ich mich an die bedienung eines oszilloskops (dso) ran. beim messen der spannung habe ich sowas ähnliches wie eine sinuskurve gesehen. daher die vermutung..=_0
$prog , 255 , &B11011001 , 'Quarz an / Teiler aus / Jtag aus
$regfile = "m2560def.dat"
$hwstack = 82 '80
$framesize = 68 '64
$swstack = 68 '44
$crystal = 16000000
'led (onboard)
Config Pind.5 = Output
'usb
Config Pine.5 = Input
Usb Alias Pine.5
Config Com4 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "com4:" For Binary As #4
'lcd
Config Lcd = 24 * 2
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.6 , Rs = Porta.4
'adc
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim W As Word
Dim Scale As Single
Dim Ref As Single
Dim Tmp As Single
Dim Grad As Single
Dim Tmp_long_1 As Long
Dim Tmp_long_2 As Long
Dim Degr As Integer
Dim I As Integer
Dim A As Integer
Dim Zeropos As Single
Dim Zeropos_long As Long
Dim Average As Long
Scale = 100000000
Ref = 5 * Scale
Ref = Ref / 1024
Zeropos = 2.5 * Scale
Zeropos_long = Zeropos
Average = 10
Degr = 60
Cursor Off
Initlcd
Wait 1
''''''
'main
''''''
For A = 1 To 3 Step 1
'mittelung
Tmp_long_2 = 0
Print #4 , ""
Print #4 , ""
Print #4 , "- schleife auf getadc()"
Print #4 , "- " ; Average ; " durchläufe alle 5ms"
For I = 1 To Average Step 1
W = Getadc(0)
Tmp = W * Ref
Tmp_long_1 = Tmp
Tmp_long_1 = Tmp_long_1 - Zeropos_long
Print # 4 , Tmp_long_1
Tmp_long_2 = Tmp_long_2 + Tmp_long_1
Waitms 5
Next I
'durchschnitt
Tmp_long_1 = Tmp_long_2 / Average
Print #4 , "---------"
Print #4 , Tmp_long_1 ; " <- errechneter durchschnitt"
'winkel
Tmp_long_2 = Tmp_long_1 * Degr
Grad = Tmp_long_2 / 5000000000
Cls
Waitms 10
Locate 1 , 1
Lcd "winkel ---> " ; Fusing(grad , "#.&##")
Print #4 , Fusing(grad , "#.&##") ; " <- winkel"
Next A
End
und hier die werte aus dem terminalfenster
- schleife auf getadc()
- 10 durchläufe mit 5ms pause
-3906256
-4394544
-4394544
-3906256
-3906256
-4394544
-3906256
-4394544
-3906256
-3906256
---------
-4101571 <- errechneter durchschnitt
-0.049 <- winkel
- schleife auf getadc()
- 10 durchläufe mit 5ms pause
-3906256
-3906256
-4394544
-3906256
-3906256
-3906256
-4394544
-3906256
-4394544
-3906256
---------
-4052742 <- errechneter durchschnitt
-0.048 <- winkel
vielen dank für jeden tip.
ciao, edgar