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

Atmega16: Sterowanie pompą impulsową 0-1.3Hz, czas impulsu 20ms, Timer2 CTC

sebaseb24 28 Paź 2012 14:34 1407 5
REKLAMA
  • #1 11460239
    sebaseb24
    Poziom 11  
    Posty: 73
    Ocena: 10
    Witam szanownych kolegów,
    Mam mały problem z programem, potrzebuje sterować pompą impulsową, której zakres częstotliwości pracy to 0-1.3Hz i czas trwania impulsu 20ms.
    uC taktowany jest z f. 1MHz, próby zacząłem od użycia sprzętowego PWMa i trybu CTC. Chciałbym wykorzystać do tego timer 2, ale i tak przy maksymalnym preskalerze nie uzyskam tych częstotliwości chyba że zastosuje zewnętrzny kwarc, ale czy to ma sens, może jest jakiś inny sposób.
    Druga sprawa to czas wypełnienia impulsu, jak zrobić aby stan wysoki niezależnie od częstotliwości trwał 20ms.
  • REKLAMA
  • #2 11460725
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2206
    Dlaczego nie uzyskasz? Dla 16-bitowego timera i preskalera 1024 dla f=1MHz uzyskasz nawet minutę. Ja bym to zrobił tak, że ustawiłbym timer na zliczanie tego okresu 0-1,3 Hz, w przerwaniu zmieniłbym parametry pracy tak, żeby kolejne przerwanie wyszło po 20ms, wtedy ponowna zmiana i generowanie czasu do kolejnego impulsu. W przerwaniu programowa zmiana sterowanego pinu. Przy tak małej częstotlwości to praktycznie nie generuje żadnego obciążenia dla procesora.
  • REKLAMA
  • #3 11461177
    sebaseb24
    Poziom 11  
    Posty: 73
    Ocena: 10
    Miałem na myśli tryb CTC i licznik t2 a on z tego co wyczytałem jest 8 bitowy, dla częstotliwości 1Mhz przy preskalerze 1024 zgodnie ze wzorem z datasheet wychodzi fmin=1.9Hz. A co do proponowanego rozwiązania to ze zliczaniem okresu nie mam problemu tylko nie wiem jak zająć się czasem trwania tego impulsu.
  • REKLAMA
  • #4 11461436
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2206
    Napisz jaki to AVR będzie łatwiej dyskutować o bitowości licznika :)
    Jeśli nie masz problemu z okresem to jaki masz problem z czasem? W zależności od modelu AVR masz możliwość generowania programowo impulsu o zadanym czasie trwania przy pomocy rejestrów OCxR.
  • REKLAMA
  • #5 11461819
    sebaseb24
    Poziom 11  
    Posty: 73
    Ocena: 10
    AVRka to Atmega16.

    Poniżej napisałem próbny kod programu, którym narazie zmieniam stan diody z częstotliwością 0.6Hz, w jaki sposób zrealizować trwanie stanu wysokiego przez 20ms? Domyślam się że za bardzo skomplikowane to rozwiązanie nie będzie lecz proszę o pomoc.

    Kod: Text
    Zaloguj się, aby zobaczyć kod
  • #6 11506463
    sebaseb24
    Poziom 11  
    Posty: 73
    Ocena: 10
    Witam ponownie pomijając poprzedni problem pojawił się nowy. Potrzebuje używać przerwań od przepełnienia dwóch timerów T0 i T2. Po ich skonfigurowaniu i włączeniu pojawia kłopot gdyż żaden nie chce zliczać, jeżeli używam ich pojedynczo to wszystko jest ok.
    Poniżej wstawiam część programu z konfiguracją timerów.
    
    TIFR 	        |= (1 << TOV2)|(1 << TOV0); //zerowanie flag
    TIMSK 	|= (1 << TOIE2)|(1 << TOIE0); // aktywne przerwanie overflow 
    TCCR2 	|= (1<<CS21)|(1<<CS22);// preskaler 256
    TCCR0 	|= (1<<CS00)|(1<<CS01); //preskaler 
     //ustawienie wartości początkowej
    TCNT0 = 131;
    TCNT2 = 178;
    
    sei();
    
REKLAMA