Tiny3216 DDS-Generator         


Elektronik-Labor   Projekte   AVR


 TinyAVR Serie 0 und 1 im Einsatz Kap 5

Ein einfacher Sinusgenerator kann nach dem DDS-Prinzip (Direkte Digitale Synthese) aufgebaut werden. Daten aus einer Sinustabelle werden in einem regelmäßigen Takt über einen DA-Wandler ausgegeben. Die Schrittweite durch die Tabelle bestimmt die Ausgabefrequenz. Das hier vorgestellt Programm erzeugt ein Sinussignal mit 1 kHz. Die Frequenz kann zwischen 1 Hz und 20.000 Hz vorgegeben werden, Wobei die höchsten Frequenzen nur noch mit wenigen Stützwerten dargestellt werden.

Das Programm verwendet einen Timer-Interrupt mit einer Wiederholfrequenz von 20 MHz / 305 = ca. 65,536 kHz, damit die vorgegebene Frequenz eine genaue Auflösung von einem Hertz hat. So kann man den Zahlenwert der Frequenz in freq mit der gegebenen Taktrate auf den Phasenakku phase addieren. Die Sinustabelle mit 256 Stützwerten wird nur mit den oberen acht Bit des Phasenakkus adressiert. Damit werden auch Bruchteile der Phasensprünge aufaddiert.

 
//Sinus3216
#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h> 

uint8_t dds[256];
uint16_t phase=0;
uint16_t freq = 1000;  //1kHz 

ISR(TCA0_OVF_vect) {
   
PORTA.OUT = PIN3_bm;
    DAC0.DATA = dds[phase>>8];
    phase += freq;
    PORTA.OUT = 0;
    TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm;

int main(void) {
    sei();
    _PROTECTED_WRITE (CLKCTRL_MCLKCTRLB, 0); // 20 MHz
    for (uint16_t n=0; n<256;n++){
       dds[n]=127+127.0*sin(3.1415*n/128.0);
    }
    PORTA.DIR |= PIN3_bm;
    VREF.CTRLA = VREF_DAC0REFSEL_2V5_gc;
    DAC0.CTRLA  = DAC_OUTEN_bm|DAC_ENABLE_bm;
    DAC0.DATA  = 0;  //DA an PA6
    TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV1_gc;
    TCA0.SINGLE.PER = 305; //65,536 kHz
    TCA0.SINGLE.INTCTRL = TCA_SINGLE_OVF_bm;
    TCA0.SINGLE.CTRLA |= TCA_SINGLE_ENABLE_bm;
   
while (1) {
    }
}


Bei einer Frequenz von 256 Hz wird gerade bei jedem Interrupt der folgende Wert aus der Sinustabelle gelesen. Bei kleineren Frequenzen dauert es länger, bis ein neuer Stützwert ausgegeben wird. Und bei höheren Frequenzen wandert die Ausgabe in größeren Schritten durch die Sinustabelle. Jede Frequenz wird mit der Genauigkeit des internen Taktgenerators von ca. 1% erzeugt.

 

Bei 1 kHz sind die einzelnen Stufen bereits deutlich erkennbar, bei 10 kHz sind sie nicht mehr zu übersehen. Wenn der Generator für einen breiteren Frequenzbereich verwendet werden soll, empfiehlt es sich, ein steilflankiges Tiefpassfilter nachzuschalten.







Taschenbuch: https://www.amazon.de/dp/B0D5798R53

E-Book: https://www.amazon.de/dp/B0D54Q9D7L
 


Elektronik-Labor   Projekte   AVR