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

[AVR][C] ATMega8 - Sterowanie buzzerem za pomocą PWM

proc9 23 Mar 2009 18:53 17642 23
  • #1 6322155
    proc9
    Poziom 14  
    Posty: 143
    Pomógł: 4
    Ocena: 3
    Mam śmieszny problem z PWM... Chciałbym wysterować buzzer (bez generatora)
    Może się wydawać, że "ale n00b! nie umie używać google".
    Szukałem, ale ciągle nie potrafię używać PWM.
    Znalazłem bibliotekę ORANGUTAN - prosta, ale nie działa (sprawdzałem porty w plikach nagłówkowych).
    Proszę o rady.
  • #2 6323158
    cavendish
    Poziom 17  
    Posty: 199
    Pomógł: 27
    Ocena: 47
    Może takie ustawienia?

    TCCR1A = _BV(COM1A1)|_BV(COM1A0)|_BV(WGM10)|_BV(WGM12); // timer 1 fast PWM 8 bit
    TCCR1B = _BV(CS10);  //no prescaling


    Wartością w rejestrze OCR1A sterujesz wypełnieniem przebiegu na nóżce PB1(OC1A). Dobierz sobie odpowiednią częstotliwość preskalera na podstawie datasheet'u.
  • #3 6323440
    proc9
    Poziom 14  
    Posty: 143
    Pomógł: 4
    Ocena: 3
    A jak dokładniej reguluje się częstotliwość?
    Mam przed sobą dokumentację, ale nic nie rozumiem...
  • #4 6323478
    dawid512
    Poziom 32  
    Posty: 1439
    Pomógł: 229
    Ocena: 6
    Nie częstotliwość a wypełnienie reguluje się wpisując do rejestru OCR1A jakąś wartość. Jeżeli chcesz regulować częstotliwość to musisz skorzystać z innego trybu.
  • #5 6323633
    proc9
    Poziom 14  
    Posty: 143
    Pomógł: 4
    Ocena: 3
    PWM, wypełnienie wiem, a częstotliwość to już co innego prawda?
    Chyba to drugie lepsze do buzzera.
    Chodzi mi tylko o zagranie nutek.
  • #6 6324419
    _Robak_
    Poziom 33  
    Posty: 2209
    Pomógł: 231
    Ocena: 29
    To musisz ustawic taki tryb PWM gdzie TOP to ICR a wypelnienie OCR (albo na odwrot). Wtedyrejestrem ICR zmieniasz czestotliowsc, a OCR ustawiasz zawsze na polowe ICR.
  • #7 6325576
    proc9
    Poziom 14  
    Posty: 143
    Pomógł: 4
    Ocena: 3
    Wybaczcie, jestem początkujący.
    Mógłbym prosić o jakiś link lub przykład?
  • #9 6325683
    proc9
    Poziom 14  
    Posty: 143
    Pomógł: 4
    Ocena: 3
    Też to znalazłem, podłączyłem do PB2 i nie działa...
    Ciekawe czego nie da się tego odczytać, jakie kodowanie ma ta strona?
  • #10 6325971
    _Robak_
    Poziom 33  
    Posty: 2209
    Pomógł: 231
    Ocena: 29
    Bo ten kod jest na atmega16, musisz go zamienic zeby pasowal na atmege8
  • #11 6326149
    proc9
    Poziom 14  
    Posty: 143
    Pomógł: 4
    Ocena: 3
    _Robak_ napisał:
    Bo ten kod jest na atmega16, musisz go zamienic zeby pasowal na atmege8

    To akurat oczywiste, zmieniłem porty, ale dalej problemy.
  • #12 6326627
    kaktus_c++
    Poziom 18  
    Posty: 231
    Pomógł: 26
    Ocena: 3
    Co to znaczy że nie działa? nie daje dźwięku wcale czy dźwięk jest ale się nie zmienia jak byś chciał?
    I jakiego "buzzera" używasz? piezo?
    Z moich doświadczeń wynika że piezo albo daje dźwięk albo nie i nie spodziewałbym się że pwm by zadziałał z piezo, ale może się mylę...
    ...
    o, napisałeś że bez generatora, to może wtedy sprawa wygląda inaczej.
  • #13 6327678
    proc9
    Poziom 14  
    Posty: 143
    Pomógł: 4
    Ocena: 3
    Sprawdziłem i okazało się że piezo jest uszkodzone.
    Zrobiłem prosty wzmacniacz na jednym tranzystorze, podłączyłem do niego mały głośnik i napisałem na razie bardzo prosty program:

    #define EVER ;;
    #include <util\delay.h>
    #include <avr\io.h>
    
    int main(void)
    {
    	DDRD  = 0x01; // PD0 to wyjście tranzystora
    
    	DDRC  = 0x01; // PC0 to wejście
    	PORTC = 0x01; // PC0 ma włączone pull-up
    
    	for(EVER)
    	{
    		while (!(PINC & 0x01))
    		{
    			PORTD = 0x01;
    			_delay_us(330);
    
    			PORTD = 0x00;
    			_delay_us(330);
    		}
    	}
    }


    Wcześniej pisałem programy na komputery w C++, ale AVR to zupełnie co innego...
    To nie jest typowe PWM, ale na testy zadanie spełnia (głośnik wydaje dźwięk)
    Prosiłbym o pomoc w generowaniu sygnału o określonej częstotliwości lub PWM.
    Dziękuję.
  • #14 6330505
    kaktus_c++
    Poziom 18  
    Posty: 231
    Pomógł: 26
    Ocena: 3
    Jeśli używasz głośnika a nie piezo to sprawa jest prosta. Na stronie Teodora Otulaka jest tutorial i tam jest przykład podłączenia głośniczka bezpośrednio do portów mikrokontrolera - 1 biegun do jednego pina drugi do drugiego pina. Działa świetnie i bez pwm, sprawdzałem, tylko znajdź mały głośniczek, np. taki jak od telefonu komórkowego.
    http://www.patron.ehost.pl/patron/artykuly/vinavr/AVR_tutorial.htm
  • #15 6330869
    proc9
    Poziom 14  
    Posty: 143
    Pomógł: 4
    Ocena: 3
    Aha dzięki, ale chodzi mi o PWM (głośnik tylko na testy).
    Chcę w przyszłości sterować silnikiem.
    Dziękuję

    EDIT:
    Chyba coś w tym znajdę. Mam nadzieję, że jest tam coś o silnikach... Dzięki
  • #16 6355179
    proc9
    Poziom 14  
    Posty: 143
    Pomógł: 4
    Ocena: 3
    Niestety nic z tego nie rozumiem...
  • Pomocny post
    #17 6360576
    Xander36
    Poziom 2  
    Posty: 2
    Pomógł: 1
    Ocena: 4
    Witam.
    Na forum jestem nowy, ale Atmege8 gryzę już od roku:).
    Zakładam że czytałeś datasheet'a od Atmega8 i niestety nie udało Ci się zrozumieć.Jeżeli tak to Ci pomogę.
    Po pierwsze w Atmega8 masz trzy timery/countery:
    -Timer0 8bit
    -Timer1 16bit
    -Timer2 8bit
    Timer1 i Timer2 możesz wykorzystać jako PWM,gdyż mają wbudowaną taką funkcje. Wiadomo że 16bitowy daje większą dokładność ustawienia PWM(rozdzielczość), ale na początek możesz użyć tego Timer2 chyba jest prostszy.
    Pamiętaj że częstotliwość PWM będzie związana z częstotliwością z jaką chodzi Atmeg8.Związek ten jest określony wzorem do każdego z trybów pracy.Mogę jeszcze pisać i pisać ale nic tak nie pomaga w zrozumieniu jak przykład.Oto i on:
    
    // ***********************************************************
    // Project:Program testowy do oblsugi PWM w Atmega8
    // Author:Zilbert Szymanski
    // Module description:ZilPlytkaNaAtmega8
    // ***********************************************************
    
    #include <avr\io.h>              // Most basic include files
    #include <avr\interrupt.h>       // Add the necessary ones
    
    
    
    
    
    //Atmega8 chodzi na 8MHz
    
    
    
    int main(void) {
    
    
         DDRC=0xff;//porty C jako wyjsciowe
         DDRB=0xff;//porty B jako wyjsciowe
        
       
    
    ///ustawienia timera2 generatora pwm
    TCCR2=(1<<WGM20)|(0<<WGM21)|(1<<CS20)|(0<<CS21)|(0<<CS22)|(0<<COM20)|(1<<COM21);
    //precaler przez 1(noprescaling) Phase Correct PWM Mode oc2  na pb3
    //czestotliwosc PWMa 15,7kHz
    TCNT2=0x00;
    OCR2=128;//50% no i u kolego regulujesz wypelnienie:) masz liczy od 0 //do 255
    
    
    
    
     while(1)//petla nieskonczona aby mikro sobie chodził:)
     {
      
    
     }
    
    
    }
    

    Wzór określający częstotliwość dla powyższego przykładu to:
    [AVR][C] ATMega8 - Sterowanie buzzerem za pomocą PWM
    Fclk- to czestotliwosc mikro
    N- wartosc prescalera
    Focn...-To czestotliwsc tego PWMa
    Mam nadzieje że pomogłem i niezaględziłem zanadto.
    Pozdrawiam.
    Punkty mile widzane:)
  • #18 6364110
    proc9
    Poziom 14  
    Posty: 143
    Pomógł: 4
    Ocena: 3
    Super wytłumaczenie dzięki :)
    Cytat:
    Punkty mile widzane:)

    Tak powinno być pozdrawiam
  • #19 7775997
    Pea5
    Poziom 12  
    Posty: 78
    Ocena: 2
    Witam czy można liczyć na jakiś bliższy opis tych trzech linii:

    ///ustawienia timera2 generatora pwm
    TCCR2=(1<<WGM20)|(0<<WGM21)|(1<<CS20)|(0<<CS21)|(0<<CS22)|(0<<COM20)|(1<<COM21);
    //precaler przez 1(noprescaling) Phase Correct PWM Mode oc2 na pb3
    //czestotliwosc PWMa 15,7kHz
    TCNT2=0x00;
    OCR2=128;//50% no i u kolego regulujesz wypelnienie:) masz liczy od 0 //do 255

    Bardzo proszę, od 2h próbuje znaleść co to jest chociażby WGM21....
  • #20 7776506
    oskar777

    Poziom 26  
    Posty: 1264
    Pomógł: 76
    Ocena: 243
    Hem :>, trzecia strona w google
    http://www.societyofrobots.com/member_tutorials/files/ATMega8.pdf
    ustawienia bitów dla rejestrów związanych z PWM.
    Pozdrawiam
    Konto firmowe:
    Oskar-info
    Gidzińskiego 24/1, Warszawa, 02-293 | Tel.: 501XXXXXX (Pokaż) | Strona WWW: http://oskar-info.pl
  • #21 7824760
    shoko_gora
    Poziom 12  
    Posty: 47
    Pomógł: 3
    Ocena: 13
    Xander36, to było krótko, zwięźle i na temat, tak jak prawdziwy technik:) Szukałem po elektrodzie pwm na atemega8 i twój post jest genialny poprostu:]
  • #22 8051133
    Adrian_sekowski
    Warunkowo odblokowany
    Posty: 272
    Ocena: 6
    Zaj..... post trzeba przyznać.

    - sens,
    - prostota,
    - krótko i na temat

    Moje pytanie czy idzie i jak to zrobić aby częstotliwość naszego PWM była nie 15kHz tylko np 200kHz lub jeszcze lepiej 1Mhz

    Powód jest prosty, Chcę wypełnieniem impulsów sterować jasnością świecenia wyświetlaczy (wiadomo fototranzysor - przetwornik A/C - PWM) Tylko że mi będzie przełączał 14 wyświetlaczy powiedzmy że z prędkością 100kHz (załóżmy tak). No i ten sygnał PWM nie nadąży za zmianą segmentów.

    Pwm będzie odcinał całkowicie prąd płynący do Wyświetlaczy a więc wyświetlacze bądą zazwyczaj nieaktywne gdyż nie będą miały prądu (PWM da nam 15kHz prąd z wypełnieniem (załóżmy 25-75%) a ja przełączam wyświetlacze 100kHz)

    Jakiś pomysł aby mi pomóc?
  • #23 12280019
    Michał 911
    Poziom 18  
    Posty: 343
    Pomógł: 13
    Ocena: 24
    Xander36 - to co napisałeś, to tym można zmieniać chyba tylko na takie częstotliwości jak 1/8, 1/64, ... , 1/1024, czy na dowolną częstotliwość tez można?
    Jeżeli nie, to jak to zrobić, żeby np. można było ustawiać 10 częstotliwość z zakresu 2-4kHz?
  • #24 12280026
    DawwidW
    Poziom 15  
    Posty: 185
    Pomógł: 3
    Ocena: 78
    Dobre pytanie Michał 911, też się nad tym zastanawiałem, ale nie mogę nigdzie znaleźć odpowiedzi.

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z generowaniem sygnału PWM na mikrokontrolerze ATMega8 w celu sterowania buzzerem bez użycia generatora zewnętrznego. Autor próbuje wykorzystać bibliotekę ORANGUTAN, jednak bez powodzenia, co prowadzi do pytań o konfigurację timerów i rejestrów PWM. Wskazano, że w ATMega8 dostępne są trzy timery: Timer0 (8-bit), Timer1 (16-bit) i Timer2 (8-bit), z których Timer1 i Timer2 obsługują PWM. Zalecane jest użycie Timer2 na początek ze względu na prostotę. Omówiono różnicę między regulacją wypełnienia impulsu (OCRx) a częstotliwością PWM (ICR lub inny rejestr w trybie PWM z regulowanym TOP). Podkreślono, że do generowania dźwięków (nutek) lepsza jest zmiana częstotliwości PWM. Autor otrzymał przykładowy kod i linki do tutoriali, m.in. do strony Teodora Otulaka oraz elektrody, jednak napotkał problemy z dopasowaniem kodu z ATMega16 do ATMega8. W trakcie testów okazało się, że piezo było uszkodzone, więc zastosowano prosty wzmacniacz tranzystorowy i mały głośnik. Dyskutowano także o ograniczeniach częstotliwości PWM, możliwościach ustawiania preskalera i trybów pracy timerów, a także o potrzebie generowania wyższych częstotliwości PWM (np. 200 kHz, 1 MHz) do sterowania jasnością wyświetlaczy lub silników. Wskazano, że standardowe preskalery oferują dyskretne wartości, co utrudnia uzyskanie dowolnej częstotliwości PWM, a pytania o bardziej zaawansowane metody regulacji pozostają otwarte. Podsumowując, dyskusja zawiera praktyczne wskazówki dotyczące konfiguracji timerów i rejestrów PWM w ATMega8, przykłady kodu oraz uwagi dotyczące sprzętowego podłączenia buzzera/głośnika i ograniczeń technicznych PWM w tym mikrokontrolerze.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA