Pytanie:
Zaprogramuj ATtiny13 jako oscylator audio ze zmienną częstotliwością i szerokością impulsu
noise
2009-12-30 03:37:57 UTC
view on stackexchange narkive permalink

Chcę stworzyć prosty oscylator prostokątny podobny do tego, który można by zrobić z 555, ale chcę użyć obsługi PWM opartej na przerwaniach, aby kontrolować szerokość i częstotliwość impulsu.

Studiowałem arkusz danych, API AVR i wszelkie przykłady PWM, które mogę znaleźć, ale nie byłem w stanie zebrać tego wszystkiego razem.

Czy jest możliwe stworzenie takiego oscylatora z wbudowaną funkcjonalnością AVR PWM i, Jeśli tak to jak? Mój przyjaciel zrobił coś podobnego z 8-pinowym PIC.

Moje rozumowanie jest takie, że otrzymam interesujące dźwięki, zmieniając szerokość impulsu, a tym samym kształt fali przy danej częstotliwości. Podobnie jak konsola Atari Punk, ale miejmy nadzieję, że w bardziej stabilny sposób, tj. Zmieniając szerokość impulsu, ale pozostawiając stałą częstotliwość lub odwrotnie.

czy mógłbyś wyjaśnić swoje pytanie?
Nie jestem pewien, czy będą interesujące, ale łatwo jest spróbować i można to ocenić. W miarę zwężania się impulsu amplitudy harmonicznych rosną. Zwężaj puls, a otrzymasz biały szum. Myślę, że miałbyś bardziej interesujące opcje, robiąc oscylator sterowany numerycznie. Możesz zmienić przebiegi załadowane do fali.
Cztery odpowiedzi:
#1
+5
tissit
2010-05-18 13:52:00 UTC
view on stackexchange narkive permalink

To powinno Cię dość daleko, a resztę możesz zrobić z arkuszem danych. Zacznij budować kawałek po kawałku, od migotania do kształtu fali do kształtu fali, który z czasem zmienia się w tony. Niektóre źródła mogą pomóc w filtrowaniu i sterowaniu wyjściami audio (aktywny LPF może dobrze działać w obu przypadkach).

Proponuję wrócić z bardziej szczegółowymi pytaniami.

#2
+4
vicatcu
2010-05-18 22:44:22 UTC
view on stackexchange narkive permalink

Okres PWM zależy od szybkości przepełnienia timera. W sekcji Tryby działania jest wiele ustawień do przemyślenia. Jeśli wszystko, co chcesz zrobić, to wygenerować falę prostokątną o stałym okresie ze zmiennym cyklem pracy, myślę, że będziesz chciał użyć trybu CTC (Clear Timer on Compare Match). Podstawowym pomysłem jest ustawienie OCR0A na liczbę taktów timera, aż chcesz, aby pin przełączył się jako następny, i użyj przerwania Compare Match, aby zmienić tę wartość następnym razem. Więc w avr-gcc wyglądałoby to mniej więcej tak:

  #include <avr / io.h> # include <avr / breaking.h> # include <stdint.h> offuint8_t on_time_ticks, off_time_ticks, csxx_bits = 0; void setup_timer (double p_ms, double duty) {TCCR0A = _BV (COM0A0) // włącz OC0A na Compare Match TCCR0B = _BV (WGM02); // ustaw tryb CTC WGM0 [2,1,0] = 0b100 // ... zrób trochę rzeczy w oparciu o częstotliwość twojego procesora // aby zdefiniować csxx_bits TCCR0B, gdy licznik czasu jest uruchomiony // iw konsekwencji, aby ustawić on_time_ticks i off_time_ticks OCR0A = on_time_ticks; TCCR0B | = your_settings_here;} void start_timer () {// uruchom licznik czasu z żądaną szybkością TCCR0B | = csxx_bits; } int main (int argc, char ** argv) {double period_ms, duty_cycle; setup_timer (period_ms, cykl pracy); start_timer (); for (;;) {// spin, sleep czy cokolwiek}} ISR (TIM0_COMPA_vect) {if (OCR0A == on_time_ticks) {OCR0A = off_time_ticks; } else {OCR0A = on_time_ticks; }}  

Ostrzeżenie, to nieprzetestowany kod, ale myślę, że pomysł jest dobry. W żadnym wypadku nie jest to też jedyny sposób, aby to zrobić.

Nawiasem mówiąc, jest jedna rzecz, którą powinieneś wiedzieć o ATTiny13. Gwarantowana dokładność wewnętrznego oscylatora RC wynosi tylko 10% od poziomu fabrycznego. Istnieje proces kalibracji użytkownika, przez który możesz przejść (opisany w przypisie firmy Atel), który zapewni 2% dokładność ATTiny13. Jeśli chcesz zrobić coś lepszego, prawdopodobnie będziesz musiał użyć chipa, który mieści zewnętrzny kryształ ...

Twoja odpowiedź pomogła wyjaśnić coś podobnego, z czym miałem problem - dziękuję.Tylko uwaga (dla każdego, kto czyta to długo po oryginalnym wątku): Twój wybór 0b100 dla WGM0 [2,1,0] nie ustawi trybu CTC.(W rzeczywistości ustawi tryb zarezerwowany przez Atmela.) Arkusz danych ATtiny13 mówi, że tryb CTC wymaga _value_ 2;zamiast tego przypadkowo podałeś mu _bit_number_ 2 (tj. wartość 4).Z tego powodu konieczna jest nie tylko zmiana (czyli wyczyszczenie) WGM02 w TCCR0B, ale także ustawienie bitów WGM01 i WGM00 odpowiednio na 1 i 0.Te bity są w TCCR0A, więc nie wystarczy ustawić TCCR
#3
+3
jluciani
2009-12-30 05:55:16 UTC
view on stackexchange narkive permalink

Nie jest to bezpośrednia odpowiedź na twoje pytanie, ale może to być właściwe i dostarczyć kilku wskazówek -

Właśnie stworzyłem oscylator sterowany numerycznie (NCO) za pomocą ATmega uC i DAC. służy do przechowywania jednego cyklu przebiegu (wavetable). Akumulator fazy (long int) jest używany do określenia adresu danych wyjściowych w falowniku. Każde przerwanie timera zwiększa akumulator fazy o ustaloną wartość. Przyrost fazy określa częstotliwość.

W mojej aplikacji użyłem 64-bajtowej tablicy falkowej, która zawierała jeden cykl fali sinusoidalnej.Łatwo jest rozszerzyć tabelę falową i dodać większą rozdzielczość do próbek.Moje notatka aplikacyjna jest pod adresem http: //wiblocks.com/docs/app-notes/nb1a-nco.html

#4
+1
Nuischia
2009-12-30 04:47:44 UTC
view on stackexchange narkive permalink

Zasadniczo PWM nie zmienia częstotliwości. PWM są głównie używane do kontrolowania „intensywności” sygnału.

Aby wygenerować przerwanie dla różnych częstotliwości, sugerowałbym użycie timera w trybie CTC.

biegnij do wartości porównawczej, przełącz przerwanie, wyczyść i zrestartuj się - dopóki nie uruchomi się ponownie do wartości porównawczej ...

Po każdym przerwaniu możesz przełączyć jeden lub więcej portów i resztę czasu ( licznik czasu nadal działa automatycznie) możesz obserwować swoje wejścia dowolnego rodzaju ...

Nadal możesz "modulować" swoją falę prostokątną za pomocą PWM, aby kontrolować "wzmocnienie". Ale jeden z nich musi być zrobiony „ręcznie”, ponieważ ATtiny13 ma tylko jeden zegar sprzętowy ...

większość sprzętowych urządzeń peryferyjnych PWM umożliwia wybór częstotliwości; jeśli utrzymasz stały cykl pracy, PWM może nadal zapewniać sterowanie zmienną częstotliwością
Zmiana szerokości impulsu nie zmienia częstotliwości podstawowej, ale zmienia harmoniczne.


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 2.0, w ramach której jest rozpowszechniana.
Loading...