Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC problem
Robin1508
17.11.2007, 15:05
Hi, ich hab vor kurzem mein RN-Control Board (V1.4) bekommen und möchte nach ein paar LED tests einen LDR mittels ADC auswerten.
Doch auch mit der Suche und der RN-Wissensdatenbank bin ich nicht weitergekommen.
Meine Schaltung sieht folgendermaßen aus. Den LDR hab ich an einen der 3 VCC pins (JP1 Leiste) und an den 1. Stecker von Port 1 angeschlossen. (Ich hoffe soweit richtig)
Jetzt mein Source, der nicht funktioniert.
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Output
Config Portc.3 = Output
Config Portc.4 = Output
Config Portc.5 = Output
Config Portc.6 = Output
Config Portc.7 = Output
Config Porta = Input
Config Adc = Single , Prescaler = Auto
Dim W As Word , Ch As Long
Dim Port As Long
Tccr1b = Tccr1b Or &H02
Do
Start Adc
W = Getadc(ch)
If W > 50 Then
Portc.0 = 0
End If
If W > 200 Then
Portc.1 = 0
End If
If W > 400 Then
Portc.2 = 0
End If
If W < 50 Then
Portc.7 = 0
End If
Ch = Ch + 1
If Ch > 7 Then
Ch = 0
End If
Waitms 100
Loop
End
Gruß Robin
----Den "Start Adc" macht man üblicherweise VOR dem "Do", also nur einmal.
----Die Analog-Pins solltest du auf "Input" konfigurieren
----Einzelne Pins konfiguriert man mir "PINx.N", das ist gewöhnungsbedürtfig
CONFIG PORTc = OUTPUT ' ALLE Pins von 0-7
CONFIG PINc.3 = OUTPUT ' Nur Pin 3
--- du setzt deine Pins immer nur auf 0, niemals auf 1. Da wird nicht viel zu sehen sein.
--- Wenn du nur einen LDR angeschlossen hast, reicht GETADC(0)
--- Für Ch reicht "AS Byte"
--- Der LDR muß einen Spannungsteiler bilden, VCC nach analog-Pin ist zuwenig.
--- *schnauf*
Robin1508
17.11.2007, 16:22
Danke schonmal für deine Antwort.
Ich hab mein Code jetzt aktualisiert. Ich hoffe soweit richtig =P~
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
Config Portc = Output
Config Porta = Input
Config Adc = Single , Prescaler = Auto
Dim W As Word
Tccr1b = Tccr1b Or &H02
Start Adc
Do
W = Getadc(0)
If W > 50 Then
Portc.0 = 0
End If
If W > 200 Then
Portc.1 = 0
End If
If W > 400 Then
Portc.2 = 0
End If
If W < 50 Then
Portc.7 = 0
End If
Waitms 100
Loop
End
Beim Spannungsteiler bin ich mir auch nich nicht sicher. Ich habs ausgerechnet, wenn auf den LDR sehr helles Licht fällt und er 500 Ohm Widerstand hat, dann ergibt sich durch den Spannungsteiler 1,66 Volt, wenn er stark abgedunkelt wird und >200k hat, liegen eben >4,9 Volt an.
Ist das richtig soweit ?
http://images.mpg-esports.eu/bild/175/spannungsteilerjpgMQ2KM.jpg
Nun gut. Ich nehm an, daß du je nach Spannung verschieden viele LED leuchten sollen.
Also mußt du vor jeder Messung erstmal zurücksetzen:
Do
Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.7 = 1
W = Getadc(0)
If W > 50 Then
Portc.0 = 0
End If
If W > 200 Then
Portc.1 = 0
End If
If W > 400 Then
Portc.2 = 0
End If
If W < 50 Then
Portc.7 = 0
End If
Loop
Den "waitms" brauchst du nicht, der nutzt nix
Zu geeigneten Werten mußt du dich hintasten
Hallo Robin1508,
Beim Spannungsteiler bin ich mir auch nich nicht sicher. Ich habs ausgerechnet, wenn auf den LDR sehr helles Licht fällt und er 500 Ohm Widerstand hat, dann ergibt sich durch den Spannungsteiler 1,66 Volt, wenn er stark abgedunkelt wird und >200k hat, liegen eben >4,9 Volt an.
Ist das richtig soweit ?
Bei mir hat sich dies bewährt:
Ein Spannungsteiler 220 kOhm / 4,7 kOhm zwischen 5V und Masse.
Der LDR wird parallel zum 220 kOhm-Widerstand angeklemmt.
Der ADC-Eingang (AD-Wandler) des AVR wird an den Abgriff (zwischen 220k und 4,7k) angeschlossen.
Diese Schaltung liefert ca. 0,1 bis 4,9 V je nach LDR-Typ und Umgebungshelligkeit, hat also eine gute Spreizung.
Gruß Dirk
Robin1508
18.11.2007, 13:46
Alles klar, ich hab jetzt an meinem Code noch n bissl rumgebastelt und alles erneut verkabelt (um Wackelkontakte auszuschließen) und siehe da, es funktioniert. O:)
Hier ist mein Code.
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
Config Portc = Output
Config Porta = Input
Config Adc = Single , Prescaler = Auto
Dim W As Long
Start Adc
Do
W = Getadc(7)
If W > 50 Then
Portc.1 = 0
Else
Portc.1 = 1
End If
If W > 100 Then
Portc.2 = 0
Else
Portc.2 = 1
End If
If W > 200 Then
Portc.3 = 0
Else
Portc.3 = 1
End If
If W > 400 Then
Portc.4 = 0
Else
Portc.4 = 1
End If
If W > 600 Then
Portc.5 = 0
Else
Portc.5 = 1
End If
If W > 700 Then
Portc.6 = 0
Else
Portc.6 = 1
End If
If W > 800 Then
Portc.7 = 0
Else
Portc.7 = 1
End If
If W < 50 Then
Portc.0 = 0
Else
Portc.0 = 1
End If
Loop
End
Nur könnte mir jemand sagen was diese Zeile bewirkt?
Tccr1b = Tccr1b Or &H02
Ich hatte sie Anfangs in meinem Code, weil ich irgentwo mitbekommen habe dass diese Zeile rein muss. Doch er funktioniert mit oder ohne genau gleich.
Gruß
linux_80
18.11.2007, 15:40
Hallo,
diese Zeile ist nur wenn man ein ältere Bascom-Version mit Timer1 und PWM verwendet, da brauchte man das wohl :-k
Wenn kein Timer1 im Einsatz ist, machts auch keinen Unterschied ;-)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.