Generator sinusoidy od 0 do 400Hz na uC

Aug 31, 2009 17 Replies

Witam,



Przymierzam siê do wykonania oprogramowania mikrokontrolera Atmel AVR ATmega, które s³u¿y³oby do generowania sinusoidy o czêstotliwo¶ci od 0 do 400Hz. Rozwa¿am tu podej¶cie polegaj±ce na stablicowaniu próbek po³ówki sinusoidy i "wysy³aniu" ich na zewnêtrzny przetwornik cyfrowo



-analogowy. Zrobi³bym funkcjê, która by³aby przez "timer" wywo³ywana z odpowiedni± czestotliwo¶ci± (np. 400*256Hz dla czêstotliwo¶ci



400Hz i przetwornika 8-bitowego). Problem jednak z p³ynn± regulacj± czêstotliwo¶ci od 0 do 400Hz. Tzn. wystarczy³aby mi rozdzielczo¶æ
1Hz. Niemniej i tak operuj±c prescalerem i OCR2 nie da siê uzyskaæ wszystkich mo¿liwych czêstotliwo¶ci. By³bym wdziêczny za radê, jak rozwi±zaæ ten problem.

Pozdrawiam, Robbo



Robbo pisze:

To czego szukasz to DDS:

formatting link

Poszperaj na elektrodzie pod has³em DAC Generator lub Generator sygna³owy. Problem jest ju¿ rozwi±zany i opisany przez innych chobbystów.

Tez siê przymierza³em do tego tematu, znalaz³em jedynie kody w Assemblerze i skompilowany wsad do AVR-ka. Szkoda, ¿e wiêcej ¼ród³a nie znalaz³em.

On Mon, 31 Aug 2009 22:08:03 +0200, Robbo wrote: [ciach]

Wystarczy zrobić tablicę dla 1/4 i potem odpowiednio czytać wartości (w przód/w tył), ale jeśli pamięci w zapasie to można wrzucić 1/2.

Chyba bardziej poprawnie "400 Hz * 256" dla 256 próbek :) .

Hmm... ciężko. Przyszło mi do głowy żeby generować sinusoidę ze zmienną liczbą próbek na okres. Tę liczbę próbek tak dobierać aby pojedynczy kwant czasu był wielokrotnością możliwego kwantu uzyskiwanego z przerwania od timera. Np. dla 400 Hz i 100 próbek (na okres) musisz wysyłać próbkę co 25 us. Ustalasz sobie tick zegara na np. 2,5 us (4 MHz,

8 MHz i prescaler na 2, itd.) i co dziesiąty tik timera wysyłasz próbkę (korzystając z trybu CTC). Dla 399 Hz dobieramy ilość próbek tak alby przerwanie generowało się co wielokrotność 2,5 us, np. dla 125 wychodzi że trzeba wystawiać próbkę co 20,05 us czyli co ok. 8 taktów zegara timera. Dla 398 Hz i 84 próbek generujesz przerwanie co 29,91 us ~= 30 us => 12 taktów zegara i tak dalej. Lepiej zastosować szybkie taktowanie procesora, powinno być więcej rezerwy, można zejść niżej z tym kwantem (dla 10 MHz masz cykl 0,1 us, czyli 20 us to 200 instrukcji /realnie ze 140/). Do policzenia optymalnej liczby próbek dla danego kwantu i częstotliwości lepiej użyć stacjonarny komputer i zrobić z tego tabelkę - obliczenia raczej proste ale sinus by się musiał wstrzymać na trochę. Przy tej metodzie zawsze będziesz miał jakąś odchyłkę od całkowitej liczby Hz (błąd łatwo policzyć). Przy wyższych częstotliwościach CPU będzie i czas na inne rzeczy (np. miganie diodą).

Inne rozwiązanie to generator sterowany napięciem + precyzyjny przetwornik D/A - ładny sinus, łatwe sterowanie.

Tak jak kolega napisa³, to czego Pan potrzebuje to pewnie koncepcja DDS. Trzeba j± dobrze przestudiowaæ. To nie jest trudne. Najwa¿niejsza sprawa to tzw. akumulator fazy np. 32- bitowy. Wyja¶nia to karta:

formatting link
do takiego akumulatora dodaje siê sprzêtowo, co tak zegara (np. 40MHz) warto¶æ odpowiadaj±c± czêstotliwo¶c po¿±danej. Trzeba to policzyæ. Do tablicy, któr± kolega chce zrobiæ, nale¿y braæ np. najstarsze 13 bitów z akumulatora fazy Trzeba mieæ na uwadze, ¿e sygna³ z DDS jest stabilny czêstotliwo¶ciowo, ale s³aby ze wzglêdu na glitche, czyli drgania zboczy. Zale¿y do czego ma s³u¿yæ ten generator. Mo¿e RC sterowany uC bêdzie lepszy?

Dlaczego robi siê takie komplikacje. Czy nie wystarczy przepu¶ciæ prostok±t przez ma³y transformatorek i otrzymamy naturaln±, ³adn± ekologiczn± sinusoidê.

Órzytkownik "wt" napisa³:

bo to jest modne, na topie, w technologii mikroprocesorowej, na dodatek jak sie wykona za pomoc± wypasionych narzêdzi programistycznych to bêdzie zajebisty generator zwyk³ej sinusoidy:O)

I otrzymamy nieladny prostokat :-) No chyba ze transformator bedzie za maly, to wtedy otrzymamy cos zupelnie innego.

J.

Órzytkownik "J.F." napisa³:

to by³ tylko jeden z wielu pomys³ów, podejrzewam ¿e najprostszy, a jak chcesz idealn± sinusoidê to robisz prosty generator sinusoidalny sterowany napiêciem i to napiêcie mo¿esz podawaæ z procesorka, proste i super wypasione?:O)

Bo te komplikacje w pewnych sytuacjach moga być najłatwiejszym i najtańszym rozwiązaniem problemu. Juz się nawet nie opłaca mrygałki robic na tranzystorach kiedy obok leży uC za $1.

U¿ytkownik "Papa Smerf" snipped-for-privacy@zagurami.zalasami.trala.la> napisa³ w wiadomo¶ci news:h7k18a$n83$ snipped-for-privacy@nemesis.news.neostrada.pl...

A ja bym zrobi³ na DDS np. AD9831. Zastosowa³bym zegar wspólny z atmeg± i mamy piêkny generatorek nie tylko do 400Hz ale spooro wy¿ej.

Marek

U¿ytkownik "Papa Smerf" snipped-for-privacy@zagurami.zalasami.trala.la> napisa³ w wiadomo¶ci news:h7k18a$n83$ snipped-for-privacy@nemesis.news.neostrada.pl...

ALe bledny :-)

Mozna to zrobic na wiele roznych sposobow, to i dyskusja sie rozwija :-)

J.

Órzytkownik "marko1a" napisa³:

ale to nie bêdzie "czysta" sinusoida:O) bêdziesz to musia³ wyfiltrowaæ, proste dla sta³ej czêstotliwo¶ci, z przestrajaniem moze byæ problem:O)

U¿ytkownik "Papa Smerf" snipped-for-privacy@zagurami.zalasami.trala.la> napisa³ w wiadomo¶ci news:h7m8np$6l$ snipped-for-privacy@nemesis.news.neostrada.pl...

Eee tam. Wystarczy LPF i juz po problemie. My¶lisz ze prosto z atmela sinusoida nie bêdzie wymaga³a odfiltrowania ¶mieci?

Marek

Witam,

marko1a pisze:

Podstawowa wada tego rozwiązania to cena. :) Po ile stoją teraz te układy w detalu? Kiedyś to chyba ponad 50zł na coś takiego chcieli, choć ten co podałeś to zdaje się staroć...

Órzytkownik "Dykus" napisa³:

skoro chodzi o cenê to nic innego jak dyskretny przestrajany generator:O)

U¿ytkownik "Dykus" snipped-for-privacy@spamy.wp.pl> napisa³ w wiadomo¶ci news:h7p7l5$4kt$ snipped-for-privacy@news.onet.pl...

Nie staroæ. Nadal in stock price 6,33$ ale s± te¿ nastêpcy juz od 4$.

formatting link
Poznañ pytaj.

Marek

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required