Forum: Mikrocontroller und Digitale Elektronik ATmega88 ADC geht nicht ab 16MHz aufwärts


von Black-Devel (Gast)


Lesenswert?

Moin @ all

ich arbeite gerade mit einem ATmega88A. Wenn ich den µC mit extenem 
Quarz 3.648 MHz oder mit dem Internen Oszillator @ 8 MHz betreibe 
funktioniert alles so wie es soll. Sobald ich einen externen Quarz mit 
16 oder 20 MHz verwende gibt der ADC nur noch Messwerte von 1023 aus.

Ich habe eine Boardspannug von 5.0V. Der ADC wird im Single Conversion 
Mode betrieben. Es wird also nicht im Takt gemessen.

Hat jemand ne Idee wieso er bei den höheren takten immer aussteigt?
Alle anderen Funktionen und Module laufen Problemlos, nur eben nicht der 
ADC

THX im vorraus, hoffe ihr habt ne idee

von c-hater (Gast)


Lesenswert?

Black-Devel schrieb:

> Ich habe eine Boardspannug von 5.0V. Der ADC wird im Single Conversion
> Mode betrieben. Es wird also nicht im Takt gemessen.

Es wird immer in irgendeinem Takt gemessen.

> Hat jemand ne Idee wieso er bei den höheren takten immer aussteigt?

Weil du nicht dafür sorgst, daß der ADC-Takt im zulässigen Bereich ist. 
Welcher das ist und wie man den einstellt->siehe Datenblatt.

von Black-Devel (Gast)


Lesenswert?

ich führe eine Messung alle 9 ms aus. Das ergebiss wird auch nicht 
ausgelesen bevor er nicht fertig ist mit der messung.

Da der ADC maximal 25 cycles also 1,25 µs @ 20Mhz.

sollte das nicht gnügen?

von Oliver S. (oliverso)


Lesenswert?

c-hater schrieb:
> siehe Datenblatt.

Das war ernst gemeint.

Alternativ
http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC#Ein_paar_ADC-Grundlagen

Stichwort "Prescaler". Danach brauchst du dann aber doch das Datenblatt.

Oliver

von spess53 (Gast)


Lesenswert?

Hi

>Da der ADC maximal 25 cycles also 1,25 µs @ 20Mhz.

Der ADC kann minimal 2,5µs bei 20MHz (10MHz ADC-Takt). Aber das ist 
jenseits von gut und böse.

ATMEL empfiehlt einen ADC-Takt von 50...200kHz. Mit geringere 
Genauigkeit geht es auch höher.

MfG Spess

von Black-Devel (Gast)


Lesenswert?

Ich benutze
1
uint16_t ADC_single_conversion(){
2
  PRR &= ~(1<<PRADC);
3
  ADCSRA |= (1<<ADSC);
4
  while(ADCSRA & (1<<ADSC));  
5
  return ADC;
6
}

Die Funktion wird ca alle 9 ms aufgerufen. Damit liege ich bei ca 100Hz.
Und auch das Ergebnis der Wandlung wir erst ausgelesen wenn sie 
abgeschlossen ist.

Das liegt doch innerhalb der Spezifikationen.

von Oliver S. (oliverso)


Lesenswert?

Du suchst an der falschen Stelle. Wie oft du den ADC aufrufst, ist nicht 
dein Problem. Dein ADC läuft mit einem unzulässigen Takt.

Lies den o.a. link, und lies im Datenblatt, Stichwort "Prescaler".

Oliver

von Skyper (Gast)


Lesenswert?

Black-Devel schrieb:
> Die Funktion wird ca alle 9 ms aufgerufen. Damit liege ich bei ca 100Hz.
> Und auch das Ergebnis der Wandlung wir erst ausgelesen wenn sie
> abgeschlossen ist.
>
> Das liegt doch innerhalb der Spezifikationen.

--> Seite 247, Kap. 24.4
http://www.atmel.com/images/doc2545.pdf

--> Seite 256, Kap. 24.8.2
 Bits 2:0 – ADPS2:0: ADC prescaler select bits

Dort ist eine Tabelle, dort wählst Du über den Teiler den Takt für den 
ADC aus - das hat aber nichts damit zu tun, wie oft DU den ADC 
abfragst!!!

Prozessortakt / Teiler = ADC-Frequenz (muss im Bereich 50kHz bis 200kHz 
liegen)!!!

von nicht"Gast" (Gast)


Lesenswert?

Hallo,

lies doch bitte mal den Link von Oliver.

Es zählen nicht die Aufrufe, sondern der ADC braucht auch noch einen 
Takt, der vom Oszillator abgezweigt wird. Den must du runter teilen.


Grüße.

von Dietrich L. (dietrichl)


Lesenswert?

Black-Devel schrieb:
> Das liegt doch innerhalb der Spezifikationen.

Es geht nicht darum, wann Du den ADC startest und ausliest, sondern um 
seinen internen Arbeitstakt. Der wird aus dem Prozessortakt gebildet 
und man stellt ihn bei der Initialisierung des ADC über den Prescaler 
ein, wie Oliver und spess53 schon schrieben.

Also nochmal: Datenblatt Kapitel "ADC" lesen. Da steht alles drin.

Gruß Dietrich

von spess53 (Gast)


Lesenswert?

Hi

>Das liegt doch innerhalb der Spezifikationen.

Kann man daraus nicht ablesen. Entscheidend ist die Einstellung der 
ADPS-Bits in ADCSRA.

MfG Spess

von Black-Devel (Gast)


Lesenswert?

Vielen Dank.

Wer nicht lesen will muss halt damit leben viele fehler zu machen.
Den teil im Datenblatt habe ich immer überlesen. Bis jetzt hat mir das 
noch nie probleme bereitet. OK wieder was gelernt.

Ich werde das heute Nachmittag gleich mal testen.

von Black-Devel (Gast)


Lesenswert?

Habs getestet... Es klappt!
vielen Danke @ ALL

CLOSED

von Rudolph (Gast)


Lesenswert?

Black-Devel schrieb:
> Bis jetzt hat mir das
> noch nie probleme bereitet.

Naja, eher hast Du die Fehler nicht bemerkt die durch zu schnelles 
Takten entstanden sind.

Default ist Clk/2.

"If a lower resolution than 10 bits is needed, the input clock frequency 
to the ADC can be higher than 200kHz to get a higher sample rate."

Oder anders ausgedrückt, je weiter man über die 200kHz geht, desto mehr 
Bits von unten kann man wegwerfen.

Eigentlich kann man quasi immer mit dem höchsten Teiler von 128 
arbeiten, nur unter 6,4MHz passt das dann wieder nicht.

20MHz, Teiler von 128, 13 Takte zum wandeln -> 83,2µs.

Mir wäre es sogar lieber, wenn der Prescaler mindestens noch ein Bit 
oder besser zwei mehr hätte.

Aber wenn wir bei wünsch-dir-was sind wären 3,3V 40MHz AVRs ganz nett. 
:-)

von spess53 (Gast)


Lesenswert?

Hi

>Aber wenn wir bei wünsch-dir-was sind wären 3,3V 40MHz AVRs ganz nett.
>:-)

ATXMEGA

MfG Spess

von Rudolph (Gast)


Lesenswert?

spess53 schrieb:
> ATXMEGA

Die gehen "nur" bis 32 MHz und da es nicht einen Typen mit CAN gibt habe 
ich mir die bisher nichtmal richtig angesehen.
Die sind sowieso eher als tot zu betrachten und hatten nie wirklich eine 
Chance.

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.