Poszukuję pomysłu - generacja przebiegu

May 08, 2005 12 Replies

Poszukuję idei jak zrobić układ generujący łącznie 16 sinusoid o częstotliwościach dających się programować (100 - 500 Hz), jak również dające się ustalać ich poziomy (ale to wydaje się prostsze). Wyjścia nie muszą być oddzielne, wystarczą dwa kanały po 8 zmiksowanych przebiegów. Wymagany parametr, to małe zniekształcenia i jak sądze wykorzystanie przetwornika C/A o rozdzielczości co najmniej 10 bitów. Myślałem o stosowaniu AVR'a, ale generacja na żywo odpada z uwagi na zbyt małą jego wydajność. Wedle moich badań da się generować maksymalnie ok. 2700 próbek sinusoidy na sekundę... Trochę za mało. Zatem nawet wcześniejsze generowanie przebiegu do pamięci, by później go odtwarzać, chyba też nie wchodzi w grę. Co na to poradzić? Wiadomo, DSP pewnie by obsłużyłoby to, ale póki co nie biorę tego rozwiązania pod uwagę...



Pzdr. Krzysztof.



Użytkownik "Krzysztof" <krzysztof.gedroycWYTNIJ snipped-for-privacy@wp.pl napisał w wiadomości news:d5m99f$sm0$ snipped-for-privacy@nemesis.news.tpi.pl

Układ ma być jednostkowy czy powtarzalny? (Tzn. czy trzeba się liczyś z kosztami czy nie? ;-)

W pierwszej chwili pomyślałem o miniDDS Jespera Hansena złożonym na 90S2313. Przy generowaniu jednej sinusoidy, na jeden obieg pętli wykonującej sumowanie w 24-bitowym akumulatorze fazy, adresującej 8bitami (msb) tablicę z sinusem i wystawiającej 8-bitowy wynik na port potrzeba 9 taktów. Przy zegarze 10MHz daje to taktowanie DDSa na poziomie 1.1MHz. Żeby wygenerowac i wyfiltrować 500Hz wystarczyłoby Ci efektywne taktowanie rzędu kilku kHz. Ile może zająć 8 takich operacji równolegle (sumowanie fazy, pobranie z LUT), zsumowanie wyniku (nawet na 10bitach jeśli 8 to za mało) i wystawienie wyniku na port, wysłanie po SPI na jakiś zewnętrzny DAC lub wystawienie na jeden takt impulsu z PWM-a? Nie wiem, ale mając do dyspozycji ATtiny2313 popędzone na 20MHz i do dyspozycji ponad 2000 taktów na jeden obieg DDS-a serio bym się nad tym pozastanawiał.

Jeżeli natomiast nie musisz (za bardzo) liczyć się z kosztami a za to cenisz swój czas, to 16 najtańszych DDS-ów na stół i problem z czaszki :-) (AD9833 kosztuje w tej chwili w Alfine ok 23pln netto@1+ i 18pln netto @100+).

??? Dlaczego tak mało? Zrobione na stałym przecinku wybieranie odpowiednich próbek z zapisanej gdzieś w pamięci tablicy z sinusoidą to jest bułka z masłem. Podejrzewam że dałbyś radę pokryć całe pasmo akustyczne.

TP.

Pod warunkiem ze zastosuje DDS...ale o tym napisal Marek Dzwonnik i wlascwie wyczerpal temat - zawsze mozna to rozbic na dwa AVR choc jak mysle da sie to upchnac na jednym.

Ale czemu _mini_ ? 16 kostek DDS i po problemie :-)

Nawiasem mowiac - mozna by to ciekawie upchnac w jakiegos sredniego FPGA. 16 rejestrow, 16 DAC, i jeden blok przetwarzania DDS.

Czy te czestotliwosci musza byc bardzo dokladne ? Bo obliczenie kolejnych probek sin nie jest zadaniem zbyt skomplikowanym - wymaga raptem jednego mnozenia i dodawania - ale najlepiej zmiennoprzecinkowego. A CORDIC jest niewiele wolniejszy ale za to dokladny. BO jak patrze na twoje wyliczenia .. trzeba ci 16 atmelkow, a one nie sa drogie :-)))

No -z tym filtrowaniem to moglby byc problem. Chyba lepiej jednak taktowac ten 1MHz.

Jeszcze jedna mozliwosc - 16 generatorow przestrajanych, zapiac w petli PLL, a procesorem do wyboru: ustawiac podzielniki, generowac sygnal wzorcowy prostokatny, albo mierzyc czestotliwosci i sterowac napieciami sterujacymi. Tyle ze jak piszesz - DDS tanszy niz 8038 :-)

J.

Tylko tyle, przy założeniu obliczania na żywo wartości kolejnych próbek. Obliczanie tych sinusów (ze wzorów Taylora ?, rozwinięcie funkcji w szereg?) zajmuje trochę czasu. Ale ten pomysł by raz mieć zapisaną sinusoidę i na bazie tego generować próbki jest wart zastanowienia...

Pzdr. Krzysztof.

Przejrzałem sobie trochę info o tym algorytmie i wygląda obiecujaco. Ile razy (na oko rzecz jasna) będzie on szybszy od tej standardowej funkcji sin ?

Pzdr. K.

A trzeba by zajrzec ... bo standardowa powinna uzywac Cordica :-)

J.

cos duzo za malo ci wyszlo przejrzyj AN543 Microchipa

Jestem w trakcie przeglądania. A jeśli chodzi o ilość tych obliczeń, to listing poniżej:

#include <avr/io.h>

#include <math.h>

int main(void) { volatile double a; a=sin(0.234234); return(0); };

potrzebuje 680 us , przy kwarcu 8 MHz, zatem obliczanie sinusa odbywa się z częstotliwością ok 1,4 kHz. Przy najszybszym rezonatorze 16 MHz prędkość podwoi się.

Pzdr. Krzysztof.

Jeśli chcesz generować przebieg sinusoidalny, to nie musisz dla każdej próbki liczyć sinusa. Prościej byłoby zrobić niestabilny filtr noi. Przykłady można znaleźć w notach aplikacyjnych TI.

toz wlasnie ta nota z microchipa to jest to..

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required