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

[ATMEGA32][C] problem z pwm

sebke 07 Cze 2009 23:43 3436 6
REKLAMA
  • #1 6629496
    sebke
    Poziom 10  
    Witam,

    /* Przyciski sterujace szerokoscia impulsu przylaczone miedzy PD0 i mase  oraz  PD1 i mase */
    
    
    #define F_CPU 8000000L
    #include <avr/io.h>
    	
    
    int main(void) 
    {
      int p = 0;
    
      DDRD =0x00;
      PORTD=0x03;
      DDRB |=_BV(3);//pin OC0 połaczony z diodą
     
      TCNT0 =500;
      OCR0=0;
       
     
      
      TCCR0 |=(1<<WGM00)|(1<<COM01)|(1<<CS02)|(1<<CS01)|(1<<CS00);//PWM korekcja fazy,preskaler 1024
     
      for (;;)
      {
         if(bit_is_clear(PIND, 0))
         {
             p+=10;
             if(p > 500)
    		 
    		  p=500;
    
             OCR0=p;  
             loop_until_bit_is_set(PIND, 0); /* Czeka az przycisk zostanie zwolniony */
         }
         if(bit_is_clear(PIND, 1))
         {
             p-=10;
             if(p < 0) 
    		 
    		 p=0;
    
             OCR0=p;  
             loop_until_bit_is_set(PIND, 1);
         }
      }
    }


    Po wgłebieniu się w tajniki datasheet'a chciałem wygenerować PWM'a i sterowania jego wypełnieniem za pomocą przycisków PD0 i PD1.

    Wydaje mi się ze wszystko dobrze napisałem zgodnie z tym co jest w datasheet ale ten kod nie działa i juz nie mam pomysłu co by tu jeszcze dopisać ewentualnie usunąć.

    Prosiłbym o jakieś sugestie do kodu.
  • REKLAMA
  • #2 6629600
    dawid512
    Poziom 32  
    Miałeś źle wybrany preskaler ( nie chodzi o liczbę). Po za tym T0 jest 8 - bitowy.

    /* Przyciski sterujace szerokoscia impulsu przylaczone miedzy PD0 i mase  oraz  PD1 i mase */
    
    
    #define F_CPU 8000000L
    #include <avr/io.h>
       
    
    int main(void)
    {
      int p = 0;
    
      DDRD =0x00;
      PORTD=0x03;
      DDRB |=_BV(3);//pin OC0 połaczony z diodą
     
      TCNT0 =255;  //timer0 jest 8 bitowy!!!
      OCR0=0;
       
     
     
      TCCR0 |=(1<<WGM00)|(1<<COM01)|(1<<CS02);//PWM korekcja fazy,preskaler 256
     
      for (;;)
      {
         if(bit_is_clear(PIND, 0))
         {
             p+=10;
             if(p > 255)
          
            p=255;
    
             OCR0=p; 
             loop_until_bit_is_set(PIND, 0); /* Czeka az przycisk zostanie zwolniony */
         }
         if(bit_is_clear(PIND, 1))
         {
             p-=10;
             if(p < 0)
          
           p=0;
    
             OCR0=p; 
             loop_until_bit_is_set(PIND, 1);
         }
      }
    }
    
  • REKLAMA
  • #3 6641046
    sebke
    Poziom 10  
    Dziękuje dawid512 za rozwiązanie problemu :)

    Za to pojawił się kolejny problem. Poniewąz ten PWM używam do sterowania mocą silnika dc poprzez tranzystor BC337 to jezeli bedzie zachowany taki kształt programu jak powyżej to silnikiem strasznie szarpie przy małym PWM-ie, wiec żeby to wyeliminować zmniejszyłem preskaler na 1. Co prawda silnik wtedy płynnie działa, ale przy dośc małym pwm'ie wydaje piskliwy dźwięk co jest bardzo uciążliwe i podejrzewam nie zadobre dla samego silnika.

    Teraz czas na pytanie jak wyeliminować ten dźwięk?
  • REKLAMA
  • Pomocny post
    #4 6641230
    dawid512
    Poziom 32  
    Podejrzewam że częstotliwość przebiegu jest zbyt duża.
  • Pomocny post
    #5 6641357
    arrevalk
    Poziom 25  
    Przy częstotliwości rdzenia 8Mhz sygnał PWM będzie niestety prawie zawsze słyszalny (częstotliwość PWM będzie się zawierała w przedziale od 120Hz do 31kHz w zależności od preskalera). Ludzkie ucho potrafi zarejestrować częstotliwości do ok 20Khz natomiast wyższe odczuwamy jako dyskomfort (zatykający uszy pisk).
    Nie każdy to usłyszy bo zakres słyszalnych dźwieków każdy ma inny.
    Częstotliwość powyżej 40kHz powinna zalatwić sprawę, tylko że przy takim fcpu jej nie osiągniesz.
    Ma to wpływ jedynia na komfort przebywania przy silniku, samemu silnikowi to nie przeszkadza ;)
    A przy niższych czestotliwościach ci szarpało bo okres pwm był za niski, więc pulsacja prądu w uzwojeniach silnika była duża, a co za tym idzie moment pulsował (w silnikach szczotkowych DC moment jest liniowo zależny od prądu uzwojeń).
  • REKLAMA
  • #6 6655865
    sebke
    Poziom 10  
    Dzieki za odpowiedź, z tym dźwiękiem sobie poradziłem :) silnik startuje od 1/4 mocy wtedy ten dżwięk jest już prawie nie słyszalny co mnie już wystarcza.
  • #7 7277714
    Mihó
    Poziom 27  
    dawid512 napisał:
    Miałeś źle wybrany preskaler ( nie chodzi o liczbę). Po za tym T0 jest 8 - bitowy.

    /* Przyciski sterujace szerokoscia impulsu przylaczone miedzy PD0 i mase  oraz  PD1 i mase */
    
    
    #define F_CPU 8000000L
    #include <avr/io.h>
       
    
    int main(void)
    {
      int p = 0;
    
      DDRD =0x00;
      PORTD=0x03;
      DDRB |=_BV(3);//pin OC0 połaczony z diodą
     
      TCNT0 =255;  //timer0 jest 8 bitowy!!!
      OCR0=0;
       
     
     
      TCCR0 |=(1<<WGM00)|(1<<COM01)|(1<<CS02);//PWM korekcja fazy,preskaler 256
     
      for (;;)
      {
         if(bit_is_clear(PIND, 0))
         {
             p+=10;
             if(p > 255)
          
            p=255;
    
             OCR0=p; 
             loop_until_bit_is_set(PIND, 0); /* Czeka az przycisk zostanie zwolniony */
         }
         if(bit_is_clear(PIND, 1))
         {
             p-=10;
             if(p < 0)
          
           p=0;
    
             OCR0=p; 
             loop_until_bit_is_set(PIND, 1);
         }
      }
    }
    


    Gdy próbowałem wgrać w/w program - nie działa. Procesor to ATMega32, przy czym częstotliwość jest ustawiona na 4MHz, a pierwsza linijka zakomentowana.
REKLAMA