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] jak liczyć impulsy PWM PD7?

binczyk 12 Cze 2011 16:06 1267 2
REKLAMA
  • #1 9603523
    binczyk
    Poziom 11  
    Mam mały problem z liczeniem impulsów pochodzących z TCCR2.
    Potrzebuje dokładnie 200 impulsów aby wał silnika krokowego obrócił się w prawo o jeden obrót. Jeden 360 stopni obrót wału silnika to 200 kroków po 1.8 stopnia każdy.
    Poniżej przedstawiam kod w języku C który napisałem do tej pory.
    Nie jestem jakimś orłem w programowaniu uP. Chciałbym państwa prosić o nakierowanie na rozwiązanie bądż też wskazanie linków które opisują podobne problemy.
    Ogólnie wszelka pomoc mile widziana
    Już szukałem sporo i z przykrością stwierdzam że chyba nie wiem jak szukać licznika na pwm pochodzącego z 7 nóżki portu D

    /* 
          Program do sterowania silnikami.
          Sterowanie dwoma silnikami z uzyciem ukladu L298 i l297
    
          uC AVR ATMEGA32 12MHz
    */
    
    #define F_CPU 12000000L
    #include <avr/io.h>
    #include <util/delay.h>
    
    
    /*** ZDEFINIOWANIE PORTÓW ***/
    
    /* Silnik oś Z */
    #define SET_IN0 PORTB    |= _BV(0)     /* PB0 ->  ENA	//1-załaczenie silnika */
    #define CLR_IN0 PORTB    &= ~_BV(0)						//0-wyłaczenie silnika
    #define SET_IN0_OUT DDRB |= _BV(0)
    
    
    #define SET_IN1 PORTB    |= _BV(1)     /* PB1 ->  DIR	//1-obroty w prawo */
    #define CLR_IN1 PORTB    &= ~_BV(1)						//0-obroty w lewo
    #define SET_IN1_OUT DDRB |= _BV(1)
    
    
    #define SET_IN3 PORTB    |= _BV(3)     /* PB3 ->  H/F	//1-sekwencja pólkroku */
    #define CLR_IN3 PORTB    &= ~_BV(3)						//0-sekwencja pełnego kroku
    #define SET_IN3_OUT DDRB |= _BV(3)
    
    
    /* Wyjścia sygnałów PWN */
    #define SET_CLKZ_OUT DDRD |= _BV(7)  /* PD7 (OC2) - sygnal PWM  -> CLK oś Z L298 */
    #define SET_CLKXY_OUT DDRD |= _BV(5)  /* PD5 (OC1A) - sygnal PWM  -> CLK  oś XY L298 */
    
    
    
    
    
    /*** FUNKCJE ***/
    
    
    /* Wstepne ustawienia */
    
    void ustawienia(void)
    {
    /* Ustawienie kierunku uzytych portow jako wyjscia */
        SET_IN0_OUT; 
        SET_IN1_OUT; 
        SET_IN3_OUT; 
        
    	SET_CLKZ_OUT;  
    
    
    /* Ustawienie tajmera do pracy w trybie PWM */
      
    
      
       
    	TCCR2 = 0xF4;   
    	OCR2 = 127;//wypełnienie 50%
    }
    
    
    
    /* Wstrzymuje program w petli na czas t setnych czesci sekundy */
    
    void delay_10ms(unsigned long t )
    {
       while(t)
       { 
         _delay_ms(10);
          --t;
       }
    }
    
    void obrotwprawo(void)
    //void obrotwprawo( int a,  int b)
    {
       
       SET_IN0; /* załączenie silnika */ 
       SET_IN1; /* obrót prawo */
       CLR_IN3; /* pełny krok */  
    }
    
    
    
    
    
    /***  PROGRAM  ****/
    
    int main(void)
    {
      ustawienia();
    
      //obrotwprawo(0,3);
      //delay_10ms(500);
    
      obrotwprawo();      /* jazda wprzod, pelna moc obu silnikow */
      //delay_10ms(500);              /* przez 5 sekund  */
    
    
    //SET_IN0;
    //delay_10ms(20);
     
    
    
      while(1){};         /* KONIEC PROGRAMU */
    }
    
    
    
    
  • REKLAMA
  • #2 9604884
    GSM
    Poziom 25  
    Witam,

    twój post jest napisany niechlujnie i niezrozumiale, mogę się tylko domyślać o co ci chodzi, zakładam, że chcesz uzyskać sygnał na nóżce PD7 do wysterowania sterownika silnika krokowego tak aby silnik obracał się z zadaną prędkością i o określony kąt - czy dobrze cie zrozumiałem?
    Jeśli tak jest o podstawowa aplikacja TIMER-a mikrokontrolera wykorzystująca tryb CTC.
    Przeczytaj dokładnie sekcję dotyczącą TIMER-ów w nocie katalogowej układu, jest tam dokładny opis.
    Proszę, nie tłumaczyć się niemożnością znalezienia potrzebnych zasobów w internecie, gdyż jest wiele w internecie poradników - nieskorzystanie z nich to zwykłe lenistwo, a nikt tu nie poda ci gotowca.

    Pozdrawiam,
    GSM
  • #3 9605005
    binczyk
    Poziom 11  
    Tak dokładnie o to mi chodzi.
    Nie wiem czy teraz to dobrze robię ale obecnie generuje sygnał PWM na 500 ms co daje mi około 10 obrotów wału silnika.
    następnie wyłączam PWM na 300 ms i tak w nieskończonej pętli.
    Silnik obraca się tak jak chciałem {10 obrotów przerwa} trochę to łopatologicznie zrobione ale działa.
    Wcześniej silnik się grzał teraz nawet się nie grzeje.
    Oczywiście w miarę rozwijania programu będę zamieszczał tutaj programy poczytam o tym CTC. Własnie o takie wskazówki mi chodziło. Po trafie programować w normalnym C ale uC to inna bajka. często nie wiadomo z jakiej strony ugryźć bynajmniej na początku.
    Nie proszę o gotowce. proszę o wskazówki i małą pomoc taką jak kolegi wyżej.
REKLAMA