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

[BAS][M16][MSterowanie fazowe, Timer1 - prośba o konsultację przypadku

MES Mariusz 29 Maj 2012 17:16 2964 10
REKLAMA
  • #1 10946075
    MES Mariusz
    Poziom 36  
    Mikrokontroler ATMEGA16, oscylator wewnętrzny 8 MHz, wykorzystany timer1 (16 bit).
    Dzielę połówkę sinusoidy na 100 części. 10ms / 100 = 0,1 ms = 0,0001s.
    Odcinki czasu 0,1 ms generuje mi timer1

    Takt zegarowy t = 1 / 8000000 Hz = 0,125 ms

    Dla uzyskania 0,0001s muszę zliczyć 800 taktów ( 800 x 0,125 us = 100 us = 0,1 ms = 0,0001 s ). Aby licznik się przepełnił po wykonaniu 800 cykli maszynowych i wywołał przerwanie ustawiam wartość początkową licznika na 65536 - 800 = 64736.

    Od tej pory co 0,0001 s inkrementuje się zmienna Czas_zwloki$ (sto kroków na połówce sinusa). Jeśli w pewnej chwili okaże się, że Czas_zwloki$ przekroczy Wartosc_t1$ zostanie załączony triak.

    Gdy na int1 zostanie wykryte przejście przez zero zrobione na układzie zerocrosser triak zostanie wyłączony. Wyzerowana zostanie również zmienna Czas_zwloki$. I wszystko zacznie się od początku (triak zostanie włączony ponownie po przekroczeniu przez zmienną Czas_zwloki$ wartości odpowiedniej dla włączenia triaka.

    Poniżej gotowy kod.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    W teorii wszystko miodzio w praktyce już nie.





    Na filmie widać trzecią diodę od prawej (to jest właśnie D10), jej zachowanie (cały czas trzymany przycisk S10) i zachowanie podłączonej żarówki 230V.

    Poprawiłem tytuł - tagi.
    [zumek]
  • REKLAMA
  • Pomocny post
    #2 10946440
    sulfur
    Poziom 24  
    Na filmie nie widać nic konkretnego.
    Wydaje mnie się, że masz błędne założenie. Triak wyłączy się sam przy przejściu przez zero, pod warunkiem że na bramce nie ma napięcia. W detektorze zera masz dwa zbocza, jedno przed prawdziwym zerem, drugie za prawdziwym zerem.
    Aby włączyć triaka, wystarczy podać sygnał sterujący tylko na "chwilę". Później, jak już się załączy, aż do przejścia przez zero działa sam.
    Radzę zostawić sobie jakiś czas przed samym przejściem przez zero jako stałe minimum. Załączenie napięcia na czas mniejszy lub równy 100 us i tak Ci nic nie da. A masz duże szanse przestrzelić i znaleźć się już w następnym półokresie. W efekcie jeden półokres nie będzie świecił wcale. Drugi będzie świecił maksymalnie lub prawie maksymalnie.
    Zagadnienie wydaje się być proste, ale w rzeczywistości takie nie jest. Przekonało się o tym sporo osób, w tym nie dawno także ja.
    No i taka rada. Zrób to porządnie od początku do końca na timerze. Tą zmienną czas_zwloki sobie daruj.
  • REKLAMA
  • Pomocny post
    #3 10946485
    maly_elektronik
    Poziom 23  
    Lepszym rozwiązaniem byłoby zastosowanie przerwania od timera w skutek porównania a nie przepełnienia i non stop zmieniając wartość TCNT
  • REKLAMA
  • Pomocny post
    #4 10946695
    archanoid
    Poziom 26  
    Witam. Tak jak kolega zauważył powinieneś zrobić to z wykożystaniem funkcji CTC timera.
  • #5 10946950
    MES Mariusz
    Poziom 36  
    maly_elektronik napisał:
    Lepszym rozwiązaniem byłoby zastosowanie przerwania od timera w skutek porównania a nie przepełnienia i non stop zmieniając wartość TCNT

    Proszę o uzasadnienie, dlaczego byłoby to lepszym rozwiązaniem. Nie widzę niczego nadzwyczajnego w załadowaniu timera początkową wartością.

    Filmik pokazuje, że coś jest ewidentnie nie tak. Nie za bardzo mam pomysł, jak z tego miejsca ruszyć dalej. Przebieg 100 Hz na INT1 jest. To czy zdejmę napięcie z bramki triaka w zerze czy zaraz po włączeniu triaka (co wydaje się nieco trudniejsze, bo trzeba dodatkowo czekać i wyłączyć) nie powinno mieć żadnego znaczenia.

    Jakieś pomysły?
  • #6 10947268
    sulfur
    Poziom 24  
    Pomysłów jest, i to sporo, ale Ty wiesz lepiej. No trudno. Przyzwyczailiśmy się już.
    Nie znam bascoma, ale zrób tak. W przerwaniu od detektora przejścia przez zero odpal timer na określony czas. W obsłudze przerwania od timera zatrzymaj go, wyzeruj i ustaw wyjście w stan wysoki. Oczywiście ponownie musisz wyjście wyłączyć.
  • REKLAMA
  • #7 10947963
    archanoid
    Poziom 26  
    Witam. Ja to widzę troszkę inaczej. W przerwaniu INT1 najpierw wyłączasz triak potem zatrzymujesz TIMER1 , ładujesz nową wartość i strartujesz TIMER1. Jeśli korzystasz z trybu CTC to tylko modyfikujesz wartość w rejestrze OCR1A . Natomiast włączenie triaka następuje w przerwaniu w twoim przypadku po przepełnieniu a w CTC w przerwaniu porównania .
  • #8 10948001
    MES Mariusz
    Poziom 36  
    Dziękuję za podpowiedzi. Sprawdzę (po pracy) sugerowane rozwiązania. Na filmie żarówka większość czasu świeci, nie zmienia też swojej jasności. Dopiero w kilku ostatnich krokach (gdzieś ok. 96...100) żerówka zaczyna migać, i ostatecznie gaśnie. Problemem wydaje się być wyłączanie triaka. Z włączaniem jak widać nie ma problemu.
  • #9 10950081
    sulfur
    Poziom 24  
    Problem jest z wyłączeniem triaka, bo Ty go chcesz wyłączyć już za przejściem przez zero. A tak się nie da.
  • #10 10950333
    archanoid
    Poziom 26  
    Witam. Zapomniałem napisaś poprzednio . Przerwanie ma reagować na zbocze opadające i tak jak już napisałem pierwszą instrukcją w przerwaniu jest wyłączenie triaka. Sam stosowałem takie rozwiązanie i nie miałem najmniejszych problemów. Jednakrze stosowałem inny detektor zera (bardziej precyzyjny).
  • #11 10957517
    MES Mariusz
    Poziom 36  
    Już działa elegancko. Sprawdzone procedury:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Przede wszystkim brakowało Reset D10 na początku 00001s. Teraz co 0,0001s (w stu krokach na połówce sinusoidy następuje próba wyłączenia triaka (i tak wyłączy się dopiero w zerze).

    Wrzucam filmik





    i zamykam :-)
REKLAMA