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:
Sterowanie fazowe:
Sterowanie grupowe
Sterowanie grupowe2 ;)
Kilka fotek, schemat, trochę zrzutów z oscyloskopu i filmik dla zainteresowanych:
Sterowanie fazowe:
Sterowanie grupowe
Sterowanie grupowe2 ;)
Uwaga, bo trochę buczy:
:)
OdpowiedzUsuń