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!
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.
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/Oversamplehttps://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
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.
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.
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.
>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.
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 ;-)
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.