Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

23 Mar 2009 18:53 16826 23
  • Poziom 14  
    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.
  • Poziom 17  
    Może takie ustawienia?

    Code:
    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.
  • Poziom 14  
    A jak dokładniej reguluje się częstotliwość?
    Mam przed sobą dokumentację, ale nic nie rozumiem...
  • Poziom 32  
    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.
  • Poziom 14  
    PWM, wypełnienie wiem, a częstotliwość to już co innego prawda?
    Chyba to drugie lepsze do buzzera.
    Chodzi mi tylko o zagranie nutek.
  • Poziom 33  
    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.
  • Poziom 14  
    Wybaczcie, jestem początkujący.
    Mógłbym prosić o jakiś link lub przykład?
  • Poziom 14  
    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?
  • Poziom 33  
    Bo ten kod jest na atmega16, musisz go zamienic zeby pasowal na atmege8
  • Poziom 14  
    _Robak_ napisał:
    Bo ten kod jest na atmega16, musisz go zamienic zeby pasowal na atmege8

    To akurat oczywiste, zmieniłem porty, ale dalej problemy.
  • Poziom 18  
    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.
  • Poziom 14  
    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:

    Code:
    #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ę.
  • Poziom 18  
    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
  • Poziom 14  
    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
  • Poziom 14  
    Niestety nic z tego nie rozumiem...
  • Pomocny post
    Poziom 2  
    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:
    Code:

    // ***********************************************************
    // 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:)
  • Poziom 14  
    Super wytłumaczenie dzięki :)
    Cytat:
    Punkty mile widzane:)

    Tak powinno być pozdrawiam
  • Poziom 12  
    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....

  • Poziom 26  
  • Poziom 11  
    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:]
  • Warunkowo odblokowany
    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?
  • Poziom 18  
    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?
  • Poziom 15  
    Dobre pytanie Michał 911, też się nad tym zastanawiałem, ale nie mogę nigdzie znaleźć odpowiedzi.