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

Jak uruchomić wysoką częstotliwość PWM na ATtiny45? Kod nie działa poprawnie

No Comprende 01 Maj 2006 14:44 2003 8
REKLAMA
  • #1 2580404
    No Comprende
    Poziom 12  
    Posty: 93
    Pomógł: 4
    Ocena: 2
    Witam, mam problem z odpaleniem pwm w trybie jak w temacie.
    Wydaje mi sie ze wszystko robie zgodnie z nota katalogowa, jednak procek zachowuje sie jakby tajmer chodzil w trybie synchronicznym, tzn pracuje wolniej niz powinien.
    Oto kod:

    
    					;***Init Tajmera1***
    
    	ldi r16,1<<PLLE		;-----Inicjalizacja PLL----
    	out PLLCSR,r16		;PLL enable
    
    waitPLL:
    	in	r16, PLLCSR		;Czekaj na odpalenie PLL (approx. 100ms)
    	sbrs r16, PLOCK					
    	rjmp waitPLL
    
    
    	in r16,PLLCSR
    	ori r16,1<<PCKE
    	out PLLCSR,r16		;Odpal PLL jako zegar dla PWM
    						;---------------------------
    	ser r16
    	out OCR1C,r16		;Rozdzielczosc PWM = 8b
    	ldi r16,1<<PWM1A | 1<<COM1A1 | 1<<CS10 ;| 1<<CS10
    	out TCCR1,r16				   ;Tryb fast PWM_A aktywny
    								   ;Wy OC1A (PB1) ustawiane dla TCNT1 = 0x01
    								   ;Zerowane dla zgodnego porownania TCNT1 z OCR1A
    								   ;TOP = OCR1C
    								   ;Preskaler = 1, Tajmer start
    


    Kto mi powie czemu to nie dziala obsypie zlotem ;)
    Tego procka uzywam do odtwarzania dzwieku, i dzwiek jest, ale zbyt wolny.
    Bardzo prosze o wszelkie sugestie i rady
  • REKLAMA
  • #2 2582539
    Nawigator
    Poziom 33  
    Posty: 1923
    Pomógł: 167
    Ocena: 160
    Fast PWM daje Ci tylko sterowanie poziomem czyli po wygładzeniu amplitudę. Natomiast "szybkość" dźwięku określa taktowanie wpisów do OCR1A z pamięci a o tym nic nie piszesz. Ta szybkość bedzie związana z zegarem procesora, podejrzewam że nie masz zewnetrznego kwarcu tylko oscylator wewnętrzny rc który po dzielniku daje fabrycznie chyba 1MHz jako clock systemowy. Zmiana ustawień fusebitami.
    Jak co 1ms zmienisz wpis w OCR1A na inny a potem znowu na ten sam to otrzymasz 500Hz prostokąt.
    Pozdr. N.
  • REKLAMA
  • #3 2583272
    No Comprende
    Poziom 12  
    Posty: 93
    Pomógł: 4
    Ocena: 2
    Dzielenie wewnetrzne zegara wylaczylem i byl ustawiony na 8MHz. Wpisu do OCR1A dokonuje w procedurze obslugi przerwania od przepelnienia. Poczatkowo ustawilem preskaler pck na 4, wiec czestotliwosc pwm powinna wynosic 16MHz. Czyli wpis do OCR1A powinien nastepowac co 128 cykli wewnetrznego oscylatora ("normalnego" zegara) - tak to rozumiem.
    Jak odpalilem calosc to dzwiek byl dosc niski w brzmieniu. Na tiny 13 ustawionym na 9,6MHz ten sam dzwiek mial wyzsza czestotliwosc.

    Dlatego wywnioskowalem ze pwm jest taktowany z wewnetrzengo oscylatora z czestotliwoscia 8MHz a nie jak chcialem z PCK.
  • REKLAMA
  • #4 2583533
    Nawigator
    Poziom 33  
    Posty: 1923
    Pomógł: 167
    Ocena: 160
    Zegar fast PWM i systemowy to dwie oddzielne sprawy.
    Coś mi sie wydaje że chcesz to zrobić na jednym liczniku, nie za bardzo mogę to sobie wyobrazić. Taktowanie próbek fonii to jeden licznik, PWM to drugi (tutaj T0). PWM służy tu jako przetwornik D/A z łatwą filtracją bo na wysokiej częstotliwości.
    Były noty Atmela na ten temat, poszukaj.
    I przegladnij jeszcze raz rejestry konfiguracyjne od zegarów bo jest ich dużo, może coś pominąłeś.
    Powodzenia N.
  • #5 2584539
    No Comprende
    Poziom 12  
    Posty: 93
    Pomógł: 4
    Ocena: 2
    No wlasnie na jednym liczniku chcialem to zrobic, potrzeba dwoch?
    Czytalem noty i wywnioskowalem z nich ze tylko jeden timer jest potrzebny. Wartosc podawana do OCR1A wprost proporcjonalnie wplywa na ilosc ladunku jaki gromadzi sie na kondensatorze - modulujac amplitude. Czestotliwosc pwm to albo zegar systemowy dzialajacy na jednym zboczu (tryb synchroniczny) albo dzialajacy na obu zboczach (tryb asynchr.) plus oczywisce preskaler.
    Czyli czestotliwosc taktowania probek dzwieku to czest.pwm / 256

    Zreszta to sa wlasciwie detale bo najbardziej interesuje mnie sprawa odpalenia tego tajmera. Czy da sie jakos sprawdzic w jakim trybie pracuje. Ew. czemu tryb asynchroniczny nie dziala
  • REKLAMA
  • #6 2586301
    Nawigator
    Poziom 33  
    Posty: 1923
    Pomógł: 167
    Ocena: 160
    No trudno mi dalej Ci coś doradzać bo mieszasz wszystko na raz. W której nocie czytałeś że tylko jeden timer potrzebny?
    Podałem Ci sposób jak sprawdzic czy fast pwm działa, napisz ten programik i wypróbój. Góra 15 rozkazów i wszystko wiadomo. Jak nie to go tu pokaż w całości a nie będziemy zgadywać, od tego są telewizje komercyjne.
    Pozdr. N.
  • #7 2587176
    No Comprende
    Poziom 12  
    Posty: 93
    Pomógł: 4
    Ocena: 2
    Te noty to nr 335 i 131. Przejrzalem je jeszcze raz i nie widze zeby pisali o dwoch licznikach.

    Pisales ze: "Jak co 1ms zmienisz wpis w OCR1A na inny a potem znowu na ten sam to otrzymasz 500Hz prostokąt."

    Niestety nie mam czym zmierzyc czestotliwosci na wyjsciu, ale wydaje mi sie ze czestotliwosc zalezy tylko od zegara pwm i wpisu w OCR1C. 500kHz mozna by osiagnac np dla zegara = 64MHz i OCR1C = 128
    Zmienianie OCR1A powodowalo by zmiane wypelnienia prostokata ale nie czestotliwosci - tak zrozumialem noty.

    Oto caly kod:


    Cytat:

    .include "tn45def.inc"


    .equ SYS_FREQ = 8
    .def dane = r20
    .def ah = r25 ;wskaznik adresu dla eeprom szeregowego MSB
    .def al = r24 ;LSB



    .cseg

    .org 0x000
    rjmp reset
    .org 0x004
    rjmp tc1_ovf ;Przerwanie od przepelnienia T1
    reset:
    ldi r16,low(ramend) ;***Init Stosu***
    out spl,r16

    sbi ddrb,1 ;***Init Portow***
    ;PB1 pracuje jako wyjscie fastPWM
    cbi ddrb,2 ;PB2 pracuje jako we (przycisk)
    sbi portb,2 ;z podciaganiem
    sbi ddrb,3 ;PB3 jako wyjscie -> SCL
    sbi ddrb,4 ;PB4 jako wyjscie -> SDA

    ;***Init Tajmera1***

    ldi r16,1<<PLLE ;-----Inicjalizacja PLL----
    out PLLCSR,r16 ;PLL enable

    waitPLL:
    in r16, PLLCSR ;Czekaj na odpalenie PLL (approx. 100ms)
    sbrs r16, PLOCK
    rjmp waitPLL


    in r16,PLLCSR
    ori r16,1<<PCKE
    out PLLCSR,r16 ;Odpal PLL jako zegar dla PWM
    ;---------------------------
    ser r16
    out OCR1C,r16 ;Rozdzielczosc PWM = 8b
    ldi r16,1<<PWM1A | 1<<COM1A1 | 1<<CS10 ;| 1<<CS10
    out TCCR1,r16 ;Tryb fast PWM_A aktywny
    ;Wy OC1A (PB1) ustawiane dla TCNT1 = 0x01
    ;Zerowane dla zgodnego porownania TCNT1 z OCR1A
    ;TOP = OCR1C
    ;Preskaler = 1, Tajmer start

    ldi r16,1<<TOIE1 ;***Init Masek Przerwan***
    out TIMSK,r16 ;Zezwolenie na przerwanie od przepelnienia T1
    sei ;Globalne zezwolenie na przerwania

    clr al ;***Init rejestrow***
    clr ah

    rcall czytaj_bajt ;odczytany bajt znajduje sie w "dane"

    stop:
    rjmp stop

    ;****************Procedury Obslugi Przerwan*******************

    tc1_ovf:
    out OCR1A,dane
    rcall czytaj_bajt
    reti


    Dalej jest procedura czytaj_bajt - odczyt z szeregowego eepromu.

    Jak widac czestotliwosc taktowania probek dzwieku (zapisu do OCR1A) to jest czest.PWM/256
    Probka jest zapisywana do OCR1A co wplywa na zmiane wypelnienia prostokata na wyjsciu pwm.
    Czy sposob w jaki to zrealizowalem jest bledny?

    Jesli mialbym to zrobic na dwoch tajmerach to rozumiem ze za czestotliwosc taktowania probek odpowiadal by T0 a sama probka byla by zapisywana do OCR1A. Z jaka czestotliwoscia musialby by wtedy pracowac T1 ?
  • Pomocny post
    #8 2587610
    Nawigator
    Poziom 33  
    Posty: 1923
    Pomógł: 167
    Ocena: 160
    Tak, ten mój przykład z prostokątem 500Hz jest trochę mylący.
    500Hz pochodzi nie z podziału zegara fast pwm ale dowolnego innego a prostokąt odtwarza zmiany wypełnienia. Częstotliwość na wyjściu pwm nie ma większego znaczenia.
    Myślałem o czymś takim, po inicjalizacji pwm, bez przerwań, 75 i 187 z sufitu:

    loop:
    OCR1A=75
    delay 1ms
    OCR1A=187
    delay 1ms
    rjmp loop

    Inicjalizacja pwm powinna np. być:
    preskaler np. 64MHz/8 co da 8MHz częstotliwość zegara pwm co przy rozdzielczosci 8bit OCR1C=255 daje 8MHz/256=31,25kHz i taki ciągły prostokąt otrzymasz na wyjściu. Po scałkowaniu rc filtrem dolnoprzepustowym o pasmie kilka kHz przy wpisie OCR1A=75 otrzymasz napiecie stałe ok 75/256x5V=1,46V a dla OCR1A=187 będzie to 187/256x5V=3,65V.
    Po uruchomieniu w/w programu testowego otrzymasz wiec prostokąt 500Hz z poziomami 1,46 i 3,65.
    1ms bedzie tu okresem próbkowania.
    W notach Atmela faktycznie jest 1 licznik użyty ale zauważ:
    The example is based on that the device is clocked from the internal RC oscillator, which is 8 MHz ( z noty131)
    Czyli drugim licznikiem jest tam czas wykonywania pętli main.
    Być moze jest jakiś preskaler dla pwm który pozwoli wykorzystac tylko T1 do całej obsługi, przelicz. Trzeba zacząć od potrzebnej rozdzielczości i czestotliwosci pwm (dla mowy wystarczy 10kHz).
    Pozdr. N.

    PS. może tutaj cos znajdziesz dodatkowo:
    http://avr.15.forumer.com/index.php?showforum=23
    dużo softu tematycznie w jednym miejscu.
  • #9 2608330
    No Comprende
    Poziom 12  
    Posty: 93
    Pomógł: 4
    Ocena: 2
    No i okazalo sie, dzieki twojej pomocy, ze inicjalizacja jest ok i licznik chodzi jak nalezy. Problemem byl natomiast dlugi (jak na moje oczekiwania) czas pobierania kolejnych bajtow z eepromu. Myslalem ze jest on nizszy niz 256 cykli tymczasem jest sporo dluzszy. W tej sytuacji to wlasnie czas trwania tej procedury odpowiadal za taktowanie probek dzwieku.
    Po potraktowaniu procka kwarcem 20MHz mozna odtwarzac dzwiek o czestotliwosci probkowania ok.11kHz wiec wystarczy.

    Zaczalem sie tez zastanawiac czy nie poprobowac jeszcze tej metody BTC, bo moze ten dlugi czas pobierania danych odpowiadal za duze znieksztalcenia. A oszczednosc w pamieci byla by imponujaca ;p
    No ale to inny watek :d

    Dzieki za pomoc!

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemu uruchomienia wysokoczęstotliwościowego PWM na mikrokontrolerze ATtiny45. Autor kodu inicjalizuje timer1 w trybie Fast PWM z zegarem PLL i preskalerem 1, oczekując częstotliwości PWM rzędu 16 MHz podzielonej przez 256 (ok. 62,5 kHz). Jednak PWM działa wolniej, co sugeruje taktowanie z wewnętrznego oscylatora RC zamiast z zegara PLL. Wskazano, że częstotliwość PWM zależy od ustawień zegara systemowego i rejestru OCR1C, a zmiana OCR1A wpływa na wypełnienie impulsu, nie na częstotliwość. Zasugerowano test prostego programu zmieniającego OCR1A co 1 ms, aby zweryfikować działanie PWM. Poruszono kwestię użycia jednego lub dwóch timerów – jeden do generacji PWM, drugi do taktowania próbkowania dźwięku. Ostatecznie problemem okazał się długi czas odczytu danych z EEPROM, który ograniczał częstotliwość próbkowania. Po zastosowaniu kwarcu 20 MHz uzyskano próbkowanie ok. 11 kHz, co jest wystarczające do odtwarzania dźwięku. Wspomniano także o możliwości zastosowania metody BTC dla oszczędności pamięci i redukcji zniekształceń.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA