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

ATmega8: Problem z opóźnieniem przy użyciu PWM w sterowaniu silnikiem robota

dr_aco 20 Lis 2005 11:50 1463 1
  • #1 2007810
    dr_aco
    Poziom 11  
    Posty: 9
    Hej!
    Potrzebuje napisac np. nastepujacy program dla robota:
    prawe kolo jedzie do przodu, po jakims czasie(na razie dowolnym) zatrzymuje się.
    Problem polega na tym, że nie działa opóźnienie. Moje testy wskazujna to, że procek nie wychodzi z pętli opóźniającej (wykonuje się wszystko do tej pętli).
    Należy zauważyć, że wszystko z osobna działa (opóźnienie w połączeniu z mryganiem LED, samo sterowanie silnikami) a problem pojawia się w momencie gdy używam naraz PWMów i opóźnienia.
    RATUNKU!!!
    Kod programu:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #define F_CPU 8000000UL
    #include <avr/delay.h>
    
    #include <avr/signal.h>
    
    #define MAX_SPEED 0x3ff
    #define STOP_SPEED 0x00
    #define kierunekL 6
    #define kierunekP 7
    
    
    void czekaj(unsigned long pt)
    {
    unsigned char tp1;
    for(;pt>0;pt--)
      {
        for(tp1=255;tp1!=0;tp1--);
      }
    }
    
    void PWM_Init(void)
    {
      TCCR1A = 0xa2;  //0xb2;  //0b10110010;
      TCCR1B = 0x1b;  //0b00011011;
      ICR1H = 0x03;   //0b00000011;
      ICR1L = 0xc0;   //0b11000000;
      OCR1A = 0x00;   //PRAWY DODATNI
      OCR1B = 0x00;   //LEWY DODATNI
      sbi(PORTB,kierunekL);//nie zmieniaj kierunku
      sbi(PORTB,kierunekP); 
      TIMSK |= (1 << TOIE1);
      sei();
    }
    
    void prawe_FWD(void)
    {
      OCR1A=MAX_SPEED;
      sbi(PORTB,kierunekP);
    }
    
    void prawe_STOP(void)
    {
      OCR1A=STOP_SPEED;
      sbi(PORTB,kierunekP);
    }
    
    int main(void)
    {
       DDRB=0xff;
       PWM_Init();
       while(1)
       {
         prawe_FWD();
         czekaj(1500);
         prawe_STOP();
         czekaj(1500);
       }
    }

    Po odpaleniu silnik po prostu jedzie do przodu. O co chodzi?!
  • #2 2008306
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    dr_aco napisał:

    ...
    RATUNKU!!!
    Kod programu:
    
    ...
    void PWM_Init(void)
    {
      TCCR1A = 0xa2;  //0xb2;  //0b10110010;
      TCCR1B = 0x1b;  //0b00011011;
      ICR1H = 0x03;   //0b00000011;
      ICR1L = 0xc0;   //0b11000000;
      OCR1A = 0x00;   //PRAWY DODATNI
      OCR1B = 0x00;   //LEWY DODATNI
      sbi(PORTB,kierunekL);//nie zmieniaj kierunku
      sbi(PORTB,kierunekP); 
    
     //Mistrzu !!! Gdzie masz procedurę dla tego przerwania ???
      TIMSK |= (1 << TOIE1);
    
      sei();
    }
    ...
    }

    Po odpaleniu silnik po prostu jedzie do przodu. O co chodzi?!

    No właśnie gdzie, no gdzie ??? ;)

    Piotrek

    PS
    Radzę zaprzyjaźnić się , z jakimś symulatorem - może AVRStudio ???
REKLAMA