Forum: Mikrocontroller und Digitale Elektronik ADC Prescaler ändern Controllino


von Fuzzyma (Gast)


Lesenswert?

Ich habe einen Controllino. Der hat genauso wie der Arduino Mega einen 
ATmega 2560 verbaut.
Ich habe gelesen, dass ich das analogRead beschleunigen kann indem ich 
den prescale factor des ADC runter setze.

Bis zu 1MHz soll man so erreichen können.
In etwaigen foren und wikis (danke microcontroller.net) ist beschrieben 
wie das geht.
Also habe ich folgenden Code eingefügt der aber scheinbar garnichts 
macht:
1
    // set prescale to 16
2
    sbi(ADCSRA, ADPS2);
3
    cbi(ADCSRA, ADPS1);
4
    cbi(ADCSRA, ADPS0);

Ich habe einfach gemessen wie lange 1000 analog reads brauchen (millis 
davor und danach) und dabei kam raus, dass der immernoch mit 125kHz 
arbeitet anstatt mit dem gewünschten 1MHz.
Habe ich irgendwas nicht bedacht?

Ich bin für jeden Schubs in die richtige Richtung dankbar!

von excurso (Gast)


Lesenswert?

Mit welchem Takt läuft die MCU?

von batman (Gast)


Lesenswert?

Und was sollen die Zahlen bedeuten? Lt. Datenblatt 2560:
"Up to 15 kSPS at Maximum Resolution"

von Einer K. (Gast)


Angehängte Dateien:

Lesenswert?

Fuzzyma schrieb:
> Ich habe einfach gemessen wie lange 1000 analog reads brauchen (millis
> davor und danach) und dabei kam raus, dass der immernoch mit 125kHz
> arbeitet anstatt mit dem gewünschten 1MHz.
> Habe ich irgendwas nicht bedacht?

analogRead() schleppt einen recht großen Ballast mit sich rum.
Wenn du wert auf hohe Sampleraten legst, solltest du darauf verzichten.

Und ja, der ADC verhält sich so wie im Datenblatt beschrieben.


Arduino?

Habe da mal irgendwann eine Klasse (Arduino Lib) geschrieben, welche 
ohne den Arduino Komfort arbeitet. Aber doch mehr bietet, z.b. den Free 
running Modus ohne viel Bits schubsen zu müssen.
Die Zipdatei kann mit dem LibraryManager installiert werden.

Das enthaltene PreScalerTest.ino Beispiel zeigt auf der seriellen 
Konsole, bis zu welchem Prescaler Value der ADC noch brauchbare Werte 
liefert.

von Fuzzyma (Gast)


Lesenswert?

excurso schrieb:
> Mit welchem Takt läuft die MCU?

Atmega2560 läuft mit 16Mhz. Macht bei einem prescaler von 16 eine 
Frequenz von 1Mhz am ADC. Aber ich sehe schon wer lesen kann ist klar im 
Vorteil...

> By default, the successive approximation circuitry requires an input clock > 
frequency between 50kHz and >200kHz. If a lower resolution than 10 bits is > 
needed, the input clock frequency to the ADC can be as high >as 1000kHz to > get a 
higher sample rate.

Mein Ziel war es ja genau zu bleiben aber trotzdem schneller zu sein um 
dann zu oversamplen.
Aber die Genauigkeit, die ich übers oversamplen dazubekommen verliere 
ich ja direkt wenn ich den adc mit 1Mhz betreibe.

Allerdings gibt es einige Leute die das probiert haben und tatsächlich 
gute Ergebnisse mit einem prescaler von 16 bekommen haben:

https://github.com/stylesuxx/Oversample
https://www.gammon.com.au/adc

Beide Beispiele nehmen eine 16MHz MCU an.

Die eigentliche Frage bleibt aber:
Der Prescaler wird nicht geändert obwohl ich die register beschreibe.
Ich werde mal das Minimalbeispiel von ufuf probieren. Und die Zeiten 
dort messen.
bin aber weiterhin für Tipps dankbar

von Einer K. (Gast)


Lesenswert?

Fuzzyma schrieb:
> Die eigentliche Frage bleibt aber:
> Der Prescaler wird nicht geändert obwohl ich die register beschreibe.

Die habe ich schon versucht zu beantworten.
Vielleicht nicht klar genug...


Also jetzt im Klartext:
Du machst was falsch!
Aber KA, was, da dein Code geheim ist.

von Dr. Sommer (Gast)


Lesenswert?

Und was will man auf einem 16 MHz MCU mit einem 1 MHz ADC? Innerhalb von 
16 Takten das Sample abfragen, verarbeiten, speichern könnte leicht 
knapp werden, insbesondere weil die AVR's ja sowieso nicht so 
funktionsstarke Befehle haben.

von chris (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Und was will man auf einem 16 MHz MCU mit einem 1 MHz ADC? Innerhalb von
> 16 Takten das Sample abfragen, verarbeiten, speichern

Der ADC-Takt beträgt 1 MHz. Der ADC braucht aber auch einige Taktzyklen 
für die Wandlung (aus dem Kopf heraus waren es glaube ich ca. 10-15). 
D.h. die Samplerate ist um diesen Faktor geringer. Ist dann also schon 
noch zu handhaben.

von Fuzzyma (Gast)


Lesenswert?

>Also jetzt im Klartext:
>Du machst was falsch!
>Aber KA, was, da dein Code geheim ist.

Achso - ich dachte das Codebeispiel würde genügen, da es die einzig 
relevante Stelle bzgl des ADC darstellt.
Ihr wollt euch sicherlich nicht durch 10000 Zeilen Code wühlen also habe 
ich mir erlaubt eine Vorselektion vorzunehmen...

>Und was will man auf einem 16 MHz MCU mit einem 1 MHz ADC? Innerhalb von
>16 Takten das Sample abfragen, verarbeiten, speichern könnte leicht
>knapp werden, insbesondere weil die AVR's ja sowieso nicht so
>funktionsstarke Befehle haben.

Na es hat ha offensichtlich schon bei anderen funktioniert :)

PS @ufuf: Dein Code geht - danke dafür. Daraus kann ich aber auch nur 
entnehmen, dass man ein paar bits setzen muss um den prescaler zu 
ändern.
Aso werde ich mal weitersuchen.

von Dr. Sommer (Gast)


Lesenswert?

chris schrieb:
> D.h. die Samplerate ist um diesen Faktor geringer.
Uhps, natürlich, das hatte ich komplett verdrängt. Dann entschuldigt 
meinen unqualifizierten Kommentar ;-)

von Einer K. (Gast)


Lesenswert?

Fuzzyma schrieb:
> Achso - ich dachte das Codebeispiel würde genügen, da es die einzig
> relevante Stelle bzgl des ADC darstellt.
> Ihr wollt euch sicherlich nicht durch 10000 Zeilen Code wühlen also habe
> ich mir erlaubt eine Vorselektion vorzunehmen...

10000 Zeile Code...
Reduziere es auf ein einzeln testbares Beispiel.

Und offensichtlich genügt es nicht!
Und ebenso offensichtlich suchst du deinen Fehler an der falschen 
Stelle.

Fuzzyma schrieb:
> PS @ufuf: Dein Code geht - danke dafür. Daraus kann ich aber auch nur
> entnehmen, dass man ein paar bits setzen muss um den prescaler zu
> ändern.

Danke, für die Blumen!
Wie du daran siehst, gelingt (mir) das ändern des Prescalers, wie im 
Datenblatt beschrieben.
Also sollte es auch dir möglich sein.

Fuzzyma schrieb:
> Aso werde ich mal weitersuchen.
viel Erfolg, ich dir wünsche.

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.