Archiv verlassen und diese Seite im Standarddesign anzeigen : Analog Eingang einlesen
Hey Leute,
ich versuche gerade einen Analog Eingang einzulesen.
Sinn -> ich will ein Poti als Regler verwenden um z.b. ein Wert (sekunden) "hochdrehen" zu können.
Ich will dazu ein Poti verwenden (50k).
Außen VCC & GND und Schleifer ist an PA7.
leider bekomme ich immer nur eine 0 ausgegeben!
Am Schleifer liegen ca 2 V an.
Was mach ich vllt falsch?
$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Cls
Config Adc = Single , Prescaler = Auto
Start Adc
Dim W As Word , Channel As Byte
Channel = 7
Do
W = Getadc(channel)
Locate 1 , 1
Lcd "ADC-Pin " ; Channel ;
Locate 2 , 1
Lcd "Wert: " ; W
Waitms 500
Cls
Loop
End
Lcd usw geht alles, nur steht halt immer ne 0 da!
Mfg Lenox ;)
Ich glaube du hast die Referenz vergessen
REFERENCE
Value may be OFF , AVCC or INTERNAL. See the data sheets for the different modes.
d.h.
Die Zeile müsste bei dir heissen
Config Adc = Single , Prescaler = Auto , Reference = AVCC
MfG Matthias
habs hinzugefügt, geht leider auch nicht
jawohl ich habs, AREF hatte keinen richtigen Kontakt, funktioniert jetzt, aber der Wert schwankt leider stark ca (166-185).
166-185 das sind kein 2 %
Wie genau ist Deine Referenz ?
1 % ist 'normal' an wackeln ohne Mittelwertbildung,schwer abhängig vom Prescaler und Auto finde ich da eher die schlechte Wahl.
Gento
Stargate
28.12.2006, 12:17
Hallo Leute, habe fast das gleiche Problem...
Bei mir wird jedoch immer 255 Angezeigt. Außerdem habe ich das Prinzip noch nicht ganz verstanden. Vielleicht könnt ihr mir da weiterhelfen
Also ich habe einen Sensor, der wie ein Poti agiert, d.h. er liefert mir 0 - 5 V ausgangsspannung am port. versort wird er mit 5 V (is ja klar).
So, nun habe ich in vielen Datenblättern nachgelesen, das die interne Referenzspannung bei 2,56 V (oder 2,54 V) liegt, und dass man nicht höher an dem Port gehen darf, sonst schießt man ihn ab...
Ob das stimt weiß ich allerdings nicht. Außerdem, ich verwende einen Mega 168.
So, nun weiter in der Problematik... Wo, wenn ich jetzt die interne Referenzspannung nicht nehme, müsste ich die externe dranhängen. Wozu sollte man einen Prescaler verwenden?
Ich möchte mit diesem Sensor Winkel messen. Und dafür brauche ich volle 360°. Da ich aber anscheinend nur eine Auflösung von 256 Bit habe ist das doch extremst schlecht... Da ist doch dann 1 Bit 1,4° groß und das ist sehr ungenau...
Oder hab ich da schon wieder ein Denkfehler drin?, könnte man die Auflösung größer machen?
So, ich hoffe ich hab euch nich allzu arg verwirrt...
Ich bin irgendwie verzweifelt, ich hoffe mir kann jemand mit meinem Problem weiter helfen, denn alle Anleitungen, Bücher oder auch das RN-Wissen helfen mir nicht weiter
Gruß Felix
So, nun habe ich in vielen Datenblättern nachgelesen, das die interne Referenzspannung bei 2,56 V (oder 2,54 V) liegt, und dass man nicht höher an dem Port gehen darf, sonst schießt man ihn ab...
Ob das stimt weiß ich allerdings nicht. Außerdem, ich verwende einen Mega 168.
Die ATMegas halten eine Eingangspannung von max. 5Volt aus. Wenn du eine Referenzspannung von 2,54Volt hast, ist alles größer 2,54Volt 256.
So, nun weiter in der Problematik... Wo, wenn ich jetzt die interne Referenzspannung nicht nehme, müsste ich die externe dranhängen.
Stimmt.
Wozu sollte man einen Prescaler verwenden?
Das habe ich auch noch nicht verstanden O:)
Ich möchte mit diesem Sensor Winkel messen. Und dafür brauche ich volle 360°. Da ich aber anscheinend nur eine Auflösung von 256 Bit habe ist das doch extremst schlecht... Da ist doch dann 1 Bit 1,4° groß und das ist sehr ungenau...
Oder hab ich da schon wieder ein Denkfehler drin?, könnte man die Auflösung größer machen?
Ich weiß nicht was für eine Auflösung der ATMega168 hat, aber wenn es nur 256 ist, dann kriegst du es auch nicht genauer.
jon
P.S.:Kannst du mal die Spannung messen, bei der er 255 ausgiebt und dann hier dein Ergebnis reinstellen?
Stargate
28.12.2006, 12:46
Also bis jetzt ist der Port offen. Ich verwende den Pin PC2 (ADC 2).
Ich bin grad eben dabei mal Spannungen durchzuprobieren, melde mich gleich (sofort) wieder. Danke schonmal für die schnelle Antwort
Gruß Felix
Stargate
28.12.2006, 12:53
Also, ich habe mal schnell mit einem Poti an dem Eingang Werte erzeugt... Tut sich GAR NIX. Hab hier mal den Code
$regfile = "m168def.dat"
$crystal = 16000000 'Quarzfrequenz
$baud = 9600
'$hwstack = 32
'$framesize = 32
'$swstack = 32
'Die üblichen Definitionen bei Standardprogrammen auf Miniboard
Dim Sensor As Byte
'Config Pinc.2 = Input 'ADC 2 an Ctrl
'Set Portc.2
Config Adc = Single , Prescaler = Auto
Start Adc
'Prescaler = Auto
'Reference = Off
Do
Sensor = Getadc(2)
'Locate 2,8
'Lcd Sensor
Print "Sensor " ; Sensor
Wait 2
Loop
End
Wärenddessen schau ich mir schnell mal den Sensor an, den hab ich auch noch nicht aktiviert ^^
Bitte nicht an so manchen Codezeilen stören. Manche hab ich mit einem ' außer gefecht gesetzt.
Also bis gleich
linux_80
28.12.2006, 13:23
Hallo,
der ADC eines AVR hat aber 10 Bit, das ergibt Werte von 0 bis 1023.
Wenn Du als Referenz nicht intern sondern AVCC angibst, sind das wieder 5V und das sollte doch auch passen.
Wenn man bei Referenz intern oder AVCC angibt, sollte beim Pin AREF aussen ein Kondensator angeschlossen sein.
Den Prescaler braucht man um den Takt des ADC auf unter 200kHz zu bekommen, denn der Takt wird von der CPU-Frequenz abgeleitet, das macht Bascom aber für einen wenn man Auto angibt.
Edit:
beim M168 ist die interne Referenzspannung 1,1V nicht 2,5V !
Naja ich poste jetzt mal einfach meinen Kram, das programm geht vollkommen. Vllt kannst du ja was finden was du vergessen hast (steh grad leider unter Zeitdruck und kann es daher nicht alles raussuchen).
Ist übrigens mein 1. Porgramm *fg*
$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Cls
Cursor Off
Dim U As Word
Dim I As Integer
Dim Teiler As Integer
Dim W As Integer
Teiler = 20 'Umrechnung A/D Wert
W = 1 'Abbruch Bedingung Eingabe
Config Adc = Single , Prescaler = Auto
Start Adc
Config Pina.0 = Input 'AD
Config Pinc.6 = Output 'LED
Config Pinc.7 = Input 'S1
Portc.7 = 1
'Start
Locate 1 , 1
Lcd "<<<<uC Timer>>>>"
Locate 2 , 1
Lcd "by Stefan Reible"
Wait 2
Cls
Locate 1 , 1
Do
Lcd "Loading"
Lcd " ."
Waitms 200
Lcd "."
Waitms 200
Lcd "."
Waitms 200
Incr I
Cls
Loop Until I = 3
'Eingabe Timer
I = 0
Do
Locate 1 , 1
Lcd "Timer setzen: "
U = Getadc(0)
I = U / Teiler
Locate 2 , 1
Lcd "Sek: " ; I ;
Locate 2 , 14
Lcd "OK?"
Waitms 200
Loop Until Pinc.7 = 0
'Go
Cls
U = I
I = 0
W = 0
Locate 1 , 1
Lcd "Timer = " ; U ; " Sek" ;
Locate 2 , 11
Lcd "Start?"
Wait 1
Do
If Pinc.7 = 0 Then
Do
Cls
Locate 1 , 1
Lcd U ; " Sekunden";
U = U - 1
Wait 1
Loop Until U = 0
W = 1
End If
Loop Until W = 1
Cls
Locate 1 , 1
Lcd "Fertig!"
Locate 2 , 1
Lcd "LED = AN"
Portc.6 = 1 'LED an
End 'end program
Mfg
Lenox
Fehlt da nicht wieder
Reference = AVCC
oder ähnliches??
jon
wenn ich es hinzufüge geht es nicht mehr.
Vcc muss nur halt an AREF angeschlossen sein.
linux_80
28.12.2006, 17:32
Ihr müsst halt wissen wie Ihr es haben wollt,
entweder schliesst man Vcc an AREF an, dann muss man es aber auch so dem AVR sagen,
oder man nimmt etwas internes her, oder AVCC, dann muss aussen ein Kondensator an AREF dran, damit das auch geht.
Ein Kondensator sollte aber trotzdem immer am AREF vorkommen, damit die Spannung einigermassen stabil bleibt, denn die Messung wird nur so genau wie AVCC und AREF genau sind !
Stargate
28.12.2006, 18:01
Schon mal vielen vielen Dank für eure Hilfe. Also ich habe ja das Board RN-Minicontrol, da ist an AREF schon ein Kondensator, genauso wie an AVCC. AVCC ist zudem über einen Widerstand (oder an ein Teil mit der Bezeichnung L1 Induktivität 10uH (ich find das teil aber nirgens auf dem Board)) an 5 V angeschlossen.
Ich versuch noch herauszufinden, was das Teil L1 sein soll und wo ich es auf dem Board finden kann.bin schon die ganze Zeit am löten, dass ich den Sensor mal ausprobieren kann...
So, ich mach mal weiter, bis denne
Gruß Felix
Hmm das ist kein Widerstand sondern eine induktivität (Spule).
Wenn du VCC (5V) schon an AREF anliegen hast denke ist es ist alles oky, es geht auch ohne Kondensator (nur halt ungenauer). Denke eher es ist ein Software Problem. Ich vergleich jetzt mal deins mit meinem.
Mfg
Lenox
So, kopier mal folgendes in Bascom rein, denke so gehts ;)
$regfile = "m168def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$framesize = 32
$swstack = 32
Config Adc = Single , Prescaler = Auto
Start Adc
Config Pinc.2 = Input
Dim Sensor As Integer
Do
Sensor = Getadc(2)
Print "Sensor " ; Sensor ;
Waitms 500
Loop
End
linux_80
28.12.2006, 18:47
@Stargate
die Spule kann man beim RN-MiniCtrl fast nicht übersehen, ist relativ gross, schaut nach Widerstand aus, ist aber rosafarbig, und in der Nähe des Stromanschlusses, das L1 kann man fast nicht lesen, weil da genau ein Loch in der Platine ist,
wenn du es selber zusammengelötet hast, muss diese drin sein, sonst kommt nix am AVR an !
Ja und man sollte das angeben, wenn man AVCC als Referenz haben will !
Stargate
28.12.2006, 19:14
Danke für den Code! ich hab meinen Fehler gefunden :-)
Ich hatte die Zeile Config Pinc.2 = Input weggelassen, da ich dachte, das die Funktion Getadc (2) das schon weiß.
Es funktioniert...leider sind es wohl doch nur 256 Bit... ;-/
Bei 0V, also auf GND, zeigt er mir Sensor : 0 an und bei 5V zeigt er mir Sensor : 255 an.
Ja, ich habe mir mein Board nochmal angeschaut :-) und habedie Spule gefunden *freu* ICh hab mir zwar schon gedacht, dass das Teil nur einmal auf der Platine zu finden ist, und dass es das Teil schon sein muss, aber ich bin davo ausgegangen, dass es ein widerstand ist ;-)
Es stimmt, das L ist "durchlocht", sonst hätt ich's vielleicht auch gefunden. Hab die Platine zwar selbst zusammengelötet, aber nicht mehr drauf geachtet.
So, vielen Dank für eure Hile, ihr habt meinen Tag gerettet. Ich sitz da nämlich schon ne ganzeweile dran und es tat nie ^^
Viele Grüße Felix
;D der Fehler ist mir auch passiert, und mir hatte ein kompletter Code auch gut geholfen ;). Eigentlich ist es mit getadc ja kindereinfach, aber man vergisst schnell ne Zeile, hehe
linux_80
28.12.2006, 23:34
Wenn du nix angibst, wird die interne Referenz verwendet, deswegen kann nicht mehr als ca. 256 rauskommen !
probier einfach mal diese Zeile aus: [-o<
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Das nennt man ausserdem nicht 256 Bit, sondern 8 Bit !
Mit 8 Bit gibt es 256 möglichkeiten.
Der ADC kann aber 10 Bit was einen max. Wert von 1023 ergibt, wenn man aber nur eine Referenzspannung von 1,1V verwendet, ist das in etwa, je nach Genauigkeit, 256 bei angelegten 5V !
Wow, habs nochmal getestet jetzt gehts (muss mich voll verschrieben haben). Die Anzeige spring garnicht mehr sinnlos rum. Danke ;)
Mfg
Stefan
Stargate
31.12.2006, 11:57
Hi, so, nun melde ich mich nochmal zu Wort ;-)
Also passt auf. Mein Sensor funktioniert soweit, nurhab ich wohl noch das gleiche Problem wie Lenox, dass meine Werte Springen, und auch über 256 hinausgehen. Eigendlich hab ich ja die Zeile so angegeben, wieso er das nicht macht ist mir eigendlich unklar. Ich werde es einfach nochmal aufspielen, vielleicht hab ich was falsch gemacht.
Nun habe ich aber noch ein anderes Problem.
Ich möchte, dass mir die Gradanzahl ausgegeben wird, d.h. ich benötige eine Kleine Rechnung in meinem Code, die er jedoch als falsch erkennt.
Als Fehlermeldung bekomm ich "Source variable does not match the target variable" das bezieht sich auf die Zeile: Grad = Sensor *(360 / 1024)
Schaut es euch einfach mal an
'Erster Test des Displays Wintek 27 * 4 von Pollin
'Besondere Lernleistung von Felix König
$regfile = "m168def.dat"
$crystal = 16000000 'Quarzfrequenz
$baud = 9600
'$hwstack = 32
'$framesize = 32
'$swstack = 32
'Die üblichen Definitionen bei Standardprogrammen auf Miniboard
Config Lcd = 40 * 4 'Bascom kennt keine Display mit 27 * 4 Zeichen,
'daher 40 * 4 verwenden
Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.0 , Db6 = Portd.7 , Db7 = Portd.6 , E = Portb.3 , E2 = Portc.3 , Rs = Portd.3 , 'Rw = Portc.2
'man achte auf die Ergänzung E2
Dim ___lcdno As Byte ' Systemvariable der LCD-Bibliothek
___lcdno = 0 ' wählt den ersten Chip aus
Initlcd 'die beiden oberen Zeilen initialisieren
Cls 'die beiden oberen Zeilen löschen
___lcdno = 1 'auf Chip 2 schalten
Initlcd 'die beiden unteren Zeilen initialisieren
Cls 'die beiden unteren Zeilen löschen
___lcdno = 0 ' wählt die obere Zeile aus
Locate 1 , 1 ' schreibt in die erste Zeile an Position 1
Lcd " Besondere Lernleistung "; ' den Text in Anführungszeichen
Locate 2 , 1 ' schreibt in die zweite Zeile an Position 1
Lcd " von Felix Koenig 13 BGD"
Cursor Off ' unterdrückt den Cursor
___lcdno = 1 ' wählt die beiden unteren Zeilen aus
Locate 1 , 1
Lcd "Windrichtung : ";
Locate 2 , 1
Lcd "Grad : "
Cursor Off ' unterdrückt den Cursor
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Konfiguriert den AD Wandler
Start Adc 'Startet den AD Wandler
Config Pinc.2 = Input 'ADC 2 an Ctrl
Dim Sensor As Byte 'Deklariert "Sensor" als Byte
Dim Grad As Byte 'Deklariert die Gradvariable "Grad" als Byte
Do ' Beginnt die Abfrageschleife zur Werteerfassung
Sensor = Getadc(2) ' Der AD Wert wird am Pin C2 abgelesen und in die Veriable "Sensor" geschrieben
Grad = Sensor *(360 / 1024)
'Print "Sensor " ; Sensor
___lcdno = 1 'wählt die unteren 2 Zeilen aus
If Grad = 0 Then '
Locate 2 , 8
Lcd "0° / 360°"
Else
Locate 2 , 8
Lcd Grad ; "°"
End If
Waitms 500 '500 ms Wartezeit zwischen der Abfragewiederholung
Loop 'Ende der Abfrageschleife, Sprung zum Anfang der Schleife
End 'Programmende
Vieleicht könnt ihr mir ja noch so einen wunderbaren und hilfreichen tipp geben.
Viele Grüße Felix
linux_80
31.12.2006, 13:42
Hi,
schau ma mal,
als erstes würde ich meinen, das Grad als Byte nicht ganz ausreichend dimensioniert ist, weil das dann nur 0 bis 255 geht !
Sensor ist auch nur ein Byte, beim ADC kommt aber ein Word raus, deswegen gehen deine Werte wohl nur bis 255 :-k
Ja, und Basom kann immer nur eine Aufgabe pro Zeile durchführen, Du musst die Formel aufteilen.
Jo, seh ich auch so, machs am besten so:
Dim Sensor As Integer
Dim Grad As Integer
Das mit der einen Aufgabe pro zeile wusste ich auch noch nicht!
Stargate
31.12.2006, 14:17
Danke! Hat mir gut weitergeholfen :-) Jedoch springen die Werte immernoch sehr verrückt umher und halten sich nicht auf einem Niveau. Ich muss mal versuchen diese Sprünge mit einem Kondensator in den Griff zu bekommen.... Ich meld mich bald wieder
Gruß und guten Rutsch
Kannst du mal die Spannung messen, die beim Sensor raus kommt?
Wenn die ungenau ist, also schwankt, dann kanst du nur versuchen das über einen Kondensator zu lösen (würde ich als etwas unpraktisch bezeichnen). Wenn die Ausgangsspannung des Sensors nicht schwankt musst du mal schauen, ob AVCC stabil ist.
jon
Stargate
03.01.2007, 12:54
So, also ich hab mal die Spannung meines Netzteils überprüft.
Das Computernetzteil ist soweit stabil. Ich vermute eher, dass das Signal des Senors schwankt. Leider sind diese Schwankungen mit bloßem Auge wohl nicht erkennbar, sonst hätte ich sie ja an der LED die Zwischengeschalten ist, gesehen. Ich werde demnächst mal mit einem Oszilloskop nachmessen. Ich erhoffe mir dass ich was finde ;-)
So, also ich melde mich später mit Oszilloskop wieder :-)
Gruß Felix
Lasse mal die LED raus.
Solche LEDs haben bei mir auch schon für Probleme gesorgt.
jon
Stargate
03.01.2007, 15:46
Also ich denke nicht, dass eine LED so Schwankungen erzeugt.
Ich meine die LED's an dem Adapterboard. Ich habe sie mal ausgeschalten, aber da hat sich nichts verändert.
Wie gesagt, entweder verrät mir das Oszilloskop mehr, oder ich versuch dann nochmal einen anderen AD-Port
Gruß
Stargate
26.01.2007, 22:03
Hi Leute, ich melde mich mal wieder zu Wort!
Also, ich habe das Problem mit dem Sensor lösen können :-)
Ich habe die falschen Sensorwerte mittels einem 100nF Kondensator zwischen Output und GND und einem 10kOhm widerstadn beheben können. Die Kurve ist jetzt optimal, und er liefert mir eine glatte Spannung von 0,4 bis 4,9 Volt.
Ich konnte mithilfe des Oszilloskops feststellen, dass der Sensor sind gleichförmige Sinusspannung ausgegeben hat. die hab ich dann einfach noch mit dem Kondensator geglättet.(Stand ja eigendlich auch so im Datenblatt drin *gg*)
Also, wer sich mal das Datenblatt des Sensors anschauen möchte schaut mal unter www.melexis.com unter MLX 90316 nach.
Viele Grüße Felix
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.