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

[AT89C4051][C]Przekazywanie wartości do funkcji przerwania

Bruum 19 Lip 2009 00:37 1818 2
  • #1 6795510
    Bruum
    Poziom 23  
    Posty: 818
    Pomógł: 29
    Ocena: 54
    Witam! Natknąłem się w swojej przygodzie z programowaniem na następujący problem. Otóż jedną z funkcji wykonywanych przez procek ma być sterowanie fazowe obrotami dmuchawy. Udało się uzyskać za pomocą przerwań i timera zmienne opóźnienie w odpowiedzi na detekcję zera. Jako że wystarczy kilka stopni regulacji, zrobiłem to tak, że wartości bardziej znaczącego bajtu licznika przechowuję w tablicy, z której pobiera wartość zmienna globalna posługując się indeksem podsuwanym jej w zależności od potrzeby. W obsłudze przerwania wartością zmiennej jest przeładowywany TH0. Sprawdzanie stanu i pobieranie wartości z tablicy odbywa się co jakieś 2 sekundy. I tu powstaje pewne zjawisko-otóż synchronicznie z przebiegiem pętli w main-wspomniane 2 sek, występuje przeskok w czasie(fazie w stosunku do przejścia przez zero) impulsu do sterowania triaca. Ustąpiło to gdy zmiennej nadałem wartość na początku main i program generował jak potrzeba. Czy odczyt z tablicy tak coś zakłóca? Procedury obsługi przerwań są maksymalnie skrócone tak, żeby nie zakłóciły 1w do DS-ów 1820. Czekam na wszelkie sugestie o pomysły.
  • #2 6795741
    ZbeeGin
    Poziom 39  
    Posty: 4333
    Pomógł: 605
    Ocena: 467
    Trochę dziwnie robisz to sterowanie fazowe. Powinno się zrobić programowy licznik o stałym okresie 10ms resetowany sygnałem synchronizacji z siecią i zmienną porównującą stan licznika, która będzie określać jakie odcinki sinusoidy przepuszcza triak.

    Wygląda to tak:
    
    // ===========================================================
    // GENERATOR PWM DLA TRIAKA
    // wywoływana co 400us
    // ===========================================================
    ISR(TIMER0_COMPA_vect)
    {
      sei();                                      // przerwania inne dozwolone
      if(silnik==2) TRIAC_ON                      // silnik 100% zatem triaka włącz
      else 
      {  
        // sterowanie triaka co 400us = 25 kroków
        if(silnik==1)                             // silnik w trakcie regulacji więc
        {  
          if(licznik>0) licznik--;                // zmniejsz wartość licznika jeśli można
          if(licznik==regimpuls) TRIAC_ON;        // czy licznik zrównał się z wartością; włącz triaka
          if(licznik==0) TRIAC_OFF;               // czy licznik doszedł do końca; wyłącz triaka
        }
        else TRIAC_OFF;                           // silnik nie ma działać więc wyłącz
      }
    }
    
    // ===========================================================
    // SYNCHRO Z SIECIĄ PWM SILNIKA
    // ===========================================================
    ISR(PCINT0_vect)
    {  
      // sterowanie silnikiem jako odwrotny Fast PWM
      if(silnik==1)
      {
        licznik = 24;                             // przywróć stan licznika (piła)
        regimpuls = impuls;                       // przypisz opóźnienie impulsu
      }
    }

    Tu skorzystałem z AVR i jego przerwań, ale przerobienie tego będzie dość łatwe. Zmienna silnik określa trzy stany pracy silnika.
  • #3 6795882
    Bruum
    Poziom 23  
    Posty: 818
    Pomógł: 29
    Ocena: 54
    Witam i dzięki za odpowiedź! Moje podejście do sterowania triaka wynika z obawy o to, czy przerwania nie zakłucą komunikacji po 1wire, co nieraz było tu podnoszone, więc priorytetem jest skrócenie czasu obsługi przerwania. Zastanawia mnie, w którym fizycznie punkcie wykonywania programu tworzy sie opisane wcześniej zjawisko.
REKLAMA