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

[ATmega8] Problem ze sterowanie serwonapędem

davidpi 08 Mar 2010 14:46 1115 3
REKLAMA
  • #1 7800709
    davidpi
    Poziom 10  
    Witam.
    Poraz kolejny proszę o pomoc. Tak to już jest z początkującymi :D
    Napisałem program który ma w prosty sposób sterować serwonapędem.
    Oto on:
    #include "avr/io.h"
    int main()
    {
    DDRB=0xff;
    DDRC=0x00;
    PORTC=0xff;
    OCR1A=17600;
    ICR1=20000;
    TCCR1A|=(1<<COM1A1) | (1<<COM1A0) | (1<<WGM11);
    TCCR1B|=(1<<CS10) | (1<<WGM13) | (1<<WGM12);
    while (1)
    {
    if((bit_is_clear(PINC,PC2)) && (OCR1A < 19400)) OCR1A+=1;
    if((bit_is_clear(PINC,PC3)) && (OCR1A > 17600)) OCR1A-=1;
    }
    return 0;
    }

    Program ma po naciśnieciu jednego z przycisków obracać napędem w jedną stronę. Po naciśnieciu drugiego w drugą stronę.
    Przyciski są podpięte do portu C i po naciśnieciu zwierają dany pin do masy.
    Otoż wszystko jest oki poza jedną rzeczą.
    Po naciśnieciu przycisku napęd zaczyna się obrcać ale kiedy przycisk zostaje zwolniony napęd się nie zatrzymujetylko obrca się dalej.
    Tak jakby pierwszy warunek if'a był cały czas spełniony.
    Proszę o pomoc w czym tkwi błąd i jak go naprawić.
    Pozdrawiam

    Dodano po 40 [minuty]:

    Problem rozwiązałem dosyć łatwo.

    #include "avr/io.h"
    #include "util/delay.h"
    const unsigned int wait=100;
    int main()
    {
    DDRB=0xff;
    DDRC=0x00;
    PORTC=0xff;
    OCR1A=17600;
    ICR1=20000;
    TCCR1A|=(1<<COM1A1) | (1<<COM1A0) | (1<<WGM11);
    TCCR1B|=(1<<CS10) | (1<<WGM13) | (1<<WGM12);
    while (1)
    {
    if((bit_is_clear(PINC,PC2)) && (OCR1A < 19400)) { OCR1A+=1; _delay_us(wait); }
    if((bit_is_clear(PINC,PC3)) && (OCR1A > 17600)) { OCR1A-=1; _delay_us(wait); }
    }
    return 0;
    }


    Tzn. wstawiając opóźnienie po zainkrementowaniu OCR1A.
    Z prób wyszło mi że minimalne opóźnienie ktore rozwiązywało proble to ok 60 us.
    Jeżeli ktoś wie dlaczego tak się dzieje to poproszę o krotki komentarz.
  • REKLAMA
  • #2 7801287
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 7801574
    davidpi
    Poziom 10  
    Tak. To rozwiązałoby problem, lecz zamysł był troszke inny.
    Chodzi mi o to aby zwiększanie następowało cały czas dopuki trzymam przycisk. Lecz, tak jak mówisz, naciśnięcie nawet na chilę mogło powodować zwiększenie o dużą wartość. Dlatego dałem funkcje opóźniającą, aby szybkość zwiększania, przy wciśniętym przycisku zredukować do rozsądnej wartości.
  • #4 7802422
    Konto nie istnieje
    Poziom 1  
REKLAMA