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
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.
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?
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
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
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.
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
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)!!!
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.
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
Hi
>Das liegt doch innerhalb der Spezifikationen.
Kann man daraus nicht ablesen. Entscheidend ist die Einstellung der
ADPS-Bits in ADCSRA.
MfG Spess
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.
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. :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.