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

Tworzenie sterownika lutownicy oporowej z AVR ATMEGA8 - sterowanie grupowe

matipa 06 Maj 2022 13:20 1035 23
REKLAMA
  • #1 20008809
    matipa
    Poziom 17  
    Witam,

    Postanowiłem troszkę podłubać i zrobić swój sterownik do lutownicy oporowej nie zawierającej czujnika temperatury. Wykonałem układ detekcji zera sieci wedle schematu, układ wykonawczy z triakiem no i wziąłem się za programowanie mikroprocesora, którym w tym wypadku jest ATmega8. Do programowania użyłem środowiska eclipse z obsługą AVR.

    Udało mi się zrealizować sterowanie fazowe (z pomocą książki), myślę że jakbym miał do takiego efektu dojść wykorzystując tylko swoją wiedzę to byłoby ciężko. Wszystko działa tak jak powinno, jednak z racji tego że jest to lutownica to lepszym rozwiązaniem byłoby zastosowanie sterowania grupowego.

    Nie do końca mogę znaleźć jakieś porady odnośnie pisania programu, tak jak było to w przypadku sterowania fazowego. Wszędzie widnieje tylko informacja, że jest to prostsze niż w przypadku sterowania fazowego (w co nie wątpię).

    Ogólnie rozumiem całą zasadę działania i idee, jednak nie potrafię wprowadzić modyfikacji do programu, który już mam (ze sterowaniem fazowym).

    Czy jest tutaj jakiś "ogarniacz" programowania AVR? i mógłby pomóc?
    W załączniku dołączę w pełni działający program: sterowanie...fazowe.txt Download (1.59 kB) , który odpowiada za sterowanie fazowe. Podejrzewam że tak naprawdę wystarczy pobawić się ustawieniami prescalera i timerem... jednak tak jak mówiłem nie do końca wiem jak mogę to ugryźć.

    Byłbym wdzięczny za jakąkolwiek pomoc.
    Mateusz
  • REKLAMA
  • #3 20008900
    chudybyk
    Poziom 31  
    Przy sterowaniu grupowym nie musisz synchronizować sterowania z siecią 230VAC. Najlepiej zmienić triak/optotriak na włączany w zerze - wtedy całość będzie generowała mniejsze zakłócenia.
    A sterowanie grupowe polega na tym, że włącza się zasilanie na określoną liczbę okresów sieci (jeśli triak może działać w obu kierunkach, to na połowę okresu sieci) i po tej liczbie okresów wyłączamy - również na określoną liczbę okresów. Przyjmijmy np. że cały cykl zajmie 100 okresów, wtedy chcąc włączyć urządzenie na 25% mocy włączamy triaka na 25*20ms = 500ms (bo 20ms odpowiada okresowi 50Hz) a czas wyłączenia 75*20ms = 1500ms. Czyli co 2 sekundy załączmy na pół sekundy. Grzałki mają taką bezwładność cieplną, że sterowanie będzie płynne.
  • #4 20008912
    matipa
    Poziom 17  
    Dzięki za odpowiedzi!

    kindlar napisał:


    Od razu natrafiłem na tą stronę, przeczytałem już ją naprawdę sporą ilość razy, tak jak powiedziałem, rozumiem jak to działa w teorii jednak mam problem z przelaniem tej wiedzy na mój program.

    chudybyk napisał:
    Przy sterowaniu grupowym nie musisz synchronizować sterowania z siecią 230VAC. Najlepiej zmienić triak/optotriak na włączany w zerze - wtedy całość będzie generowała mniejsze zakłócenia.
    A sterowanie grupowe polega na tym, że włącza się zasilanie na określoną liczbę okresów sieci (jeśli triak może działać w obu kierunkach, to na połowę okresu sieci) i po tej liczbie okresów wyłączamy - również na określoną liczbę okresów. Przyjmijmy np. że cały cykl zajmie 100 okresów, wtedy chcąc włączyć urządzenie na 25% mocy włączamy triaka na 25*20ms = 500ms (bo 20ms odpowiada okresowi 50Hz) a czas wyłączenia 75*20ms = 1500ms. Czyli co 2 sekundy załączmy na pół sekundy. Grzałki mają taką bezwładność cieplną, że sterowanie będzie płynne.


    Tak jest, rozumiem jak to działa. Sterowanie fazowe działa bardzo dobrze, jednak chciałbym jeszcze w celu pomiarów i porównań stworzyć program, w którym tak jak w moim fazowym, będę miał możliwość wpisania np. 50% i osiągnę na wyjściu 50% mocy ale tym razem metodą grupową a nie fazową.


    Reasumując nie wiem jak napisać program od momentu otrzymania sygnału z układu detekcji zera sieci... otrzymuję i co? chcąc na wyjściu otrzymać 50% mocy program powinien przez np. 2s podawać nap. a przez kolejne 2s go nie podawać i tak w pętli, która powinna się znaleźć tutaj:

    ISR(INT0_vect) {


    Na początku pomyślałem o czymś takim:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    jednak zrobienie tego bez timera, korzystając z _delay raz że na pewno nie jest zbyt dobrym pomysłem a po drugie po prostu nie działa. Chciałem żeby po prostu triak był załączany na wartość czasu podaną przez użytkownika a później wyłączany na wartość czasu okres-czas podany przez użytkownika.
  • #5 20009153
    tmf
    VIP Zasłużony dla elektroda
    Przekombinowujesz. W przypadku sterowania grupowego, cykle są długie, w stosunku do okresu sieci. Jak ci pisano, np. dla 50 Hz, okres masz 20 ms, w sterowaniu grupowym regulujesz np. w okresie 1s, albo i dłużej. Czyli w trakcie jednego cyklu sterowania masz np. 50 lub więcej okresów sieci. To powoduje, że ich wykrywanie jest bez znaczenia - czy urządzenie włączysz na początku kolejnego okresu, czy w środku jest bez znaczenia, poza ew. zakłóceniami o których już wspominano.
    Stąd też nie robisz żadnej detekcji, po prostu sterujesz elementem wykonawczym on/off - możesz do tego celu użyć timera np. w trybie generowania PWM, przy czym częstotliwość PWM to w tym przypadku będzie 1 do ułamka Hz. Wtedy wypełnienie określa średni czas włączenia urządzenia.
    Jeśli do sterowania triakiem wykorzystasz optotriak z detekcją przejścia przez zero (dla kolby rezystancyjnej nie ma problemu) to automatycznie uzyskasz drugi cel - redukcję zakłóceń. I to tyle. Nie ma żadnych więcej kombinacji.
  • REKLAMA
  • #6 20009210
    matipa
    Poziom 17  
    No właśnie to chce osiągnąć, czyli sterowanie w okresie 4000ms.
    Do detekcji przejścia przez zero mam płytkę, którą zaprojektowałem w eaglu i wytrawiłem, po sprawdzeniu oscyloskopem daje ładne szpilki. To co jest praktyczne i fizyczne nie stanowi dla mnie problemu, jednak jak przyszło do programowania to się zaczęły troszkę schody. Nie ukrywam że potrzebuje tego sterowania grupowego w celu porównania do sterowania fazowego (do badań) i zależy mi na czasie, wiem że to jest banalny do napisania program ale niestety nawet tak banalny mnie przerasta. Korzystam z wewnętrznego timera i prescalera, w jaki sposób mogę osiągnąć takie sterowanie o którym powiedziałeś?
  • #7 20009412
    tmf
    VIP Zasłużony dla elektroda
    matipa napisał:
    No właśnie to chce osiągnąć, czyli sterowanie w okresie 4000ms.

    To ustaw timer w trybie PWM z okresem 4 s i po problemie.
    matipa napisał:
    Do detekcji przejścia przez zero mam płytkę, którą zaprojektowałem w eaglu i wytrawiłem, po sprawdzeniu oscyloskopem daje ładne szpilki.

    To ci jest niepotrzebne. Jak już ci pisano - po prostu użyj optotriaka z detekcją przejścia przez zero. Oczywiście możesz użyć bez i potem bawić się z zewnętrzną detekcją i obsługą programową, ale prościej użyć odpowiedniego optotriaka. Tym bardziej, że są te elementy o identycznym rozkładzie pinów, więc można sobie je wymieniać w zależności od potrzeb.
  • #8 20009502
    matipa
    Poziom 17  
    tmf napisał:
    matipa napisał:
    No właśnie to chce osiągnąć, czyli sterowanie w okresie 4000ms.

    To ustaw timer w trybie PWM z okresem 4 s i po problemie.
    matipa napisał:
    Do detekcji przejścia przez zero mam płytkę, którą zaprojektowałem w eaglu i wytrawiłem, po sprawdzeniu oscyloskopem daje ładne szpilki.

    To ci jest niepotrzebne. Jak już ci pisano - po prostu użyj optotriaka z detekcją przejścia przez zero. Oczywiście możesz użyć bez i potem bawić się z zewnętrzną detekcją i obsługą programową, ale prościej użyć odpowiedniego optotriaka. Tym bardziej, że są te elementy o identycznym rozkładzie pinów, więc można sobie je wymieniać w zależności od potrzeb.


    Jasne że tak pewnie byłoby lepiej, jednak gdybym użył optotriaka z wbudowaną detekcją przejścia przez zero nie dałbym rady zrealizować na tym samym układzie regulacji fazowej. Domyślnie w układzie wykonawczym miałem takiego optotriaka (MOC3041) jednak wymieniłem go na MOC3021 bez tej detekcji aby móc do tego wykorzystać zaprojektowany przeze mnie układ.

    Bardzo zależy mi żeby zrealizować to na dokładnie takim samym układzie czyli z zewnętrzną detekcją przejścia przez zero...

    Jest to dużo cięższe do zrealizowania?
  • #9 20009541
    tmf
    VIP Zasłużony dla elektroda
    Nie, po prostu pomijasz detekcję przejścia przez zero :)
    Albo inaczej - w przerwaniu przejścia przez zero olewasz przesunięcie fazowe, a liczysz po prostu okresy/półokresy. W efekcie np. na każe 100 zliczonych przejść ustawiasz włączenie triaka na zadaną liczbę detekcji - np. 50% to będzie 50 przejść przez zero z włączeniem triaka i kolejne 50 bez włączenia.
    Coś w tym stylu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Zmieniając zmienną wypełnienie uzyskasz pożądany efekt. W pełni hardwarowo uzyskasz to samo ustawiając timer w tryb PWM z wejściem zegarowym na pinie na który podajesz impulsy ze swojego detektora przejścia przez zero. W takim przypadku TOP licnzika określi ci okres sterowania grupowego, a rejestr COMP aktualne wypełnienie - czyli średnią moc.
  • REKLAMA
  • #10 20010627
    matipa
    Poziom 17  
    tmf napisał:
    Nie, po prostu pomijasz detekcję przejścia przez zero :)
    Albo inaczej - w przerwaniu przejścia przez zero olewasz przesunięcie fazowe, a liczysz po prostu okresy/półokresy. W efekcie np. na każe 100 zliczonych przejść ustawiasz włączenie triaka na zadaną liczbę detekcji - np. 50% to będzie 50 przejść przez zero z włączeniem triaka i kolejne 50 bez włączenia.
    Coś w tym stylu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Zmieniając zmienną wypełnienie uzyskasz pożądany efekt. W pełni hardwarowo uzyskasz to samo ustawiając timer w tryb PWM z wejściem zegarowym na pinie na który podajesz impulsy ze swojego detektora przejścia przez zero. W takim przypadku TOP licnzika określi ci okres sterowania grupowego, a rejestr COMP aktualne wypełnienie - czyli średnią moc.


    Aktualny kod programu do sterowania fazowego:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #11 20010963
    tmf
    VIP Zasłużony dla elektroda
    W kodzie obsługi INT0_vect wstaw kod pokazany w moim poprzednim poście. Timer zostaw na stałe wyłączony. I to wszystko. Będziesz miał regulację grupową w zakresie 100 okresów (lub innym jeśli zmienisz wartość w modulo. I to wszystko.
  • #12 20011009
    matipa
    Poziom 17  
    tmf napisał:
    W kodzie obsługi INT0_vect wstaw kod pokazany w moim poprzednim poście. Timer zostaw na stałe wyłączony. I to wszystko. Będziesz miał regulację grupową w zakresie 100 okresów (lub innym jeśli zmienisz wartość w modulo. I to wszystko.


    czy w takim wypadku, licznik nie będzie się zerował przy każdym przerwaniu pochodzącym z układu detekcji zera sieci?

    i druga sprawa, czy nie powinien on być jakoś resetowany by po osiągnięciu >100% resetować się do 0?
  • #13 20011054
    tmf
    VIP Zasłużony dla elektroda
    matipa napisał:
    zy w takim wypadku, licznik nie będzie się zerował przy każdym przerwaniu pochodzącym z układu detekcji zera sieci?

    Nie, zapoznaj się ze słowem kluczowym static i jego funkcją.
    matipa napisał:
    i druga sprawa, czy nie powinien on być jakoś resetowany by po osiągnięciu >100% resetować się do 0?

    W wyrażeniu jest modulo 100 (%100), więc zmienna się zeruje po osiągnięciu 100.
  • #14 20011108
    matipa
    Poziom 17  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Czyli tak by wyglądał finalny program.

    Pozostaje mi tylko jeszcze jedna kwestia, w jaki sposób mogę uzyskać okres równy 4s? powinienem się pobawić ustawieniami prescalera?
  • REKLAMA
  • #15 20011146
    gps79
    Poziom 35  
    matipa napisał:
    w jaki sposób mogę uzyskać okres równy 4s
    to zależy od taktowania mikrokontrolera. Jaki masz F_CPU?
  • #16 20011228
    matipa
    Poziom 17  
    gps79 napisał:
    matipa napisał:
    w jaki sposób mogę uzyskać okres równy 4s
    to zależy od taktowania mikrokontrolera. Jaki masz F_CPU?


    Taktowanie wewnętrznym zegarem, nie mam dołączonego rezystora kwarcowego.

    Częstotliwość mam ustawioną na "4000000"
  • Pomocny post
    #17 20011246
    gps79
    Poziom 35  
    Ach, Ty masz tutaj INT0 wyzwalane z zewnątrz w zerze sinusa sieci (100x /s), więc można z tego skorzystać. Zmień to:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #18 20011458
    tmf
    VIP Zasłużony dla elektroda
    gps79 napisał:
    static uint16_t licznik = 0;

    Tak przy okazji - zmiennych static nie trzeba inicjalizować zerem. To się zrobi z automatu.
  • #19 20012158
    matipa
    Poziom 17  
    gps79 napisał:
    Ach, Ty masz tutaj INT0 wyzwalane z zewnątrz w zerze sinusa sieci (100x /s), więc można z tego skorzystać. Zmień to:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Mam teraz możliwość sprawdzenia poprawności działania programu, i niestety ale na oscyloskopie totalna cisza, żaden sygnał nie jest podawany na wyjście...

    W przypadku sterowania grupowego wygląda to tak:
    Tworzenie sterownika lutownicy oporowej z AVR ATMEGA8 - sterowanie grupowe

    Gdy w przypadku sterowania fazowego tak:
    Tworzenie sterownika lutownicy oporowej z AVR ATMEGA8 - sterowanie grupowe

    Kod, na którym stanęło:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Ale bez modyfikacji okresu, czyli na obsłudze przerwania:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Również cisza.

    EDIT: Zauważyłem że po prostu przeliczanie się źle odbywa. dla wartości 0% leci praktycznie ciągły sygnał, zwiększając wartość sygnał na wyjściu ma mniejszą moc, czyli na odwrót niż to być powinno, regulacja odbywa się od wartości 0 do wartości 49, przy wartości 50 wzwyż już sygnału na wyjściu nie ma.

    Dodano po 56 [minuty]:

    Udało mi się znaleźć błędy, finalny kod programu sterowania grupowego przedstawia się następująco i działa prawidłowo:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #20 20012250
    gps79
    Poziom 35  
    Jak na razie, schematy każdy czytający ma w wyobraźni, bo tym rzeczywistym się nie pochwaliłeś. Pokazujesz też przebiegi z układu (którego nie znamy) zamiast z wejść i wyjść mikrokontrolera. Niestety ciężko coś w tej sytuacji doradzić.
  • #21 20012336
    dondu
    Moderator na urlopie...
    Skoro to finalna wersja:

    matipa napisał:
    ... finalny kod programu sterowania grupowego przedstawia się następująco i działa prawidłowo:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    to mam trzy pytania:

    1. Włączasz przerwania COMPARE MATCH, a gdzie jest funkcja obsługi tego przerwania?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    2. Jaki sens ma ciągłe ustawianie w pętli głównej zmiennej zmiennej moc skoro nigdzie indziej nie zmieniasz jej wartości?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    3. Jaki sens ma istnienie zmiennej moc, skoro ciągle nadajesz jej wartość zero i porównujesz tylko w tym miejscu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #22 20014370
    matipa
    Poziom 17  
    dondu napisał:
    Skoro to finalna wersja:

    matipa napisał:
    ... finalny kod programu sterowania grupowego przedstawia się następująco i działa prawidłowo:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    to mam trzy pytania:

    1. Włączasz przerwania COMPARE MATCH, a gdzie jest funkcja obsługi tego przerwania?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    2. Jaki sens ma ciągłe ustawianie w pętli głównej zmiennej zmiennej moc skoro nigdzie indziej nie zmieniasz jej wartości?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    3. Jaki sens ma istnienie zmiennej moc, skoro ciągle nadajesz jej wartość zero i porównujesz tylko w tym miejscu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Oczywiście masz rację, źle to ująłem. Miałem na myśli, że jest to wersja programu, która finalnie na wyjście przekazała to co od początku miałem w zamiarze, oczywiście dzięki pomocy forum. Zdaję sobie, że jeśli chodzi o optymalizację programu jest jeszcze parę zabiegów do wykonania, nie zostawię "syfu" i biorę się za uporządkowanie.

    Jeszcze raz bardzo dziękuję za pomoc.

    Dodano po 3 [minuty]:

    gps79 napisał:
    Jak na razie, schematy każdy czytający ma w wyobraźni, bo tym rzeczywistym się nie pochwaliłeś. Pokazujesz też przebiegi z układu (którego nie znamy) zamiast z wejść i wyjść mikrokontrolera. Niestety ciężko coś w tej sytuacji doradzić.


    Zamieszczę jeszcze taki poglądowy schemat połączenia, które mam zrealizowane aby zachować jakiś ład dla potomnych lub innych szukających pomocy.

    Tworzenie sterownika lutownicy oporowej z AVR ATMEGA8 - sterowanie grupowe
  • #23 20014465
    bratHanki
    Poziom 38  
    Jakie to szczęście, że mam stary pesel i takie problemy mnie ominęły. Jednak dawniej żyło się prościej.:D Aby sterować fazowo wystarczał w zupełności 555 a do sterowania grupowego ten sam 555 z ew. dłuższą stałą czasową , licznik 4017 i MOC załacząny w "0" zerze. Regulacja była co 10% jak ktoś miał 10 pozycyjny przełącznik. :lol:
  • #24 20014489
    matipa
    Poziom 17  
    Ja tutaj jak starczy mi czasu chciałbym spróbować "dorzucić" sterowanie przy pomocy enkodera oraz wyświetlacz 7-segmentowy, 3-cyfrowy, na którym będzie pojawiać się zadana przez użytkownika temperatura. To też pewnie nie jest dużo roboty jeśli się wie z czym to się je, ale z enkoderem styczności do tej pory nie miałem.

Podsumowanie tematu

Użytkownik stworzył sterownik do lutownicy oporowej z mikroprocesorem ATmega8, wykorzystując detekcję zera sieci i triak. Po zrealizowaniu sterowania fazowego, poszukuje pomocy w implementacji sterowania grupowego, które ma być bardziej efektywne. Forumowicze sugerują, aby skupić się na prostym włączeniu triaka na określoną liczbę okresów sieci, co pozwoli na płynne sterowanie mocą. Użytkownik ma trudności z przetłumaczeniem teorii na kod, ale otrzymuje wskazówki dotyczące użycia przerwań i timerów do realizacji zamierzonego efektu. W końcu, po wielu dyskusjach, użytkownik planuje dodać enkoder i wyświetlacz 7-segmentowy do swojego projektu.
Podsumowanie wygenerowane przez model językowy.
REKLAMA