Hi,
möchte gerne ein analoges Signal mit einem AVR digitalisieren. Nur weiß
ich leider nicht wie ich das genau machen muß? Soweit ich das verstanden
habe, schließe ich das Signal an den Port PA0 (ADC0) meines ATmega8535,
AVCC auf VCC und AREF auf eine Referenzspannung. Wie hoch sollte diese
den sein? Sollte doch so groß sein, wie die größte zu messende Spannung
oder größer.
Wie kann ich jetzt in Asembler meine digitalisierten Werte verwenden?
Wie heißen die Register wo der Wert gespeichert ist. Mit welchen
Registern steuer ich den AD Wandler? Z.B. wie stelle ich den ein das er
die interne AREF oder eine externe verwendet? Kennt jemand vielleicht
ein paar Codebeispiele? Am liebsten wäre mir in Asembler. Habe schon im
Datenblatt nachgelesen aber werde da irgendie nicht schlau draus. Vielen
Dank
Gruß Bernd
Einen Codeschnipsel habe ich gerade nicht zur Hand, aber der A/D-Wandler
muß über das entsprechende Konfigurationsregister zunächst eingeschaltet
werden, und dann kann man eine einzelne oder kontinuierliche Umsetzung
starten. Die Ergebnnisse werden aus zwei zusammengehörigen 8-bit
Registern (Low und High-Byte) ausgelesen. Es gibt natürlich auch ein
Statusbit, bzw. einen Interrupt, wenn der A/D-Wandler mit einer
Umsetzung fertig ist.
Signal an PA0 ist richtig. VCC an AVCC ist richtig, wenn die
Digtal-Versorgung sauber ist. Ansonsten LC-Filter dazwischen. ARef kann
5V (Betriebsspannung), 2.55V (interne Referenz, dann Pin unbeschaltet
lassen, muß in entsprechendem Register konfiguriert werden) oder eine
externe Spannung nach Wahl sein, die dem obersten möglichen Meßwert des
ADC entspricht.
Ich könnte vielleicht noch ein Codebeispiel in C auftreiben... falls ich
es noch finde. Ist aber für einen mega32. Der mega8535 sollte aber
ähnlich sein.
Vielen Dank erstmal.
Habe mittlerweile folgende Register aus dem Datenblatt lesen können:
ADSCRA was aus folgenden Bits besteht:
7 6 5 4 3 2 1 0
ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
ADEN 1 -> AD Wandler ist an 0 -> AD Wandler ist aus
ADSC 1 -> Startet die AD Wandlung und setzt danach auf 0
ADATE ???
ADIF 1 -> AD Wandlung ist fertig
ADIE 1 -> ADC Interrupt ist aktiv
ADPS2-0 - Teilungsfatkor einstellen für ???
SFIOR besteht aus:
8 7 6 5 4 3 2 1
ADTS2 ADTS1 ADTS0 - ACME PUD PSR2 PSR10
ADTS0-2 - Einstellen von Free Runing mode, ???, ???, ...
ACME ???
PUD ???
PSR2 ???
PSR10 ???
ADCL und ADCH speichert den Digitalen Wert des Signals
Hi,
so jetzt hab ich noch ein Problem. Habe jetzt den Wert im Register
stehen. Nur wie kann ich mit diesem Rechnen. Der Wert im Register soll
eine Dezimalzahl darstellen die dann mit einer Konstanten (mit 4
Nachkommastellen) multipliziert wird und dann noch eine 2 Konstante
abgezogen wird. Anschließend möchte ich den so erhaltenen Wert so
umwandeln das ich ihn über ein lcd ausgeben kann. Also in Ascii
codierung. Wie mach ich das? Hat da vielleicht schon jemand bischen Code
wo man sich das anschauen kann. Bitte in Assembler.
Gruß Bernd
zuerst befindet sich in den Regitsern nur der Zählerwert den der A/D
brauchte um die angelegt Spannung mit der Referenzspannung zu
vergleichen.
Also nimm den Wert un errechne daraus die Spannung.
Zählerwert * ( Ref. Spannung / Auflösung )
Dann kannst du Deine Konstanten ins Spiel bringen.
Ich würde ganzzahlig arbeiten weil einfacher und schneller.
Dann muß alles in ASCI gewandelt werden. Und schon ist es geschafft.
Beispiele dafür gibts hier wohl reichlich. ( Suchfunktion )
> ARef kann 5V (Betriebsspannung)...
Bitte nicht! Das ist ein Fehler, der bei vielen Leuten, die noch mit den
alten AVRs (AT90S-Serie) gearbeitet haben, immer noch in den Köpfen
feststeckt. Die aktuellen AVRs (Mega, Tiny usw.) besitzen allesamt
intern die Möglichkeit, die Betriebsspannung AVCC als Referenz
einzustellen. An den AREF-Pin gehört in den meisten Fällen lediglich ein
kleiner Kondensator (s. Datenblatt) und sonst nix. Einzige Ausnahme:
Wenn eine Referenzspannung verwendet werden soll, die nicht intern vom
µC zur Verfügung gestellt werden kann, dann ist diese an AREF
anzuschließen.
@johnny.m
Jein! Ich weiss zwar was du meinst, aber AREF kann 5 Volt
(spitzfindigkeit). Du meinst, das bei den aktuellen AVR´s AVCC oder die
internen 2,56 Volt an den A/D-Wandler gelegt werden können, die damit
auch an AREF liegen. In diesem Fall liegt am AREF-Pin halt nur ein
Kondensator.Aber, wenn man die internen Referenzen abschaltet, kann man
auch eine externe (präzisions-) Referenz von 5 Volt anlegen.Ich find es
aber sehr gut, dass du darauf aufmerksam gemacht hast. Die Leute sollten
erst mal ins Datenblatt sehen.
@Jörn:
Es geht mir um die Aussage 5V *(Betriebsspannung)*! Und die (AVCC) kann
intern als Referenz ausgewählt werden und sollte deshalb nicht extern an
AREF angelegt werden. Eine 5V-Präzisionsreferenz ist etwas völlig
anderes, da diese nunmal nicht der Versorgungsspannung entspricht.
Deshalb kein "Jein", sondern ein klares "Nein"! Die Präzisionsreferenz
fällt unter "Ausnahmen" (siehe letzten Satz in meinem ersten Posting).
Eine Sache habe ich allerdings vergessen, zu erwähnen: Wenn man die
interne Referenzspannung auch extern benötigt, dann kann man sie am
AREF-Pin abgreifen.
Gruß
Johnny
>Wenn man die>interne Referenzspannung auch extern benötigt, dann kann man sie am>AREF-Pin abgreifen.
Die sollte man aber hochohmig auskoppeln...(OP dahinter hängen)
Vielen Dank nochmal für eure Antworten. Habe es jetzt mittlerweile so
hinbekommen wie gewollt. Habs nur in C umgesetzt. Naja werde bei
Gelegenheit mal mein Digitalskript suchen und vielleicht nochmal alles
in asm schreiben.
Gruß Bernd
>vielleicht nochmal alles in asm schreiben.
Und was soll das bringen? Wesentlich schneller wird das auch nur, wenn
man wirklich jedes Bit zwei mal umdreht...