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

[LPC2148][C/Keil] PWM - generacja fali dźwiękowej nie działa

Martinuz 20 Sty 2012 18:48 2341 22
REKLAMA
  • #1 10424569
    Martinuz
    Poziom 9  
    Posty: 15
    Witam, tym razem mam mały problem z PWM'em.
    Konkretnie - nie działa.
    PWM ma generować falę do głośniczka na wyjściu P0.12
    P0.12 ustawiony został w stan wyjścia. Podpięta do niego jest również dioda.
    Wykonanie tej funkcji powoduje trwałe zapalenie diody (niezależnie od ustawionej częstotliwości) oraz kompletną ciszę na głośniku.
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Zastosowanie już takiego rozwiązania:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Powoduje prawidłowe generowanie dźwięku, więc porty działają, głośnik działa.
    Pozdrawiam i z góry dziękuję za okazaną pomoc!
  • REKLAMA
  • Pomocny post
    #2 10424710
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Wyjście P0.12 nie ma funkcjonalności PWM, tylko funkcjonalność Timera. Niby to samo, ale jednak nie... PWM2 jest np na porcie P0.7 - jak ustawisz kierunek i podłączysz tam swój głośnik z diodą to zacznie działać.

    4\/3!!
  • #3 10424725
    Martinuz
    Poziom 9  
    Posty: 15
    Ah, tak też przypuszczałem. Nie istnieje żadna możliwość przekierowania PWM'a na to wyjście? Głośnik popięty jest niestety "na stałe" w układzie Education Board v3
  • #4 10424754
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    PWMa nie, ale można to samo zrobić Timerem na odpowiednim kanale, tyle że trochę inaczej się to konfiguruje - na jeden match dajesz ustawienie wyjścia w stan niski i reset timera, na drugi match dajesz ustawienie wyjścia w stan wysoki.

    Timer w LPC2148 może mieć funkcjonalność PWM, tyle że minimalnie inaczej i minimalnie mniej zaawansowaną. Moduł PWM to taki jakby trzeci timer, nastawiony stricte na PWM.

    4\/3!!
  • REKLAMA
  • #5 10424768
    Martinuz
    Poziom 9  
    Posty: 15
    No to wielka szkoda w takim razie... Swoją drogą, wiesz może czemu głośnik działa mi na P0.12 a specyfikacja mówi o P0.25?
  • #7 10425802
    Martinuz
    Poziom 9  
    Posty: 15
    Hmmm, a jeśli bym Ci dal datasheet? ;) Bo moze po prostu ja cos zle patrze....
    Prawde mowiac moje uposledzenie jest nieco bardziej prawdopodobne od błędu Embeded Artists.
  • #8 10425889
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    No to wrzuć linka albo schemat tutaj, w zasadzie wystarczy tylko fragment (jpg) w którym widać ten głośnik i podłączenie do mikrokontrolera.

    4\/3!!
  • #9 10425950
    Martinuz
    Poziom 9  
    Posty: 15
    OK, jednak to ja jestem upośledzony. Głośnik jest na P0.25.... Jak w takim razie powinna wyglądać ta funkcja? Bo prawdę mówiąć poparzę się z tym od rana i ledwie na oczy już widzę. Gdybyś pomógł, będę niezmiernie wdzięczny.
  • #10 10425978
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Na P0.25 jest wyjście przetwornika C/A i tylko tak możesz to zrobić przy użyciu tego mikrokontrolera i tej płytki, bo żadnego timera czy PWMa tam nie ma.

    Swoją drogą - czym w końcu sterowałeś wcześniej (bezpośrednio z delayami) - P0.12 czy P0.25?

    4\/3!!
  • #11 10425996
    Martinuz
    Poziom 9  
    Posty: 15
    To jest zabawna historia - P0.12 - które okazało się silnikiem z wiatraczkiem. Jak widać, nadawał się dostatecznie dobrze do odtwarzania muzyki :)
    Obawiam się że ogarnięcie do jutra przetwornika C/A jest poza moim zasięgiem :(
  • REKLAMA
  • #12 10426062
    Electix
    Poziom 21  
    Posty: 462
    Pomógł: 46
    Ocena: 6
    Czy Ty posługujesz się może Tą plytką?

    Tam jest podpięty głośnik do portu P0.25. Jest tak dlatego, że pin ten możesz skonfigurować jako wyjście przetwornika DAC (cyfrowo-analogowego). I ta funkcjonalność pozwoli Ci na możliwość generowania, w zasadzie dowolnych dźwięków (ograniczonych tylko pasmem i możliwościami głośniczka i wzmacniacza oraz całej elektroniki z ich otoczenia).

    Druga możliwość generowania czegokolwiek na tym porcie, to po prostu fala prostokątna generowana przy pomocy "machania" staniami "0" i "1" używając tego pinu jako proste GPIO/FPIO.

    Funcjonalność tego wyprowadzenia możesz zmieniać z pomocą bitów [19:18] w rejestrze PINSEL1. Dla GPIO będzie to wartość 0b00, czyli taka jaką ma rejestr po resecie, czy włączeniu zasilania. Natomiast wpisując tam wartość 0b10, wyprowadzenie stanie się wyjściem przetwornika DAC.

    Coś mi się wydaje że nie do końca przejrzałeś te User Manuale co polecaliśmy Ci w poście o timerze...

    :P
  • #13 10426078
    Martinuz
    Poziom 9  
    Posty: 15
    Macham stanami 1 i 0 i to działa :)
    To akurat mam już opracowane.
    Natomiast jeśli chodzi o przetwornik A/C, po prostu nie mam pomyslu, nawet patrząc w manuale jak wytworzyć tam falę sinusoidalną lub prostokątną o odpowiedniej częstotliwości i amplitudzie... Ot i tyle, głupi żuczek jestem.
  • REKLAMA
  • #14 10426126
    Electix
    Poziom 21  
    Posty: 462
    Pomógł: 46
    Ocena: 6
    Ja mam wrażenie, że nie do końca rozróżniasz ADC i DAC. Obie te funkcjonalności można nastawić na wspomnianym wcześniej porcie P0.25. Chyba że się po prostu przejęzyczyłeś w wypowiedzi wyżej.

    Ale skoro chcesz generować dźwięki, to z tego wszystkiego najbardziej do tego będzie nadawał się DAC.

    I tu znów niespodziewajka, jest to chyba najprostszy peryferiał LPC'ka którym się bawisz. Posiada on zaledwie jeden rejestr którym nastawiasz jego parametry i wpisujesz dane do przetworzenia na analog.

    Wbrew pozorom, jest to bardzo prosta sprawa. Musisz tylko zrozumieć jak działa przetwarzanie DAC. Napisać sobie program który będzie wyliczał na bieżąco wartości jakie trzeba wpisać do DAC żeby generował Ci tego sinusa i tyle...

    Zamiast wyliczać wartości, możesz też sobie stablicować te wartości obliczając je na piechotę, czy np MATLAB'em, zapisać je do pamięci mikrokontrolera i potem je po prostu odtwarzać...

    Ale musisz niestety ciutkę się wysilić i poczytać jak działają te peryferia, poszukać przykładów w necie i wtedy (zapewne będziesz wiedział o co pytać) zadawać pytania szczegółowe

    :)
  • #15 10426177
    Martinuz
    Poziom 9  
    Posty: 15
    Oczywiscie ze przejezyczylem.
    Chce uzyskac ANALOGOWY dzwiek z CYFROWEGO nosnika jakim jest pamiec mikroprocesora, wowczas uzywam przetwornika CYFROWO->ANALOGOWEGO
    :)
    Az tak zle chyba ze mna jeszcze nie jest....
    A skoro mowisz ze ten DAC jest taki prosty, to moze sie skusze... choc nie wiem czy zdaze do jutra ;) (Captain Procrastination!)

    EDIT

    Jak rozumiem, a mysle ze dobrze rozumiem, nalezaloby napisac funkcje ktora ustawia tak rejestr DAC'a zeby VALUE zmienialo sie sinusoidalnie od min do max? :>
  • #16 10426208
    Electix
    Poziom 21  
    Posty: 462
    Pomógł: 46
    Ocena: 6
    Zajrzyj jeszcze raz tu. Dziś już podawałem Ci ten link:
    Programowanie mikrokontrolerów LPC2000 w języku C pierwsze kroki
    W dolnej części strony masz przykładowe programy z książki. Możesz sobie je pobrać, rozpakować i tam znajdziesz przykład generowania sygnału "ćwierkania". Przykład jest dokładnie na Twój procek, więc wystarczy że go sobie "wkleisz" gdzieś do swoich kodów...

    Do tych innych książek też są przykładowe pliki do pobrania, zajrzyj tam...
  • #17 10426241
    Martinuz
    Poziom 9  
    Posty: 15
    Pozwole dopisac sie pod soba (choc wiem ze tak nie powinno sie robic), ale to troche inna mysl.
    Powiedz mi, czy dobrze mysle:
    PINSEL1 &= 0x00080000 <- ustawienie PO.25 jako wyjscia analogowego
    DACR = 0x000FFC0 <- ustawienie maksymalnego stanu na wyjsciu analogowym

    A ten cwierkajacy DAC niestety nie dziala :(
  • Pomocny post
    #18 10426288
    Electix
    Poziom 21  
    Posty: 462
    Pomógł: 46
    Ocena: 6
    z tym PINSEL1 coś pokręciłeś.
    Dla maksymalnej pewności powinieneś ustawić go tak:

    
    PINSEL1|=(1<<19);
    PINSEL1&=~(1<<18);
    


    Natomiast z DACR, tak ustawisz max wartość dla DAC.

    Co do ćwierkającego przykładu, musisz napisać więcej szczegółów. Jakie błędy wywala kompilator, a może nie wywala, jak objawia się to niedziałanie?
  • #19 10426312
    Martinuz
    Poziom 9  
    Posty: 15
    Kompilator nie wywala niczego, objawia sie ciszą ;)
    Przerobiłem machanie GPIO na machanie stanem 0 i max DACR, i tworzy mi bez problemu falę prostokątną. Więc DAC działa...

    Ale to i tak nie jest istotne, zrozumialem dzieki Tobie dzialanie DAC - dziekuje!
    Wisze Ci piwo jak bedziesz w okolicach Łodzi ;)

    Ostatnie pytanie:

    Kod: text
    Zaloguj się, aby zobaczyć kod

    Co tutaj jest popsute?
  • Pomocny post
    #20 10426359
    Electix
    Poziom 21  
    Posty: 462
    Pomógł: 46
    Ocena: 6
    Może to "ćwierkanie" jest bardzo ciche, albo jakieś filtry wzmacniacza (głośniczka) obcinają pasmo? Musiałbyś pokazać nam schemat... :P Miło mi że miałem możliwość przyczynić się do pomocy w nauce. Sam, jeszcze całkiem niedawno zaczynałem, wiem więc jakie trudności bywają na początku. Sam też często pytam tu na forum, bo pomimo znacznego pogłębienia wiedzy i tak co chwila okazuje się że jeszcze czegoś nie wiem... :)

    Dziś już chyba nie chce mi się klepać w klawiaturę, ale jutro, jak będziesz potrzebować, to wyjaśnię Ci jak wygenerować sobie sinus na wyjściu... :)

    Pierwsze co mi się rzuca w oczy to że moc=1024; Wartość ta po przesunięciu o 6 w lewo da 1 na 16 bicie rejestru DACR. A to oznacza że w części VALUE masz same 0.
    Wpisz zatem 1023, albo 0x3FF, jak chcesz mieć max wartość w VALUE.
  • #21 10426378
    Martinuz
    Poziom 9  
    Posty: 15
    Jutro mam zaliczenie :)
    Jakbys mogl tylko sprawdzic ta funkcje powyzej, bede bardzo zobowiazany, z tym piwem to nie zartuje! :
    To 1023 sam wczesniej poprawilem. Sek w tym ze jak recznie ustawie moc np. 666, to działa. A jak probuje joystickiem to nie chce :(

    Jasna choroba! Widzisz te sredniki po ifach? Jestem debil <epic facepalm>
  • Pomocny post
    #22 10426397
    Electix
    Poziom 21  
    Posty: 462
    Pomógł: 46
    Ocena: 6
    I tu jeszcze taki błąd wypatrzyłem.
    Piszesz:
    
    if ((!getPinState(17))&&(moc+zmiana<1023));
    { moc+= zmiana; }
    if ((!getPinState(20))&&(moc-zmiana>0));
    {moc -= zmiana; }

    jeżeli stawiasz średnik zaraz za instrukcją warunkową, to program sprawdza tylko warunek, po czym wykonuje blok instrukcji z {}, u Ciebie w bloku masz pojedyńcze instrukcje, bez sensu jest więc dawać je w blok.
    Może to miało być tak?
    
    if ((!getPinState(17))&&(moc+zmiana<1023)) moc+= zmiana;
    if ((!getPinState(20))&&(moc-zmiana>0)) moc -= zmiana;
    

    Ewentualnie tak, choć ta forma przydaje się kiedy jest więcej niż jedna instrukcji do wykonania dla warunku:
    
    if ((!getPinState(17))&&(moc+zmiana<1023))
    {
        moc+= zmiana;
    }
    if ((!getPinState(20))&&(moc-zmiana>0))
    {
        moc -= zmiana;
    }
  • #23 10426406
    Martinuz
    Poziom 9  
    Posty: 15
    Przed chwila na to wpadlem i modyfikowalem post, ale widac ze byles zajety niesieniem pomocy ;) Za co bardzo dziekuje Tobie jak i wszystkim tutaj zgromadzonym!
    Temat rozwiazany!

Podsumowanie tematu

✨ Użytkownik zgłosił problem z generowaniem fali dźwiękowej za pomocą PWM na pinie P0.12 mikrokontrolera LPC2148. Okazało się, że P0.12 nie obsługuje PWM, a jedynie funkcjonalność Timera. Użytkownik zapytał o możliwość przekierowania PWM na inny pin, jednak odpowiedzi wskazały, że głośnik powinien być podłączony do P0.25, który obsługuje wyjście przetwornika DAC. Użytkownik zrozumiał, że do generowania dźwięku należy użyć DAC, a nie PWM. W dyskusji omówiono również sposób konfiguracji rejestrów oraz generowania sygnałów analogowych, a także błędy w kodzie, które uniemożliwiały poprawne działanie programu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA