PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATmega8 ADC übertakten?!



Schokohoernl
16.06.2006, 17:11
Hallöchen!

ich hab gerade mal die geschwindigkeit des ADC von einem ATmega8 gemessen. hier der quellcode (BASCOM):



$crystal = 16000000
$baud = 19200

Config Timer1 = Timer , Prescale = 8




Dim Wert As Word
Dim Zeit As Word
Dim I As Byte



Config Adc = Single , Prescaler = AUTO
Start Adc


Do
For I = 0 To 5

Timer1 = 0
Wert = Getadc(i)

Zeit = Timer1
Zeit = Zeit * 2


Print "ADC" ; I ; " hat den Wert " ; Wert ; " und hat dazu " ; Zeit ; " Microsekunden gebraucht"


Wait 2
Next
Loop



erschreckender weise hat der AVR rund 890µS gebraucht um einen wert zu erfassen.
jetzt hab ich mal den prescaler wert auf 8 gesetzt (damit habe ich 2Mhz ADC-clock, statt den im datenblatt angegebenen max. 200KHz). machte sich auch gleich in der zeit bemerkbar: ca. 64µS für ein sample.
mangelnde genauigkeit habe ich noch nicht feststellen können (hab mal GND und VCC an die ADC-ports angelegt).
bei einem prescaler von 4 (4Mhz) ergaben sich dann schon schwankungen von ca. +- 10 (was bei 10bit knap 0,1% sind). bei prescaler 2 (8Mhz) waren es dann so +- 200.
hat jemand schon erfahrungen mit der genauigkeit bei steigender geschwindigkeit oder evtl. sogar ne schöne tabelle mit schaubild?
letztendlich soll der AVR das maxi/minimum einer spannungskurve ermitteln, was allerdings schlecht möglich is, wenn er zu langsam oder zu ungenau ist.

mfg

schoko

ogni42
16.06.2006, 18:09
Zwischen 250 und 500kHz verliert man ein bit, darüber mindestens ein weiteres Bit (AVcc/ARef mit Spule und Kondensator entkoppelt).

Bei 1MHz ist laut Datenblatt Schluß, ich hab's beim ATMega 168 noch ein bisschen weiter getrieben. Bei 1,125 MHz (Prescaler 16 bei 18,432MHz Takt) sind drei Bit "futsch". Weiter habe ich nicht getestet.

PicNick
16.06.2006, 19:09
Bascom mißt zweimal, angeblich sicherer, kost aber Zeit.
Vielleicht willst du mit ein bißchen inline-assembler dran drehen ?
https://www.roboternetz.de/wissen/index.php/Bascom_Inside-Code#Getadc.28.29

stochri
16.06.2006, 19:45
hat jemand schon erfahrungen mit der genauigkeit bei steigender geschwindigkeit oder evtl. sogar ne schöne tabelle mit schaubild?

Ein Schaubild habe ich leider auch nicht. Ich habe mir eine Art Oszi mit einem Atmega8 gebastelt, die maximale Abtastfrequenz liegt bei

150 Khz

Über die Genauigkeit kann ich wenig sagen, die Signalformen sehen noch einigermaßen vernünftig aus.
Ich habe auch schon mal Signale im Mhz Bereich angelegt. Es scheint sogar eine Unterabtastung möglich, der angelegte Sinus erscheint aufgrund von Aliasing wieder sauber als Sinus ( Stichwort "subsampling" ).

Gruss,
stochri

thewulf00
22.10.2008, 07:54
Ich muss den Thread doch nochmal rauskramen:

Weiß jemand, ob man steuern kann, welche bits futsch sind? Denn wenn man mit 10bit ADC rangeht, und die unteren 2-3 Bit sind futsch, ist das ja quasi egal, da in allen tutorials steht, dass man die unteren 2 bit grad ignorieren soll, da sie für den eigentlichen Wert nichts mehr aussagen, durch Schwankungen und Ungenauigkeiten.

PicNick
22.10.2008, 07:57
Du kannst einstellen, ob der ADC-Wert linksbündig abgelegt wird. (Muttu gucken) Dann liest du eben nur das Hi-Byte und vergisst die unteren 2Bit.

thewulf00
22.10.2008, 09:24
Ja, die Anordnung kann man einstellen. So baute ich mir ja auf einfache Art und Weise einen 8bit-ADC, der die untersten 2 Bit immer "ignorierte".
Aber wenn ich ihn jetzt übertakte, und er 2 Bit weniger Konvertieren kann, sind das dann die 2 untersten oder die 2 obersten? Darum gehts mir.

PicNick
22.10.2008, 10:30
Da sich der ADC an den Wert ja "anschleicht", sind die untersten Bits zu kübeln.
Ich würde sie mit einem "SHift-Right" eleminieren. bei zwei bits:
Bascom SHIFT value, right, 2
C value >>= 2;
ASM LDS reg, value
LSR reg
LSR reg
STS value, reg
(will dich da aber nicht belehren)

thewulf00
22.10.2008, 10:37
Danke für die Antwort. Du belehrst mich nicht, keine Angst. Ich lerne gern.

Warum stellst Du nicht einfach eine linksseitige Bitanordnung ein, dann sind die 2 untersten Bits autom. in einem anderen Register, das Du dann eh nimmer abfragen wirst.

PicNick
22.10.2008, 10:43
Ah so, vorbei geredet.
Bei links-ausrichtung (s.o) ist es so, wie du sagst, wenn du 2 Bit schmeissen willst. Das würde dann reichen.
Nur wenn du noch mehr übertaktest, und noch mehr Bits wegnimmst, gilt das obige. In meinem Beispiel wären das insges. 4 Bits

thewulf00
22.10.2008, 10:50
Ja ok.
Also wenn ich den ADC übertakte, so dass 4 Bit hinfällig sind, dann richte ich es linksseitig aus und shifte 2x. Soweit korrekt?
Dann habe ich eine 6-Bit-genaue Wertmessung in einem 8-Bit-Register?

PicNick
22.10.2008, 10:58
Genau......(15)

thewulf00
22.10.2008, 11:12
Ok. Dann vielen Dank nochmal für Deine Zeit!

radbruch
22.10.2008, 16:54
Hallo

Ich lese mit einem gnadenlos übertakteten ADC das Videosignal einer Kamera aus:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=308110

Hier noch mein Thread zur maximalen Samplegeschwinigkeit des ADC:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=33070

Gruß

mic

PicNick
22.10.2008, 19:00
Hallo, Schwabe !
War ja doch gut, dass wir dich was lernen haben lassen :-)

Auf dein Know-How greif ich bei einem anderen Projekt gerne zurück