PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Analog Eingang einlesen



Lenox
27.12.2006, 23:26
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 ;)

Stone
27.12.2006, 23:41
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

Lenox
27.12.2006, 23:52
habs hinzugefügt, geht leider auch nicht

Lenox
28.12.2006, 00:31
jawohl ich habs, AREF hatte keinen richtigen Kontakt, funktioniert jetzt, aber der Wert schwankt leider stark ca (166-185).

Gento
28.12.2006, 00:48
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

Jon
28.12.2006, 12:33
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 !

Lenox
28.12.2006, 13:48
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

Jon
28.12.2006, 13:52
Fehlt da nicht wieder
Reference = AVCC
oder ähnliches??

jon

Lenox
28.12.2006, 15:11
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

Lenox
28.12.2006, 18:06
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

Lenox
28.12.2006, 18:11
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

Lenox
28.12.2006, 19:18
;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 !

Lenox
29.12.2006, 01:19
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.

Lenox
31.12.2006, 14:04
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

Jon
31.12.2006, 14:24
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

Jon
03.01.2007, 13:03
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