logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

LPC1114 - Czy algorytm odtwarzacza wave z PWM i SD ma szansę działać?

NewbieMan 02 Lut 2014 17:00 3165 18
REKLAMA
  • #1 13253082
    NewbieMan
    Poziom 13  
    Posty: 113
    Pomógł: 3
    Ocena: 1
    Chciałbym na mikrokontroler LPC1114 napisać odtwarzacz muzyki zapisanej w formacie wave.
    Troszkę wiedzy już zgromadziłem :) Do generacji dźwięku zamierzam użyć timery i PWM. Odczyt danych będzie z karty SD. Algorytm wymyśliłem następujący:

    1. Ustawienie częstotliwości PWM na 22050 Hz
    2. Odczyt bloku z karty do bufora w pamięci
    3. Jeśli nie koniec bufora to odczyt wartości z bufora, w przeciwnym razie skok do 2
    4. Wpisanie pobranej wartości do rejestru PWM
    5. Skok do 3

    Czy to ma szansę zadziałać ?
  • REKLAMA
  • #2 13253185
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 13253372
    NewbieMan
    Poziom 13  
    Posty: 113
    Pomógł: 3
    Ocena: 1
    Marek_Skalski napisał:

    4. Ja bym taki odtwarzacz zrealizował jako kilka równoległych procesów:
    Proces 0: Wstępne załadowanie buforów danych (np. 8), które powinny stanowić ciągły obszar w pamięci, ustawienia i tym podobne;
    Proces 1: Przesyłanie danych z bufora do DAC przez DMA taktowane z timera. Wielkość pojedynczego transferu to 1 kwant czasowy, np. dla 2kanały x 16 bit, daje to 2 bajty x 2 kanały. Ilość danych do transferu to 1 blok lub 1 klaster (optymalnie), zależy ile masz SRAM do dyspozycji. Po zakończeniu transferu bloku/klastra generujesz przerwanie dla procesu nr 2.
    Proces 2: W reakcji na przerwanie z DMA ładującego dane do DAC, powinno być ładowanie danych z karty do właśnie opróżnionego/odczytanego bufora;
    Proces 3: Obsługa interfejsu użytkownika: klawiatura (power/start/stop/vol+/vol-), ledy, TFT czy co tam jeszcze masz.


    Pewnie w późniejszym etapie zrównolegle. W LPC1114 brak DAC oraz DMA, mogę zastosować odpowiednio wielki bufor kołowy + przerwania. Mam co prawda LPC 1768 z DMA i DAC, lecz do wave chcę użyć LPC1114.
  • REKLAMA
  • #4 13253463
    Konto nie istnieje
    Poziom 1  
  • #5 13255898
    NewbieMan
    Poziom 13  
    Posty: 113
    Pomógł: 3
    Ocena: 1
    Marek_Skalski napisał:
    Nie wiem czy LPC1114 ma opcję synchronicznego updat'u wartości rejestrów, co by znacznie ułatwiło sprawę.


    Rozwiń to zdanie bo nie wiem o co Ci chodzi.

    BTW. Na chwilę obecną tylko PWM z filtrem RC. Jeżeli jakość dźwięku w moim subiektywnym odczuciu będzie zadowalająca to tak pozostanie.
  • #6 13257945
    Konto nie istnieje
    Poziom 1  
  • #7 13259503
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    Marek_Skalski napisał:
    Próbowałem sprawdzić jak to wygląda dla LPC1114, ale strona NXP to dla mnie jakiś koszmar. W datasheet brak informacji, a nie znalazłem żadnego manuala czy ap'ki.


    No nie przesadzaj, jedna z lepiej zrobionych stron
    http://www.nxp.com/products/microcontrollers/cortex_m0_m0/LPC1114FBD48.html#overview
    Po lewej stronie masz Direct download
    http://www.nxp.com/products/microcontrollers/cortex_m0_m0/LPC1114FBD48.html#documentation
    A tu masz całą dokumentację.
  • #8 13272697
    NewbieMan
    Poziom 13  
    Posty: 113
    Pomógł: 3
    Ocena: 1
    Ile timer-ów będę musiał użyć ?
    Gdzieś w sieci widziałem kod dla AVR, gdzie wykorzystane były 2 timery. Timer0 odpowiadał za samplowanie, tzn. w przerwaniu od niego wstawiane były wartości dla sprzętowego PWM, natomiast Timer1 odpowiadał nośną dla PWM.

    Czy w LPC1114 jest realne żeby skorzystać tylko z jedengo timera ? Bo skoro wg. dokuemtacji rejestr TMRxxxMR3 służy do ustawiania nośnej, to wydaję mi się, że mógłbym wykorzystać przerwanie od niego i w nim wstawiać wartości do MR0.
  • #9 13272887
    Konto nie istnieje
    Poziom 1  
  • #10 13335237
    NewbieMan
    Poziom 13  
    Posty: 113
    Pomógł: 3
    Ocena: 1
    Kurczę, wczoraj walczyłem pół dnia lecz bez skutku.
    Jak się dobrze wsłuchać jakby jakaś melodia z dźwiękiem wydobywała się z głośnika. Już sam nie wiem w czym problem.
  • REKLAMA
  • #11 13335443
    McMonster
    Poziom 32  
    Posty: 1942
    Pomógł: 182
    Ocena: 57
    A jak to wszystko podłączyłeś?
  • #12 13336534
    Badmaneq
    Poziom 23  
    Posty: 567
    Pomógł: 76
    Ocena: 23
    Oprocz tego pokaz kod !
  • #13 13342604
    NewbieMan
    Poziom 13  
    Posty: 113
    Pomógł: 3
    Ocena: 1
    Nie mogłem wcześniej odpowiedzieć bo byłem poza domem.
    Wyjście P1.1 mikrokontrolera LPC1114 podłączone jest do wzmacniacza opartego na LM386, a zniego na głośniczek 1W.

    Oto kod odpowiedzialny za samplowanie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #14 13342789
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    NewbieMan napisał:
    Wyjście P1.1 mikrokontrolera LPC1114 podłączone jest do wzmacniacza opartego na LM386, a zniego na głośniczek 1W.

    A co z filtrem LPF między procesorem a wzmacniaczem?
  • #15 13343560
    NewbieMan
    Poziom 13  
    Posty: 113
    Pomógł: 3
    Ocena: 1
    Eyh ??
    Używam takiego moduliku
    LPC1114 - Czy algorytm odtwarzacza wave z PWM i SD ma szansę działać?
  • #16 13343636
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    Rozumiem... No to powodzenia ( głównie w zdobywaniu inteligencji).
  • #17 13346619
    NewbieMan
    Poziom 13  
    Posty: 113
    Pomógł: 3
    Ocena: 1
    Nie mam schematu do tego wzmacniacza, kupiłem go na pewnej aukcji. To co zdołałem się zorientować jest to standardowa aplikacja oparta na LM386.
    michalko12: nie mogłeś napisać filtr dolno przepustowy, zupełnie nie wiedziałem o co Ci chodzi z tym LPF. Na razie nie używam filtra tylko daję kondensator 100 uF pomiędzy P1.1, a wejściem wzmacniacza.
  • #18 13346792
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    Jak nie wiesz co to znaczy LPF to wystarczy że zapytasz google i w ciągu kilku sekund się dowiesz. Bez takiego filtra nie zadziała Ci ten układ, będziesz miał dokładnie takie efekty jak opisywałeś. Najprostszy taki filtr to rezystor i kondensator.
    LPC1114 - Czy algorytm odtwarzacza wave z PWM i SD ma szansę działać?
  • #19 13347355
    Badmaneq
    Poziom 23  
    Posty: 567
    Pomógł: 76
    Ocena: 23
    NewbieMan napisał:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Powyższy kod nie będzie działał prawidłowo, ponieważ częstotliowść PWM będzie zbyt niska. Domyślam się, że przyjąłeś próbki 16 bitowe
    LPC_TMR32B1->MR3 = 65536 - 1;	// podstawa czasu dla PWM
    

    a częstotliwośc taktowania mikrokontrolera ustawiona na 48 MHz
    LPC_TMR32B0->MR0 = ( 48000000/22050) - 1;	// podstawa czasu dla samplowania dla 22,05 kHz
    

    z pwyższego wynika 48 MHz / 65536 = 732,42 Hz, a Ty musisz mieć częstotliwość wyższą od tej, którą chcesz odgrywać.
    Powinieneś ograniczyć się do próbek 8 bitowych: 48 MHz / 256 = 187,5 kHz, więc zapis pownien być taki:
    
    LPC_TMR32B1->MR3 = 256 - 1;


    i wtedy zmienna probka występująca w przerwanu także powinna być 8 bitowa. Konsekwencją tego w przypadku wczytywania próbki 16 bitowej w kodzie będzię pomijanie młodszego bajtu tej próbki oraz będzie trzeba dokonać korekcji poprzez odjęcie od niej wartości 128 albo XOR na 8 bicie tej próbki.
    Być może wieczorem pokaże przykładowy kod, który nie ograniczałby się do dźwięku 22,05 kHz.

    P.S. Uważam, że można się pobawić i roszerzyć PWM do roździelczości 10 bitowej, z tym że wtedy dochodzą kolejne rozkazy przesunięć bitowych. W końcu to ARM, więc obsługa przerwania powinna się wyrobić przed wystąpieniem kolejnego :)

Podsumowanie tematu

✨ Użytkownik planuje stworzyć odtwarzacz muzyki w formacie WAV na mikrokontrolerze LPC1114, wykorzystując PWM i kartę SD do odczytu danych. Proponowany algorytm zakłada ustawienie częstotliwości PWM na 22050 Hz, co zostało skrytykowane jako zbyt niska wartość, sugerując podniesienie do 192 kHz lub użycie zewnętrznego DAC. Wskazano na potrzebę cyklicznego buforowania danych z karty SD, aby uniknąć przerw w odtwarzaniu. Użytkownik rozważa użycie jednego timera do synchronizacji samplowania i generacji PWM, co jest uznawane za najlepsze rozwiązanie. W dyskusji poruszono również kwestie związane z filtracją sygnału oraz jakością dźwięku, sugerując zastosowanie filtra dolnoprzepustowego między mikrokontrolerem a wzmacniaczem.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA