Arduino AD9850 DDS

Het opwekken van analoog signaal op een bepaalde frequentie kan tegenwoordig eenvoudig gedaan worden met een DDS chip. (Direct Digital Synthesizer).

Waar je normaal een een oscillator een frequentie op laat wekken met een kristal, of PLL gestuurde oscillator die stabiel gehouden wordt aan de hand van een kristal oscillator als referentie, is het met een DDS mogelijk deze een willekeurige frequentie op te laten wekken binnen zijn bereik.

Een DDS heeft een interne referentie oscillator op basis van een kristal oscillator. Deze bevindt zich op de chip.  De maximale op te wekken uitgang frequentie is theoretisch fo=f_{clk}/2 . De maximaal op te wekken frequentie van een DDS is in de praktijk ongeveer f_o=(f_{clk}/2) * 0.8 .

De maximale frequentie van de AD9850 chip is ongeveer 40MHz. Echter neemt de zuiverheid van het opgewekte signaal af doordat het aantal samples om een sinus uit te reconstrueren ook afneemt. Zie datasheet van de AD9850 op pagina 9.

Hierdoor wordt er naast de het gewenste signaal ook fo-f_{clk} en fo+f_{clk} opgewekt. Filteren van het uitgangsignaal is dus noodzaak. Dat gebeurt dan ook op de AD9850 chip evaluatie board. (42 MHz low-pass, 5-pole elliptical filter, datasheet pagina 17).

Het voordeel van frequentie opwekking met het DDS principe is dat de faseruis van het signaal ten opzichte van een PLL laag is. Er is geen terugkoppeling zoals in een PLL schakeling.

Helaas rondom de opgewekte frequentie meer 'spurious' te vinden dan bij een andere methode. (DAC SFDR > 50Db @ 40Mhz) Dit kan voor sommige toepassingen niet gewenst zijn. Een mogelijkheid is dan om een oscillator die een zuiver signaal opwekt te stabiliseren met een PLL loop waarvan de referentie frequentie opgewerkt wordt met een DDS.


 

DDS AD9850 op frequentie zetten:

De AD9850 heeft een parallelle (D0 t/m D7) databus en een seriële databus om de data in een 40bit breed register in te laden. (32 bit frequentie, 5 bit fase modulatie en power-down ). Serieel moeten er dan 5 woorden van 8 bits ingelezen worden (40 bits). De seriële database is eenvoudig in gebruik en vergt minder poorten van de aansturende microcontroller. (CLK, FQ, DATA, RST).

Overigens kan de code nog overzichtelijker als je gebruik maakt van een library: