Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Wyjaśnienie zagadnień z PWM, detekcji zera

fliper_katrill 11 Sep 2009 23:27 8460 38
Tespol
  • #1
    fliper_katrill
    Level 20  
    Witam!
    Proszę szanownych kolegów z bogatszą wiedzą od mojej o wyjaśnienie kilku zagadnień:
    1. Dla jakich napięć stosujemy PWM? (stałe , zmienne, przemienne)
    2. Dlaczego na większości schematów przeze mnie tu przeglądanych sterowanie fazowe opiera na DODATKOWEJ detekcji przejścia przez zero (najczęściej na przerwaniu) skoro duża ilość optotriaków posiada takie detektory zaimplementowane?
    3. Czy jest możliwość uruchomienia sterowania PWM w układzie z optotriakiem z detekcją zera, triakiem, żarówek 230V?

    Na te pytania pewnie sam potrafię sobie odpowiedzieć, ale chcę się upewnić i mieć tu taką wiedzę czarną na białym, może odpowiedzi i innym rozwieją wszelkie wątpliwości :)
  • Tespol
  • #2
    fuutro
    Level 43  
    1. Dla stałych i ew zmiennych.
    2. Detekcja przejścia przez zero pozwala załączać układ w chwili, w której nie popłynie nagle prąd o znacznej wartości - świetnie się to spisuje dla obciążeń indukcyjnych i pojemnościowych.
    3. Czy się da? Pewnie tak ale to pewnie podlegało by tylko głupszym zadaniom szkolnym, normalnie odpowiedź brzmi: nie ma to sensu - lepiej wyprostować napięcie i dać tranzystor kluczujący dla tego PWM.
  • Tespol
  • #3
    fliper_katrill
    Level 20  
    No chodzi właśnie o to że płyteczka już istnieje , ba! całe urządzenie! no i jest i triak i optotriak z detekcją zera, chciałem z pomocą tego układu sterować jasnością żarówek a pozbyć się go z płytki zbytnio nie mogę no i nie chcę bo jest ochrona galwaniczna.
    Co do detekcji zdaję sobie sprawę jakie jest jej zastosowanie i wiem że użyte przeze mnie optotriaki MOC3041 takową posiadają, po co zatem stosować detekcję w mikrokontrolerze przy sterowaniu fazowym?
  • #4
    atom1477
    Level 43  
    1. W zasadzie dla wszystkich.
    2. Detekcja przez zero jest konieczna, bo to układ sterujący ma decydować kiedy triak ma się włączać a kiedy wyłączać.
    Zastosowanie optotriaka z detekcją zera poskutkuje tym, że nie da się włączyć triaka w momencie przejścia napięcia sieci przez zero. Bo procesor poda wtedy sygnał na optotriaka, ale oprotriak ma jakiś czas zadziałania a przez ten czas napięcie już minie zero i optotriak uzna że trzeba poczekać na kolejne przejście napięcia sieci przez zero.
    Można to ominąć załączając optotriak tuż przez przejściem napięcia sieci przez zero. Np. załączając 19,9ms po ostatnim zerze sieci, czuli 0,1ms przed kolejnym. Ja tak zrobiłem gdy mimo starań nie udało mi się kupić optotraków bez detektora zera.
    Teraz kupuję w TME/SEGURO/KAMAMI albo na allegro, ale kiedyś miałem problem z dostawami i wynikła taka sytuacja.
    3. Tak, ale trochę z tym zabawy. To już chyba lepiej jakiś Timer zaprządz do tego. Okres PWMa musiał by być zgodny z okresem sieci a to trudne. No chyba że skrócisz cykl PWMa. Dokładnie nigdy nie zsynchronizujesz więc musiał byś dać okres PWMa minimalnie mniejszy niż okres sieci i po każdym przejściu przez zero włączać PWM, ale tylko na jeden okres.
  • Helpful post
    #5
    fuutro
    Level 43  
    Żeby ten wiedział po jakim czasie ma podać sygnał sterujący. Możesz zmienić optotriaki na nieposiadające tego obwodu?
  • #6
    atom1477
    Level 43  
    A, w tym problem. No więc tak jak mówię, procesor też musi wiedzieć kiedy napięcie przechodzi przez zero. Bo sterowanie fazowe to nie jest takie zwykłe PWM. A dodatkowo zastosowanie optotriaka z detekcją zera tylko utrudnia nawet jak dasz dodatkowy detektor zera dla procesora.
  • #7
    fliper_katrill
    Level 20  
    Oczywiście, że mogę zamienić nawet kilka posiadam rozumiem że ominie to włączenie triaka w nieodpowiednim momencie, problem w tym jak tu poinformować uC żeby zaczął sobie zliczać, bo jak pisałem urządzenie jest niemal gotowe. A tak z ciekawości, to urządzenia sterujące jasnością żarówek 230V (napięcie zmienne) budowane są z wykorzystaniem PWM czy inną metodą? chodzi mi oczywiście o urządzenia mikroprocesorowe.
  • #8
    User removed account
    User removed account  
  • Helpful post
    #9
    atom1477
    Level 43  
    Możliwe że jest PWM. Ale mam na myśli wykorzystanie modułu PWM z wnętrza procesora. Bo z punktu widzenia sterowania fazowego PWM to będzie i tak, jak by tego nie zrobić (na Timerze, w programie głównym czy na czymś tam innym).
    Detekcję zera możesz zrobić z PC817+1N4148+100k+100k.
    Problem z tym że optotriak z detekcją zera nie ma tej detekcji wyprowadzonej Więc nie można jej podłączyć do procesora. Ona sobie jest i jest używana tylko w środku optotriaka, co akurat przy sterowaniu fazowym tylko utrudnia, no chyba że zrobisz tak jak napisałem z moim pierwszym poście.
  • #10
    fliper_katrill
    Level 20  
    z układem detekcji bym sobie poradził, chyba przeprojektuję płytkę,wymienić optotriaki wymienię, teraz poproszę o najważniejsze wskazówki co do programu, może któryś z kolegów robił coś podobnego w Bascomie?
  • #11
    atom1477
    Level 43  
    No tak. Właśnie sobie przypomniałem że u mnie to był sterownik grupowy :/
    Ale MOC3041 jednak działał, tylko trzeba było go wcześniej załączać żeby nie gubił przejścia przez zero.


    No nie wiem. Przy przerwaniu INT0 włączasz Timer0 żeby dawał przerwanie co 100us. I przy każdym przerwaniu zwiększasz jakąś zmienną „I”. I porównujesz ją z zadaną wartością PWM. Jak mniejsze to wystawiasz 1 na pin. Jak większe to 0. Przy „I” = 99 wyłączasz Timer.
    Pasowało by też reagować na obydwa przejścia przez zero. Czyli albo prostownik dwupołówkowy na wejściu PC817, albo dwa przerwania. INT0 na Falling a INT1 na Rising. I oba wektory obsługi przerwań ustawiasz w to samo miejsce.

    Dodano po 11 [minuty]:

    Albo jeszcze lepiej przerwanie AnyChange.
  • #12
    User removed account
    User removed account  
  • #13
    ZbeeGin
    Level 39  
    Kombinujecie jak koń pod górkę. Jakieś wyliczenia, przeładowywania sprzętowego licznika, jakieś PWMy...
    Code:
    ' Copyright by ZbeeGin
    

    $crystal = 8000000

    ' ===========================================================
    ' STEROWANIE TRIAKIEM

    Config Int0 = Change
    On Int0 _sync50hz

    Triak Alias Portd.6

    Licz = 49         
    Impuls = 0   
    Regimpuls = 0

    ' licznik timer0 - generator pily
    Ocr0 = 200
    Config Timer0 = Timer , Prescale = 8 , Clear Timer = 1
    On Oc0 _silnik_pila
    Enable Oc0

    '.....

    ' ===========================================================
    ' GENERATOR PIŁY DLA TRIAKA
    _silnik_pila:
      Enable Interrupts
      ' sterowanie triaka co 200us = 50 stopni
      If Motoron = 1 Then
        If Licz > 0 Then Decr Licz
        If Licz = Regimpuls Then Triak = 0 ' włącz triaka
        If Licz = 0 Then Triak = 1         ' wyłącz triaka
      Else
        Triak = 1
      End If
    Return
    ' ===========================================================
    ' SYNCHRO Z SIECIĄ
    _sync50hz:
      ' sterowanie silnikiem, odwrotna piła
      If Motoron = 1 Then
        Licz = 49                             
        Regimpuls = Impuls                     
      End If
    Return


    I jeszcze jedno - trzeba dobrać impuls max i impuls min by mieć pełen zakres regulacji. Większa ilość kroków (np. co 100us) wymaga szybszego taktowania i przeliczenia licznika TIMER0, gdyż trzeba uwzględnić prolog i epilog jaki dodaje BASCOM dla przerwań: wszystko na stos. Inaczej przerwania się nałożą i powypadają impulsy sterujące.
  • #14
    tmf
    Moderator of Microcontroller designs
    ad 2. Potrzebujesz detekcji zera w procesorze, zeby wiedziec z jakim opoznieniem wlaczyc triak. Problem z triakami polega na tym, ze da sie je tylko wlaczyc, nie da sie wylaczyc - wylaczenie nastepuje automatycznie, kiedy prad triaka bedzie nizszy niz wymagany do podtrzymania. Stad tez wynika, ze optotriaki z detekcja zera do sterowania jasnoscia zarowki absolutnie sie nie nadaja - bedziesz wlaczal zarowke na pelny polokres sinusoidy sieci, w efekcie nie uzyskasz regulacji jasnosci. Takie optotriaki nadaja sie wylacznie do sterowania grupowego.
    Sytuacja nieco lepiej wyglada w przypadku stosowania zamiast triaka tranzystora IGBT - taki tranzystor potrafi wylaczyc obciazenie w dowolnym momencie. Ale tu niewiele zyskasz - bo optotriak nie ma wyprowadzonej nozki gdzie masz sygnal zera, a, ze musisz sie synchronizowac z siecia (inaczej zarowka bedzie pulsowala) wiec i tak jakos detekcje musisz rozwiazac.
    Najprostszy uklad detekcji zera wg noty Atmela to po prostu dwa rezystory 1Mom, jeden pomiedzy faze a nozke procesora, drugi pomiedzy przewod N a mase procesora. Diody nie sa potrzebne, bo wykorzystuje to diody zabezpieczajace port, ktore juz sa w scalaku. Wada - masa procesora moze byc na potencjale fazy, potencjalnie niebezpieczne napiecia w calym ukladzie. Niemniej jesli uklad jest izolowany to jest to calkiem niezle rozwiazanie.
  • #15
    atom1477
    Level 43  
    tmf wrote:
    Stad tez wynika, ze optotriaki z detekcja zera do sterowania jasnoscia zarowki absolutnie sie nie nadaja - bedziesz wlaczal zarowke na pelny polokres sinusoidy sieci, w efekcie nie uzyskasz regulacji jasnosci. Takie optotriaki nadaja sie wylacznie do sterowania grupowego.

    Raczej nie. W takim przypadku nie da sie w ogóle włączyć triaka, bo oprotriak będzie czekał z włączaniem do następnego przejścia napięcia sieci przez zero. Ale z tego powodu takie oprotriaki oczywiście się nie nadają.
  • #16
    User removed account
    User removed account  
  • #17
    ZbeeGin
    Level 39  
    Widzisz. Mój kod pozwala jeszcze na dość swobodne wykonywanie się pogramu głównego. Zawuaż, że u Ciebie oba przerwania są dwa razy dłuższe niż okres co jaki zgłosi się przerwanie z porównania przy wartości 1 w OCR0. Wyjaśnienie znajdziesz wyżej. Twoje "okno czasowe" nie jest stałe, a tym większe, im większą wartość wpiszesz do Timer. I to jest podstawowa wada Twojego rozwiązania.

    A co się stanie przy wartości zero to proponuję już przeanalizować samemu.
  • #18
    User removed account
    User removed account  
  • #19
    ZbeeGin
    Level 39  
    Widać nie chce kolega przyjąć do wiadomości, że prolog i epilog przerwania w BASCOM-AVR jest bardziej rozbudowany. Dlatego przekładanie "żywcem" przerwań i ustwaień czasowych z języka C na nic się nie zda. Ten sposób sterowania w BASCOMie jest niestety wadliwy, a pisanie przerwania jako $ASM...$END ASM z klauzulą NO SAVE jest już wyższą szkołą jazdy.

    Po drugie przy wartości OCR = 156 i wartości TIMER = 155 masz tylko 64 takty zegara by obsłużyć przerwanie. Z czego 98% BASCOM skrzętnie wykorzysta na władowanie wszystkiego co można na stos i późniejsze tego zdjęcie. Ciało ISR-a jeszcze się wykona. Ale gdzieś w 2/3 zdejmowania rejestrów ze stosu licznik zgłosi następne przerwanie. Zatem z programu głównego wykona się tylko jedna instrukcja maszynowa. Jest to niestety zabójstwo pętli głównej.
  • #20
    User removed account
    User removed account  
  • #21
    zbynio-87
    Level 11  
    Witam szanownych kolegów.
    Napisałem program do pieca C.O. w Bascomie i mam problem ze sterowaniem silnika ac.
    Otóż muszę podzielić pełny zakres obrotów silnika AC na 5 podziałów(co 20%).
    Zasada jest taka, że do jednego warunku przypisany jest jedna prędkość (po spełnieniu go silnik uruchamia się).
    Próbowałem już na wiele sposobów i w żadnym wypadku nie umie uzyskać żądanej prędkości prócz obrotów znamionowych silnika.
    Mogę prosić o jakiś przykład rozwiązania tego konkretnego problemu?
    Pozdrawiam
  • #22
    ZbeeGin
    Level 39  
    Gotowiec masz wyżej. Trzeba tylko pozmieniać okres przerwań i dostosować ilość kroków.
    Problem może być w sprzęcie - brak synchronizacji z siecią przez brak układu lub jego wadliwe działanie.
  • #23
    zbynio-87
    Level 11  
    Niestety do tej pory żadnych efektów, silnik kręci się obrotami znamionowymi. A odnośnie układu do wykrywania przejścia napięcia przez zero to jest sprawny - tak pokazuje oscyloskop.
    Co można jeszcze zmienić w tym gotowcu powyżej?
  • #24
    ZbeeGin
    Level 39  
    Pytanie zasadnicze: jaki masz optotriak?
  • #27
    zbynio-87
    Level 11  
    Poniżej kod sterownika:

    $regfile = "m8535.DAT"
    $crystal = 8000000

    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.3 , Db6 = Portc.2 , Db7 = Portc.1 , E = Portc.5 , Rs = Portc.6
    Config Lcd = 20 * 2

    'Sterownik pieca C.O.
    'zależności:
    'Tp < Tn & Tp > 20st.C to zal. PK1
    'Tp > 20st.C to zał. PK2
    'Tb < Tp to zał. PK3
    'Tk > Tb o dT1 pompa kręci się z prędkością P1 (20%)
    'Tk > Tb o dT2 pompa kręci się z prędkością P2 (40%)
    'Tk > Tb o dT3 pompa kręci się z prędkością P3 (60%)
    'Tk > Tb o dT4 pompa kręci się z prędkością P4 (80%)
    'Tk > Tb o dT5 pompa kręci się z prędkością P5 (20%)

    Dim Motoron As Byte
    Dim Regimpuls As Byte
    Dim Impuls As Byte
    Dim Licz As Byte
    Dim Keyup As Bit
    Dim Keydown As Bit
    Dim Keybcks As Bit
    Dim Keyenter As Bit
    Dim Menu As Byte
    Dim Keys As Byte
    Dim X As Byte
    Dim D_t1 As Byte 'parametr dT1
    Dim D_t2 As Byte 'parametr dT2
    Dim D_t3 As Byte 'parametr dT3
    Dim D_t4 As Byte 'parametr dT4
    Dim D_t5 As Byte 'parametr dT5
    Dim E_d_t1 As Eram Byte
    Dim E_d_t2 As Eram Byte
    Dim E_d_t3 As Eram Byte
    Dim E_d_t4 As Eram Byte
    Dim E_d_t5 As Eram Byte
    Dim E_tn As Eram Integer
    Dim Temp As Byte
    Dim Tp As Integer , Ss As String * 6 'temp. pieca
    Dim Tk As Integer 'temp. kolektora
    Dim Tb As Integer 'temp. bojlera
    Dim Tn As Integer 'nastawa Tn
    Dim Dsic1(8) As Byte
    Dim Dsic2(8) As Byte
    Dim Dsic3(8) As Byte
    Dim Dsic4(8) As Byte
    Dim B As Byte
    Dim W As Byte
    Dim Tb_p_dt1 As Byte
    Dim Tk_m_dt1 As Byte
    Dim Tk_m_dt2 As Byte
    Dim Tk_m_dt3 As Byte
    Dim Tk_m_dt4 As Byte
    Dim Tk_m_dt5 As Byte
    Tb_p_dt1 = Tb + D_t1
    Tk_m_dt1 = Tk - D_t1
    Tk_m_dt2 = Tk - D_t2
    Tk_m_dt3 = Tk - D_t3
    Tk_m_dt4 = Tk - D_t4
    Tk_m_dt5 = Tk - D_t5
    Key_bcks Alias Pinb.0
    Key_up Alias Pinb.1
    Key_down Alias Pinb.2
    Key_enter Alias Pinb.3
    Pk1 Alias Porta.0 'klapka (PK1)
    Pk2 Alias Porta.1 'pompa - piec (PK2)
    Pk3 Alias Porta.2 'zawór (PK3)
    Tri1 Alias Porta.3 'pompa kolektorów (TRI1)
    Tri2 Alias Porta.4 'wolny triak TRI2
    Tri3 Alias Porta.5 'wolny triak TRI3
    Led_t1 Alias Portd.1
    Led_t2 Alias Portd.3
    Led_t3 Alias Portd.4
    Led_t4 Alias Portd.5
    Led_t5 Alias Portd.6
    Led_t6 Alias Portd.7

    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32 'znak stopnia Celsjusza

    Config 1wire = Portc.0 'czujniki temp. DS18B20
    Config Porta = Output 'PortA jako wyjścia
    Porta = 0 'stany początkowe - 0
    Config Portb = Input 'PortB jako wejścia
    Portb = 255 'stany początkowe - 1
    Config Portd = Output 'PortD jako wyjścia
    Portd = 0 'stany początkowe - 0

    'STEROWANIE TRIAKIEM

    Config Int0 = Rising
    On Int0 _sync50hz

    Licz = 49
    Impuls = 0
    Regimpuls = 0

    ' licznik timer0 - generator pily
    Ocr0 = 100
    Config Timer0 = Timer , Prescale = 8 , Clear Timer = 1
    On Oc0 _silnik_pila
    Enable Oc0
    Enable Interrupts

    Cursor Off
    Cls
    Lcd " STEROWNIK " ;
    Locate 2 , 6
    Lcd "USM - 100"
    Wait 1
    Cls
    Locate 1 , 3
    Lcd "Wersja programu:"
    Locate 2 , 8
    Lcd "1.001A"
    Wait 1
    Cls
    Locate 1 , 4
    Lcd "USM - 100 by"
    Lowerline
    Lcd "zbynio-87"
    Wait 1

    Cls
    'iloćć podpiętych czujnikow temperatury
    W = 1wirecount()
    Lcd "Ilosc czujnikow temp"
    Locate 2 , 9
    Lcd "-" ; W ; "-"
    Wait 1
    Cls
    Dsic1(1) = 1wsearchfirst()
    Dsic2(1) = 1wsearchnext()
    Dsic3(1) = 1wsearchnext()
    Dsic4(1) = 1wsearchnext()

    'odczyt ID czujników temperatury

    If Dsic1(8) = Crc8(dsic1(1) , 7) Then
    Locate 1 , 1
    Lcd "CRC OK Czujnik 1 ID"
    Wait 1
    Locate 1 , 1
    For B = 1 To 8
    Lcd Hex(dsic1(b))
    Next
    End If
    Wait 1

    If Dsic2(8) = Crc8(dsic2(1) , 7) Then
    Locate 2 , 1
    Lcd "CRC OK Czujnik 2 ID"
    Wait 1
    Locate 2 , 1
    For B = 1 To 8
    Lcd Hex(dsic2(b))
    Next
    End If
    Wait 1

    If Dsic3(8) = Crc8(dsic3(1) , 7) Then
    Locate 1 , 1
    Lcd "CRC OK Czujnik 3 ID"
    Wait 1
    Locate 1 , 1
    For B = 1 To 8
    Lcd Hex(dsic3(b))
    Next
    End If
    Wait 1

    If Dsic4(8) = Crc8(dsic4(1) , 7) Then
    Locate 2 , 1
    Lcd "CRC OK Czujnik 4 ID"
    Wait 1
    Locate 2 , 1
    For B = 1 To 8
    Lcd Hex(dsic4(b))
    Next
    End If
    Wait 1
    'koniec odczytu ID czujników temperatury

    D_t1 = E_d_t1 'Odczyt z pamięci Eeprom parametrów
    D_t2 = E_d_t2
    D_t3 = E_d_t3
    D_t4 = E_d_t4
    D_t5 = E_d_t5
    Tn = E_tn

    Cls

    'program główny
    Do

    If Key_enter = 0 Then
    Gosub Menuu
    End If

    Wait 1
    1wreset
    1wwrite &H55
    1wverify Dsic1(1)
    1wwrite &HBE
    Tp = 1wread(2)

    1wreset
    1wwrite &H55
    1wverify Dsic2(1)
    1wwrite &HBE
    Tb = 1wread(2)

    1wreset
    1wwrite &H55
    1wverify Dsic3(1)
    1wwrite &HBE
    Tk = 1wread(2)

    'konwersja temp dla wszystkich dsow
    1wreset
    1wwrite &HCC
    1wwrite &H44

    Tp = Tp * 10
    Tp = Tp / 16 'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
    Ss = Str(tp)
    Ss = Format(ss , " 0.0")
    Locate 1 , 1
    Lcd "Piec " ; Ss ; Chr(0) ;

    Tb = Tb * 10
    Tb = Tb / 16
    Ss = Str(tb)
    Ss = Format(ss , " 0.0")
    Locate 2 , 9
    Lcd "Boj " ; Ss ; Chr(0) ;

    Tk = Tk * 10
    Tk = Tk / 16
    Ss = Str(tk)
    Ss = Format(ss , " 0.0")
    Locate 1 , 11
    Lcd " Kol " ; Ss ; Chr(0) ;

    Locate 2 , 1
    Lcd "Nas " ; Tn ; Chr(0) ;

    If Tp < Tn And Tp > 200 Then
    Set Pk1
    Else
    Reset Pk1
    End If

    If Tp > 200 Then 'liczba 200 -> 20 st.C (st.C * 10 = liczba z DS18B20 lub DS1822 )
    Set Pk2
    Else
    Reset Pk2
    End If

    If Tb < Tp Then
    Set Pk3
    Else
    Reset Pk3
    End If

    'plus zależności pracy pompy kolektorów:
    'Tk > Tb o dT1 pompa kręci się z prędkością P1 (20%)
    'Tk > Tb o dT2 pompa kręci się z prędkością P2 (40%)
    'Tk > Tb o dT3 pompa kręci się z prędkością P3 (60%)
    'Tk > Tb o dT4 pompa kręci się z prędkością P4 (80%)
    'Tk > Tb o dT5 pompa kręci się z prędkością P5 (20%)

    Loop
    End

    Menuu:

    Do
    If Key_up = 0 Then 'wybranie nr menu 1-7 przyciskiem Up lub Down
    Incr Menu
    End If
    Waitms 100

    If Menu = 8 Then
    Menu = 1
    End If
    Cls
    Waitms 100

    If Key_down = 0 Then
    Decr Menu
    End If
    Waitms 100

    If Menu = 0 Then
    Menu = 7
    End If
    Cls
    Waitms 100

    Select Case Menu

    Case 1 : Lcd "Nastawa temp. T1: " ; D_t1 'Po wybraniu parametru do zmiany wciskamy Enter, również następuje zapis do pamięci EEprom
    If Key_enter = 0 Then
    Temp = D_t1
    Gosub Nastawa
    D_t1 = Temp
    E_d_t1 = D_t1
    End If

    Case 2 : Lcd "Nastawa temp. T2: " ; D_t2
    If Key_enter = 0 Then
    Temp = D_t2
    Gosub Nastawa
    D_t2 = Temp
    E_d_t2 = D_t2
    End If

    Case 3 : Lcd "Nastawa temp. T3: " ; D_t3
    If Key_enter = 0 Then
    Temp = D_t3
    Gosub Nastawa
    D_t3 = Temp
    E_d_t3 = D_t3
    End If

    Case 4 : Lcd "Nastawa temp. T4: " ; D_t4
    If Key_enter = 0 Then
    Temp = D_t4
    Gosub Nastawa
    D_t4 = Temp
    E_d_t4 = D_t4
    End If

    Case 5 : Lcd "Nastawa temp.T5: " ; D_t5
    If Key_enter = 0 Then
    Temp = D_t5
    Gosub Nastawa
    D_t5 = Temp
    E_d_t5 = D_t5
    End If

    Case 6 : Lcd "Nastawa Tn:" ; Tn
    If Key_enter = 0 Then
    Temp = Tn
    Gosub Nastawa
    Tn = Temp
    E_tn = Tn
    End If

    Case 7 : Lcd "Test wyjsc"
    Lowerline
    Lcd "sterownika"
    If Key_enter = 0 Then
    Gosub Test_wyj_ster
    End If

    End Select

    If Key_bcks = 0 Then 'jeżeli przycisk BCKS wciśnięty dłużej niż 400ms powrót do programu głównego
    Waitms 400
    If Key_bcks = 0 Then
    Return
    End If
    End If
    Wait 1
    Loop

    Nastawa:
    Do

    If Key_up = 0 Then
    Incr Temp
    Waitms 100
    End If

    If Key_down = 0 Then
    Decr Temp
    Waitms 100
    End If
    Cls
    Lcd Temp

    If Key_bcks = 0 Then 'jeżeli przycisk BCKS wciśnięty przez czas od 100ms - 399ms to powrót do Menu
    Return
    End If

    Waitms 100
    Loop

    Test_wyj_ster:
    'test wyjść sterownika
    Cls
    Lcd "Test wyjsc mocy"
    Wait 1
    Cls
    Lcd "Test PK1"
    Set Pk1
    Wait 1
    Reset Pk1
    Wait 1
    Cls
    Lcd "Test PK2"
    Set Pk2
    Wait 1
    Reset Pk2
    Wait 1
    Cls
    Lcd "Test PK3"
    Set Pk3
    Wait 1
    Reset Pk3
    Wait 1
    Cls
    Lcd "Test Triakow"
    Set Tri1
    Set Tri2
    Set Tri3
    Wait 1
    Reset Tri1
    Reset Tri2
    Reset Tri3
    Cls
    Lcd "Test diod"
    Portd = 255
    Wait 1
    Portd = 0
    Wait 2
    Cls
    Lcd "Koniec testu"
    Wait 1
    Return

    ' GENERATOR PIŁY DLA TRIAKA
    _silnik_pila:
    Enable Interrupts
    ' sterowanie triaka co 200us = 50 stopni
    If Motoron = 1 Then
    If Licz > 0 Then Decr Licz
    If Licz = Regimpuls Then Tri1 = 0 ' włącz triaka
    If Licz = 0 Then Tri1 = 1 ' wyłącz triaka
    Else
    Tri1 = 1
    End If
    Return
    ' ===========================================================
    ' SYNCHRO Z SIECIĄ
    _sync50hz:
    ' sterowanie silnikiem, odwrotna piła
    If Motoron = 1 Then
    Licz = 49
    Regimpuls = Impuls
    End If
    Return


    Detektor przejścia przez zero:
    Wyjaśnienie zagadnień z PWM, detekcji zera

    Wyjście mocy - Triak:
    Wyjaśnienie zagadnień z PWM, detekcji zera

    Pozdrawiam
  • #28
    ZbeeGin
    Level 39  
    1. Kod umieszczaj w znacznikach CODE.
    2. Gdzie masz gasika w układzie triaka?
    3. Uważasz, że detektor szczytowy to właściwy układ wykrywania zera?
  • #29
    zbynio-87
    Level 11  
    Przepraszam za ten kod, że go źle umieściłem.
    Odnośnie tego detektora to mam go od znajomego, któremu działał ten układ, tylko nie chce udostępnić mi części kodu sterującego triakiem.
    Wydaje mi się, że powinien działać poprawnie.
    Może jakaś podpowiedź?:)
  • #30
    ZbeeGin
    Level 39  
    Najważniejsza jest pozycja nr.2 Zatem gdzie ten gasik?