Mikrokontrolery - Jak zacząć?

... czyli zbiór praktycznej wiedzy dot. mikrokontrolerów.

czwartek, 10 marca 2011

Konkurs: Generowanie obwiedni ADSR za pomocą mikrokontrolera


Autor: Dondu

Stawiamy przed Wami kolejne proste zadanie, w którym można się wykazać i zdobyć książkę. Tym razem jest to generowanie obwiedni typu ADSR. Brzmi groźnie?

W latach 80 tych tworzyliśmy syntezatory opisywane w miesięczniku "RE Radiolelktronik" na bazie tranzystorów itp. Potężne płytki, ciągłe problemy .... aktualnie wystarczy jeden malutki mikrokontroler i krótki program, by ADSR realizować :-)

Uwaga!!!
Linki do rozwiązań konkursowych znajdziesz na końcu niniejszego artykułu.

W pierwszym konkursie ograniczymy się jedynie do wygenerowania obwiedni ADSR. W następnych konkursach będziemy dodawać dodatkowe elementy. Naszym celem końcowym jest zrobienie prostego syntezatora dźwięków.




Obwiednia ADSR, to nic innego jak regulacja amplitudy (np. dźwięku) podzielona na 4 etapy:
  1. Attack - narastanie amplitudy,
  2. Decay - opadanie amplitudy,
  3. Sustain - wybrzmiewanie,
  4. Release - wybrzmiewanie końcowe (wyciszenie) 
a wygląda to następująco (podstawowa prosta wersja):


Obwiednia ADSR - wersja podstawowa.
Obwiednia ADSR - wersja podstawowa.

w praktyce na przykład tak:

Obwiednia ADSR - przykład rzeczywisty - oscylogram.
Obwiednia ADSR - przykład
rzeczywisty.

Jak rozumieć te wykres? To naprawdę jest proste i wytłumaczę to poniżej :-)


Nagroda

Nagrodą dla zwycięzcy będzie książka (w wersji eBook) ufundowana przez eBookPoint:

Inteligentny dom. Automatyzacja mieszkania za pomocą platformy Arduino, systemu Android i zwykłego komputera.

Inteligentny dom. Automatyzacja mieszkania
za pomocą platformy Arduino, systemu Android i zwykłego komputera


Wszyscy uczestnicy (łącznie ze zwycięzcą) będą mieli drugą szansę, tym razem na dowolną książkę w wersji papierowej, o czym piszę pod koniec niniejszego artykułu.





Zadanie 1 - podstawa

Pierwszym zadaniem do wykonania będzie więc otrzymanie powyższego przebiegu za pomocą timera z PWM przy następujących założeniach czasowych:
  • czas trwania ataku: AT = 250ms,
  • czas trwania opadania: DT = 100ms,
  • czas trwania wybrzmiewania: ST = 350ms,
  • czas trwania wyciszania: RT = 300ms.

Założenia te na wykresie będą wyglądały więc następująco:

Obwiednia ADSR - czasy trwania.
Obwiednia ADSR - czasy trwania.

Pozostaje nam jeszcze ustalić amplitudy ataku (A) oraz wybrzmiewania (S):
  • amplitudę ataku przyjmiemy jako maksymalną, którą reprezentuje PWM o wypełnieniu 100% czyli dla timera 8-bitowego będzie to liczba 255, stąd APWM=255,
  • amplitudę poziomy wybrzmiewania (S) ustawimy na poziomie np. 60% czyli dla nas będzie to liczba SPWM = 255 * 60% = 153.

Stąd:


Obwiednia ADSR - poziomy PWM.
Obwiednia ADSR - poziomy PWM.


Jak zrealizować zadanie nr 1?

Należy wykorzystać timer do generowania sygnału PWM oraz ten sam timer lub inny do generowania przerwań:
  • ustawiasz wybrany timer tak, by generował sygnał PWM o zadanym wypełnieniu,
  • przerwanie za pomocą programu zmienia wypełnienie timera w zależności od miejsca na osi czasu (t), w którym znajduje się program generujący przebieg ADSR,
  • jeżeli dojdziemy do końca generowania obwiedni, rozpoczynamy generować ją od początku.

Należy przyjąć z jaką dokładnością będziemy odtwarzać wykres obwiedni. Przyjmijmy więc, że przerwanie powinno być wywoływane co około 1ms - to wystarczająca dla nas dokładność.


Jak obliczać wartość PWM na skośnych zboczach obwiedni ADSR?

Sądzę, że nie sprawi Ci to problemu ponieważ zbocza są odcinkami prostymi, czyli zwykłą funkcją liniową.

Wystarczy więc ustalić współczynnik nachylenia zbocza za pomocą czasu jego trwania i zakresu jego zmiany w tym czasie (różnica wartości PWM na początku i końcu zbocza w stosunku do ilości kroków, które mamy na wykonanie tej zmiany - w naszym przypadku 1 krok, to 1ms).

Współczynnik ten będzie przyjmował wartości dodatnie (dla zbocza narastającego) lub ujemne (dla zbocza opadającego). Tak obliczony współczynnik należy za każdym przerwaniem dodawać do ustawionej aktualnie wartości PWM.

Gdy kończymy dany fragment obwiedni np. A, obliczamy współczynnik dla kolejnego odcinka w tym wypadku D i dalej nasze przerwanie już działa normalnie. Można także przed wygenerowaniem obwiedni, obliczyć współczynniki dla każdego odcinka.

Wyjątek stanowi oczywiście współczynnik nachylenia dla wybrzmiewania (S), który będzie wynosił zero, ponieważ ten fragment wykresu obwiedni jest płaski.

Czy to jest trudne? Nie to jest naprawdę proste, ale zapewne przydałby się jakiś przykład ...


Przykład - wzorzec

Na przykładzie z Drzaśkowego PamiętnikaFAST PWM - Sposób na DAC
możesz prześledzić jak generowane są przebiegi sinus i piła, czyli jak ustawić PWM, a jak timer generujący przerwania zmieniające parametry PWM oraz jak zrobić prosty schemat.

Filtr dolnoprzepustowy

Na powyżej wskazanym schemacie znajdziesz na wyjściach PWM prosty schemat filtru dolnoprzepustowego, który pozwala zamienić sygnał PWM na żądany przez nas przebieg widziany na oscyloskopie. Bez tego filtru na oscyloskopie będziesz widział jedynie prostokątny przebieg sygnału PWM, co słusznie zauważył Miłosz Rachwał, w komentarzu do tego artykułu.

Jeżeli chcesz możesz oczywiście opracować własny filtr dolnoprzepustowy, by dokładniej odtwarzać naszą obwiednię. Na pewno się on przyda w dalszych konkursach z tego cyklu, co pozwoli uzyskać znacznie lepszy dźwięk.



Oscyloskop 

W efekcie na oscyloskopie powinieneś zaobserwować powyższy wykres. Jeżeli nie masz oscyloskopu możesz wykorzystać kartę dźwiękową komputera: Oscyloskop za darmo

UWAGA!!!
Jeżeli nie masz dostępnego oscyloskopu cyfrowego i będziesz korzystał z darmowego powyżej, to możesz skrócić czasy ADSR np. o 50 razy, by na oscyloskopie uzyskać powtarzalne przebiegi w zakresie pasma przenoszenia karty dźwiękowej komputera.






Zadanie 2 - dodajemy przycisk

Jeżeli już mamy dokładnie odtworzoną obwiednię i generowaną raz za razem, należałoby wprowadzić, jakiś rodzaj inicjatora startu generowania obwiedni. Najlepiej byłoby, gdyby był to po prostu przycisk.

Naciśnięcie przycisku powinno więc:
  1. rozpocząć generowanie obwiedni,
  2. lub przerwać generowanie aktualnej obwiedni i rozpocząć generowanie nowej.  
W takim przypadku oczekujemy dodatkowo, by po wygenerowaniu jednego przebiegu obwiedni, nie następowało automatyczne generowanie nowej. Innymi słowy przyciśnięcie przycisku ma wygenerować tylko jeden przebieg.




Rozwiązania zadań 1 i 2

Jako pierwsze prezentuję rozwiązanie moje (pozakonkursowe), które stanowi jednocześnie podstawę kolejnego konkursu: Generator obwiedni ADSR na mikrokontrolerze ATmega8 (wersja Dondu)

Zwycięzca!

Zwycięskie rozwiązania zadań 1 i 2 nadesłał Maciej Łukaszewicz:  Obwiednia ADSR: Zadania 1 i 2 by Maciej Łukaszewicz




Oceń artykuł.
Wasze opinie są dla nas ważne, gdyż pozwalają dopracować poszczególne artykuły.
Pozdrawiamy, Autorzy
Ten artykuł oceniam na:

11 komentarzy:

  1. Nie bawiłem się jeszcze Drzaśka artykułem dotyczącym generowania przebiegów za pomocą mikrokontrolera, ale zaglądnąłem i faktycznie nie jest to trudne. Praktycznie gotowy przykład jest tam zawarty nawet dla sinusa itp. A tutaj jest o wiele prościej, bo wszystko jest oparte o linie proste, a nie sinusy, czy piły. Nie podaliście jak należy przesyłać swoje rozwiązania.

    OdpowiedzUsuń
    Odpowiedzi
    1. Już dodałem informację jak wysłać materiały konkursowe.

      Usuń
  2. Ten syntezator w filmu to niezły bajer szczególnie pod koniec filmu.

    OdpowiedzUsuń
  3. Czyli w tym konkursie, chodzi tylko o wygenerowanie obwiedni, a nie dźwięku jako takiego?

    OdpowiedzUsuń
    Odpowiedzi
    1. Tak, tylko obwiedni o zadanych parametrach.

      Usuń
  4. Czy mamy zbudować układ (uC + low-pass + oscyloskop) i zaprezentować działanie układu?

    OdpowiedzUsuń
    Odpowiedzi
    1. Przede wszystkim program. Jeżeli będzie do tego schemat z prostym filtrem, to super. Należy jednak wziąć pod uwagę, ze filtr będzie musiał w kolejnym konkursie mieć taką charakterystykę, by jakieś przyzwoite częstotliwości dźwięków przepuszczać. Nie mam na myśli oczywiście jakości CD :-)

      Oscyloskop - jeżeli mam ktoś taką możliwość, żeby pokazać przebiegi, to także będzie super.

      Zapraszam do uczestnictwa, bo zadanie jest proste a ja nie chcę znowu książek zwracać tym razem do eBookPoint :-)

      Usuń
  5. Ale co da oscyloskop z karty dźwiękowej, jak na nim zamiast obwiedni widać tylko sygnał PWM?

    OdpowiedzUsuń
    Odpowiedzi
    1. Masz rację. W zadaniu nr 1 powyżej wskazałem przykład z Drzaśkowego pamiętnika, gdzie realizowany jest przetwornik DAC (cyfrowo-analogowy) do generowania przebiegów sinus i piła. W przetworniku Drzasiek zastosował prosty filtr dolnoprzepustowy, który wygładza przebieg zamieniając PWM na przebiegi sinus i piłę. W naszym przypadku filtr ten pozwoli uzyskać obwiednię.

      Ale ponieważ nie napisałem tego wprost, to faktycznie należy to uzupełnić. Zaraz dodam odpowiedni punkt, by nie było wątpliwości.

      Dziękuję za zwrócenie uwagi.

      Usuń
    2. Już dodałem i wspomniałem o Tobie :-)

      Usuń
  6. Próbowałem się za to zabrać ale chyba generowanie linii mnie przerasta :/

    OdpowiedzUsuń

Działy
Działy dodatkowe
Inne
O blogu




Dzisiaj
--> za darmo!!! <--
1. USBasp
2. microBOARD M8


Napisz artykuł
--> i wygraj nagrodę. <--


Co nowego na blogu?
Śledź naszego Facebook-a



Co nowego na blogu?
Śledź nas na Google+

/* 20140911 Wyłączona prawa kolumna */
  • 00

    dni

  • 00

    godzin

  • :
  • 00

    minut

  • :
  • 00

    sekund

Nie czekaj do ostatniego dnia!
Jakość opisu projektu także jest istotna (pkt 9.2 regulaminu).

Sponsorzy:

Zapamiętaj ten artykuł w moim prywatnym spisie treści.