Forum: Mikrocontroller und Digitale Elektronik SAMD DAC Taktfrequenz?


von Mike (Gast)


Lesenswert?

Hat jemand mal den in einigen SAMD-Controllern eingebauten DAC benutzt?
Mit welcher Taktfrequenz GCLK_DAC muss ich ihn versorgen? Das Datenblatt 
macht dazu leider keine Aussage. Ist Taktrate = Abtastrate sinnvoll oder 
kann GCLK höher oder niedriger sein?

von Ingo L. (corrtexx)


Lesenswert?

Mike schrieb:
> Das Datenblatt macht dazu leider keine Aussage.
Ich kenne die Dinger nicht, aber das halte ich für sehr 
unwahrscheinlich

von asdfasd (Gast)


Lesenswert?

"The voltage pump uses the asynchronous GCLK_DAC clock, and requires 
that the frequency be at least four times higher than the sampling 
period."

Ich hab mit den Teilen bisher nichts bemacht - so wie ich das verstehe, 
besteht der einzige Grund, den Takt nicht mit Maximalfrequenz laufen zu 
lassen, darin, Strom zu sparen. Ich will aber nicht ausschließen, dass 
es evtl Einfluß auf DMA/Events/etc hat ...

Evtl hier mal nen bisschen stöbern:
http://asf.atmel.com/docs/3.15.0/samd21/html/group__asfdoc__sam0__dac__group.html

von asdfasd (Gast)


Lesenswert?

"The voltage pump uses the asynchronous GCLK_DAC clock, and requires 
that the frequency be at least four times higher than the sampling 
period."

Ich hab mit den Teilen bisher nichts gemacht - so wie ich das verstehe, 
besteht der einzige Grund, den Takt nicht mit Maximalfrequenz laufen zu 
lassen, darin, Strom zu sparen. Ich will aber nicht ausschließen, dass 
es evtl Einfluß auf DMA/Events/etc hat ...

Evtl hier mal nen bisschen stöbern:
http://asf.atmel.com/docs/3.15.0/samd21/html/group__asfdoc__sam0__dac__group.html

von Mike (Gast)


Lesenswert?

"The voltage pump uses the asynchronous GCLK_DAC clock, and requires
that the frequency be at least four times higher than the sampling
period."
Da der Maximalwert von GCLK_DAC  bei 350 kHz (SAM D21 Datenblatt, Seite 
940) liegt, würde das eine Samplingrate von höchstens 87.5 ksps 
bedeuten. Zum Glück braucht man die Ladungspumpe nur, wenn die 
Betriebsspannung unter 2.5V liegt. Trotzdem scheinen Abtastwerte 
verloren zu gehen, wenn GCLK_DAC = Abtastrate ist. Es scheint so, als ob 
die beworbene Samplingrate von 350 ksps in der Realität nicht annähernd 
erreicht wird.

Das Ganze ist äusserst frustrierend, da ich in meinem Projekt eine 
Abtastrate von ca. 300 kHz benötige und bei der Auswahl des Controllers 
auf die Angaben zur Samplingrate im Datenblatt (Seite 2) und in der 
Werbung vertraut habe. Ich habe nun schon viel Zeit in das Projekt 
investiert, und müsste bei einem Controllerwechsel wieder von vorne 
beginnen.

von N2 (Gast)


Lesenswert?

Hi Mike,

Wie programmierst Du denn ?
ASF 3 ? ASF 4 ? Native ?

Blocked / Non-Blocked bei ASF3?
Async / Sync bei ASF4 ?
Events/Interrupts/Polling bei Native ?

Bring die f_CPU so hoch wie möglich, wenn Du kein DMA machst, sonst 
brauchen die CPU Takte um den neuen Wert abzuhohlen und zu schreiben, zu 
lange.
Gerade bei ASF 3...

Hab das gerade wieder bei spi_write_buffer_wait feststellen müssen:
SPI Clock hat 10 MHz, die einzelnen Bytes kommen schön mit 10Mhz raus 
(den Teil macht ja die Hardware), aber zwischen den Bytes gab es Pausen 
im Bereich 15us. Sprich, ein umstellen der SPI Frequenz 1Mhz, 10Mz, 20Mz 
brachte praktisch nichts. Hier frist das ASF um die 100 Takte. Bei 8 MHz 
f_Cpu um die 15us.

Vielleicht hast Du ja damit hier auch Probleme ?

Also füttere den DAC mal über DMA (hier solltest Du 350kbps 
rausbekommen) und berichte...

Gruß N2

von N2 (Gast)


Lesenswert?

PS : Seite 809 : Auf Kosten der Genauigkeit sollten 1000 ksps zu 
schaffen sein. Ist vermutlich eh sowas wie ein R2R-Netzwerk...

PPS : Der Multiplexer, der VOUT auf Deinen Pin schaltet braucht 
mindestens 2.5V um eine saubere Spannung ausgeben zu können. Wenn VDDANA 
< 2.5V ist wird mit GCLK_DAC die Spannung des Multiplexers von VDDANA 
auf 2.5V gepumt.
Hier wird klar, warum die Samplerate dann so gering sein sollte.

Ist alles eine Frage der Genauigkeit :-)

Was mich weiterhin vermuten lässt:
 * Du programmierst nicht in Assembler, sondern in C
 * Du benutzt ein nicht selbstgeschriebenes Framework (ASF3 oder ASF4)
 * Du hast bisher keine kritischen Programmteile identifiziert
 * Du hast keine Takte gezählt
 * Du hast Dir bisher nicht genug Gedanken zum Thema "Overhead" gemacht


Gruß N2

von N2 (Gast)


Lesenswert?

PPS: Bitte schreib nicht, dass Du Arduino programmierst auf einem 
Zero...

von Mike (Gast)


Lesenswert?

Kurz zur Entwicklungsumgebung: Ich programmiere auf einem Xplained PRO 
Board und nutze Atmel Studio mit dem gcc-Compiler.
Der DAC wird über vom Timer TC1 ausgelöste Events getriggert, das 
Hauptprogramm tut im Moment nichts anderes als das DATABUF-Register mit 
einer austeigenden Zahlenfolge zu beschreiben, sobald das 
EMPTY-Interrupt Flag aktiv und das SYNCBUSY-Bit inaktiv ist.

N2 schrieb:
> Was mich weiterhin vermuten lässt:
>  * Du programmierst nicht in Assembler, sondern in C
Richtig, nicht ganz triviale Projekte auf 32bit-Controllern werden 
üblicherweise in C programmiert.
>  * Du benutzt ein nicht selbstgeschriebenes Framework (ASF3 oder ASF4)
Nein, ich programmiere die Hardware-Register direkt.
>  * Du hast bisher keine kritischen Programmteile identifiziert
Doch, der kritische Part ist das Warten auf das SYNCBUSY-Bit. Bis das 
wieder inaktiv zu wird, trifft anscheinend schon der nächste Event ein, 
jedenfalls ist dann EMPTY längst wieder gesetzt. Offensichtlich dauert 
die Synchronisation länger als der Abstand zwischen zwei Samples. 
Eigentlich auch logisch, denn laut Datasheet dauert die Synchronisation 
mindestens 5 GCLK-Zyklen.
Ich habe es bisher noch nicht mit der DMA probiert. Kann die DMA denn 
den Registersynchronisationsmechanismus umgehen?

von N2 (Gast)


Lesenswert?

Hi,

Ich probiere das die Tage mal aus. Was hast Du denn für Clocks 
eingestellt?

Habe die gleiche Ide und Board.

Gruß N2

von N2 (Gast)


Lesenswert?

Hi,

So, hab mal eben eine Testroutine geschrieben. Ich nutze ASF3.

Wie schon geschrieben, kommt es hier auf die CPU Taktfrequenz an:
Bei 8MHz bin ich bei 65,8kHz
Bei 48MHz komme ich auf 387kHz

Etwa so, wie ich es erwartet habe.

Gruß N2
1
#include <asf.h>
2
3
struct dac_module dac_instance;
4
5
int main (void)
6
{
7
  system_init();
8
9
  struct dac_config config_dac;
10
  struct dac_chan_config config_dac_chan;
11
12
  dac_get_config_defaults(&config_dac);
13
  dac_chan_get_config_defaults(&config_dac_chan);
14
  dac_chan_enable(&dac_instance, DAC_CHANNEL_0);
15
  dac_chan_enable(&dac_instance, DAC_CHANNEL_0);
16
  dac_init(&dac_instance, DAC, &config_dac);
17
  dac_enable(&dac_instance);
18
  while(1)
19
  {
20
    dac_chan_write(&dac_instance, DAC_CHANNEL_0, 0);
21
    dac_chan_write(&dac_instance, DAC_CHANNEL_0, 1023);
22
  }
23
}

von Mike (Gast)


Lesenswert?

Entschuldigung, wenn ich diesen schon etwas angestaubten Thread 
wiederbelebe, aber ich bin erst jetzt dazu gekommen, den DAC ausführlich 
zu testen. Dazu habe ich Sinussignale per DDS mit 320 kHz Samplingrate 
erzeugt und das Ergebnis per FFT untersucht.

Die Angabe im Datenblatt ist offensichtlich falsch. Der DAC funktioniert 
auch dann noch perfekt, wenn er direkt aus dem CPU-Takt von 48 MHz 
versorgt wird.
Bei niedrigen Taktraten tritt ein starker Jitter auf, der im Spektrum zu 
Oberwellen und Störpeaks führt. Mit 350kHz Takt ist das Ergebnis 
unbrauchbar.

Ab etwa 10 MHz ist jedoch das Optimum erreicht, so dass ich den DAC-Takt 
auf 10.24 MHz, also die 32-fache Sampling-Rate eingestellt habe.

Ärgerlicherweise zieht sich der Fehler durch alle Atmel-Datenblätter für 
die SAMD-Familie.

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.