Forum: Mikrocontroller und Digitale Elektronik ATtiny26 AD Wandler


von Jens (Gast)


Lesenswert?

Hallo Leute,
also ich möchte gerne den AD Wandler im ATtiny26 nutzen und dazu habe
ich schon ins Datenblatt geschaut, aber wirklich durchsichtig ist das
für mich noch nicht geworden ...
Hat mir jemand einen Code-Fetzen mit dessen Hilfe es klarer werden
könnte, ich wäre auch niemandem böse wenn er es mir verbal erklären
würde.
Besten Dank

von harry (Gast)


Lesenswert?

hi,

in bascom wäre das sehr simpel:

config adc = ... (diverse parameter möglich)
dim x as word    (16-bit variable)

do
   x = getadc(0)
   lcd "wert ";x (ausgabe auf's display)
   wait 1        (damit man auch lesen kann, sonst flackert's nur)
loop

feddich, das war's, nu haste alle sekunde den aktuellen wert auf'm
display
gruss, harry

von Jens123 (Gast)


Lesenswert?

Hier ein kleiner schnipsel vom Mega16 sollte bei einer MC Uetwa gleich
sein..


//AD Wandler einschalten und Vorteiler setzen
ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS0);

ADMUX |= (1 << MUX0);         // AD Kanal auswaehlen
ADCSRA |= _BV(ADSC);          // ad wandlung starten
while ( ADCSRA & _BV(ADSC) ); // warten bis ad wandlung fertig ist
int_temp = ADCW;              // AD Wert kopieren

spannung = int_temp / 204.6;
dtostrf(spannung,7,7,buffer);
uart_puts(buffer);

Viel glueck =)

von Sebastian (Gast)


Lesenswert?

Zu dem Thema interessiert mich auch mal was...
aus irgendeinem Grund hatte ich immer "störungen" beim messen... also
die messwerte varrierten immer +-0,1 V. Ich glaube bei meiner ganzen
schaltung trat das phänomen auf. Wie bekomme ich das ganz
stabilisiert?

0,1 V sind z.B. bei Thermometer/Distanzmessung nicht gerade zu
vernachlässigen

von harry (Gast)


Lesenswert?

hi,
könnte folgenden grund haben: in vielen applikationen wird eine
spannung per adc so gemessen:

1. adc konfigurieren
2. adc starten
3. adc auslesen
4. adc stoppen

wenn nun wie im datenblatt empfohlen ein kondensator am aref-pin hängt,
un die referenz zusätzlich zu beruhigen passiert folgendes:

adc starten - die aref lädt den kondensator, aber nur mit max 3 ma
d.h. es dauert einen moment bis die aref wirklich ihren endwert
erreicht hat.
also müsste zwischen punkt 2 und 3 noch ein wait eingebaut werden, so
hab ich messungen wesentlich stabiler hingekriegt. oder am anfang des
progs adc starten und nie mehr abschalten.
gruss, harry

von Sebastian (Gast)


Lesenswert?

Ich hab das ganze wie du beschrieben hast... adc läuft im freerun modus.
die "spannugs-unstabilität" beginnt schon bei vcc... also ich verwende
den 7805. am anfangdachte ich es liet an meinem billig messgerät, aber
genau diese ungenauigkeit spiegelte sich auch in den messungen vom avr
wieder... das rum-einern von vcc hab ich auch im unbelasteten zustand.
meine schaltung ist 12V --> 100 pf (folie/keramit) --> 100 nf (elko)
--> 7805 --> 100 nf (elko) --> 100 pf (folie/keramit) --> VCC
oder müssen die kondensatoren größer sein??

von ...HanneS... (Gast)


Lesenswert?

Die KerKos sollten 100nF sein. Und zwar vor dem 7805, dahinter und auch
direkt am MC. Dazu ein größerer Eklo (100µF oder mehr) vor dem 7805 und
nur ein kleiner Elko (<22µF) hinter dem 7805. Die Kerkos sollten
möglichst dicht an die 7805-Pins.
Aber auch durch ungünstig angeordnete Versorgungsleitungen (GND, +5V)
kann man die Stabilität negativ beeinflussen.

...

von Dirk (Gast)


Lesenswert?

Hi,

im Appnote befindet sich auch eine Spule zwischen AVCC , vielleicht
hilft das weiter.

Ich hab nun einige AD Wandler Projekte hinter mir (µC:Mega8). Meistens
waren Stoerungen auf der AVCC Leitung. Mess doch am besten mal deine
VCC + AVCC Leitung mit einem Oszi. .

Mfg
Dirk

von Jens (Gast)


Lesenswert?

also in Bascom is das ja so einfach daß ich es auch verstehe, nur das
wußte ich irgendwie auch schon vorher, der C-Fetzen ... Bahnhof und
Abfahrt, weil isch kann gar keine C :-)
Aber nicht so schlimm, weil:
1. adc konfigurieren
2. adc starten
3. adc auslesen
4. adc stoppen
hab ich verstanden.
Nur eine Frage hab ich irgendwie immernoch, ich stelle ein, daß er nur
eine Wandlung vornehmen soll, dann macht er das und fertig ist gibts n
Interrupt-Flag, ja und was mache ich dann damit?

Ich würde instinktiv 1. und 2. ausführen und dann solange stehen
bleiben, weil der µC eh sonst nix zu tun hat und warten bis das Flag
kommt und die Wandlung fertig ist und dann 3. und 4. ausführen, wobei
bei einer Single-Wandlung is stoppen ja hinfällig oder?

von ...HanneS... (Gast)


Lesenswert?

Wenn du nur eine Messung willst, dann setzt du das ADFR-Bit (Free-Run)
nicht mit, wenn du ADEN (Enable) und ADSC (Start Conversion) setzt,
dafür das ADIE-Bit um den Int freizugeben. Richtig Sinn macht das aber
erst, wenn du den AVR während der Messung im Rauschunterdrückungsmodus
schlafen schickst.
In der ISR zum ADC liest du dann die Werte aus. Brauchst du eine neue
Messung, so muss ADSC auch neu gesetzt werden.

Wenn ich nur 8 Bit Auflösung nutze (was meist der Fall ist), dann lasse
ich den ADC im Hintergrund vor sich hin klappern und lese ihn dann aus,
wenn ich die Daten brauche. Dies ist dann meist in einem Timer-Int oder
in einem Programmteil, das durch ein Flag vom Timer-Int aktiviert wird.


Müssen mehrere Quellen gemessen werden, so stelle ich sofort nach dem
Auslesen die neue Quelle ein. Das macht sich gut im Timer-Int. Ein
Pointer merkt sich welche Quelle aktiv ist und zeigt gleichzeitig auf
Register oder SRAM, wo das Ergebnis abgelegt werden soll.
Bei Registerknappheit kann man die Quelle auch temporär aus ADMUX
lesen, die Zieladresse daraus bilden (Pointer) den Wert auslesen und
wegspeichern, die Quelle hochzählen (oder runter) und neu setzen. So
werden in der Timer-ISR nebenbei reiherum alle Werte aktualisiert. Das
Hauptprogramm nimmt diese dann bei Bedarf aus dem SRAM oder (wenn
verfügbar) einem Registerblock.

...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.