piecyk_se napisał: Większość przykładów znalazłem w Asemblerze...
Nie zastanawiałeś się, dlaczego? Kod w C jest zwykle mniej optymalny, przez co nie daje się uzyskać tak dużych częstotliwości, jak w przypadku asm.
piecyk_se napisał: Jeszcze będę musiał pominąć for bo zajmuje za dużo cykli.
No to jeżeli zamierzasz przerzucić wystawianie próbek do przerwania timera, to jednak radziłbym napisać obsługę w assemblerze, lub przynajmniej użyć atrybutu ISR_NAKED (ze świadomością, co ten atrybut oznacza), bo sam prolog i epilog obsługi przerwania generowany przez kompilator C zajmie pewnie więcej niż pętla for.
Tak czy inaczej trzeba mieć też świadomość, że przeniesienie wyprowadzania próbek do przerwania timera zmniejszy maksymalną częstotliwość możliwą do uzyskania, choćby ze względu na takty potrzebne na wejście i wyjście z przerwania (zwykle trzeba też odłożyć przynajmniej SREG na stos). Z kolei umieszczenie kodu w pętli głównej programu (lub we funkcji) nastręcza problem z uzyskaniem równych odstępów czasowych pomiędzy próbkami i znacznie ogranicza możliwości wykonywania przez mikrokontroler innych operacji poza generowaniem przebiegu.
Sądząc po fragmencie kodu, jaki przedstawiłeś, zmienne
j i
accu są typu
uint16_t. Jeśli chcesz uzyskać mniejsze częstotliwości (i przy okazji większą rozdzielczość regulacji częstotliwości) użyj typu
uint32_t. Oczywiście wtedy obliczenie indeksu wyprowadzanej próbki należy zmienić z
SIN[j/256] na
SIN[j/16777216] lub może lepiej na
SIN[j>>24]. Wprawdzie taka zmiana też spowoduje ograniczenie maksymalnej częstotliwości, ale jeśli użyjesz wtedy zmiennej
accu równej 1, częstotliwość będzie naprawdę bardzo mała. Bardziej optymalnym rozwiązaniem byłoby zastosowanie zmiennej 24-bitowej, ale to w C będzie trudne.
EDIT:
piecyk_se napisał: myślałem na początku aby co każdą próbkę wsadzić opóźnienie ale nie wygląda to ładnie.
Dodam jeszcze, że jeśli próbujesz zmieniać częstotliwość poprzez zmianę odstępów czasowych pomiędzy próbkami, to przestaje to być DDS, gdyż jej podstawową ideą jest zmiana częstotliwości poprzez zmianę kroku, o jaki zmienia się faza w jednostce czasu.