multilanguage

niedziela, 30 czerwca 2013

Sterownik fazowy grupowy

Na zaliczenie jednego z przedmiotów musiałem stworzyć sterownik fazowy/grupowy.
Powstało takie urządzenie:
Niestety wymogiem była niezbyt lubiana przeze mnie ATMEGA8. 
Konstrukcja można rzec standardowa: sterowanie triakiem, LCD itp... ;)
Pokusiłem się o trochę nietypowe sterowanie klawiaturą oparte o drabinkę R2R. Wciśnięcie klawisza powoduje zmianę napięcia na wyprowadzeniu, która jest odczytywana przez przetwornik analogowo-cyfrowy. 
Całość miała być jak najprostsza, więc nie szalałem ze skomplikowanym menu itp. 
Sterowanie oparte jest na wykryciu przejścia przez zero i załączenie triaka z odpowiednim opóźnieniem. Prościzna, choć z racji braku kwarcu miałem lekkie problemy w miejscu przejścia przez zero (czasami triak sterowany był za długo i przepuszczało dodatkową połówkę sinusoidy)
Natomiast pokusiłem się o trochę nietypowy algorytm sterujący w jednym z trybów - sterowanie grupowym z "równomiernym ułożeniem" wypełnienia. Chodzi głównie o to żeby sterując np silnikiem poprzez sterowanie grupowe (tak wiem że są lepsze rozwiązania) mieć równomiernie rozłożone czasy załączenia (ładnie to widać na oscylogramach). Program standardowo oparłem na przerwaniach, także w pętli głównej "maluje" tylko po LCD, a reszta dzieje się sama w odpowiednim momencie - myślę, że gdyby nie takie podejście to nie udało by się niczym wysterować. Wewnętrzne oscylator atmegi nie jest tak stabilny jak przyzwyczaiły mnie układy microchipa.
Poniżej zamieściłem kod wykonywany w przerwaniu wyzwalanym wykryciem przejścia przez zero.
if(FnG==fazowe){//fazowe
  licz.time16=tab[a];//wartosci z tabeli
  TCNT1H = licz.time8.hight;//struktura do rozbicia liczby 16bit.
  TCNT1L = licz.time8.low;
  TIFR |= (1<<TOV1);
  TIMSK |= (1 << TOIE1);
 } else if(FnG==grupowe1) {//grupowe1
  g++;
  ustaw = a;
  if ((g==1)&&(ustaw!=0)){
   licz.time16=61164;//zalaczenie w zerze
   TCNT1H = licz.time8.hight;
   TCNT1L = licz.time8.low;
   TIFR |= (1<<TOV1);
   TIMSK |= (1 << TOIE1);
  } else if (g>ustaw*2){
   TRIAC_OFF; 
  }
  //zeruj po 80 przebiegach
  if (g==80) g=0; 
 } else {//grupowe2 
  g++; //zliczanie 
  ustaw = a;
  if (ustaw>=20) {
   ustaw=40-a;
  } else {
   ustaw=a;
  }

  if (ustaw==0){
   TRIACS_OFF;
  }else {
   if (g%2){ 
    p=40/(ustaw); //ustaw!=0 zapewnione war. wyżej
          if(((h/p)>d)&&(d<ustaw)){
              TRIACS_ON;
              d++;
          } else {
              TRIACS_OFF;
          }
          h++; 
   }
  } 
       if (TRIACS^(a>=20) ){
   licz.time16=61164;
   TCNT1H = licz.time8.hight;
   TCNT1L = licz.time8.low;
   TIFR |= (1<<TOV1);
   TIMSK |= (1 << TOIE1);
        } else {
   TRIAC_OFF;
  }
  //zeruj po 80 przebiegach
  if (g>80){
   g=0; 
   h=0;
   d=0;
  }
  
 }
auto generated by http://tohtml.com/
Płytka została wykonana samodzielnie jako jednostronna, jest bardzo duża i miałem kłopot z odpowiednim dogrzaniem tonera, aby został na płytce. Ostatnio staję się trochę leniwy i mam zamiar do następnych projektów zamawiać sobie gotowce, ale o tym później...

Kilka fotek, schemat, trochę zrzutów z oscyloskopu i filmik dla zainteresowanych:
 

under construction
Sterowanie fazowe:

Sterowanie grupowe
Sterowanie grupowe2 ;)

Uwaga, bo trochę buczy:

1 komentarz: