Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Sterowanie fazowe, PWM, całka i BASCOM

MES Mariusz 01 May 2008 13:42 24017 67
  • #1
    MES Mariusz
    Level 36  
    Witam!

    W numerze 10/98 Praktycznego Elektronika ładnie opisane jest sterowanie fazowe, coś w rodzaju PWM dla przemiennego napięcia sieci 230V (regulacja mocy), włącznie z podaniem całki linearyzującej regulację.

    Linearyzacja regulacji jest konieczna, ponieważ moc przekazywana do urządzenia zależna jest od pola ograniczonego sinusoidą. Dlatego np. w celu zapewnienia 64 kroków płynnej regulacji należy podzielić pole ograniczone sinusoidą na 64 równe części. Punkty odbite na osi X są oddalone od siebie w różnych odległościach, ale odpowiadają równym odstępom w liniowej regulacji mocy.

    Da takiej linearyzacji służy całka:

    Sterowanie fazowe, PWM, całka i BASCOM

    Ktoś ma pomysł, jak to zaimplementować w kodzie BASCOM Basica?
  • #2
    Bigfoot
    Level 25  
    Nie implementowac liczenia calki w programie tylko stablicowac te 64 kroki (chocby w Excelu) i do nich sie pozniej odwolywac w programie.

    BF
  • Helpful post
    #3
    And!
    Admin of Design group
    To jeden z lepszych pomysłów -> tablica.

    Całka sin od 0-180 czyli tak naprawdę po przedziale czasu wygląda tak:
    Sterowanie fazowe, PWM, całka i BASCOM

    Interesuje nas dyskretyzacja wartości całki do 64 poziomów liniowo czyli takie schodki:
    Sterowanie fazowe, PWM, całka i BASCOM

    Mamy w wyniku kolejne wartości kąta 0-180 przy których należy sterować aby uzyskać liniowe sterowanie mocy:

    
    1	13
    2	19
    3	24
    4	28
    5	31
    6	35
    7	38
    8	40
    9	43
    10	45
    11	48
    12	50
    13	52
    14	55
    15	57
    16	59
    17	61
    18	63
    19	65
    20	67
    21	69
    22	71
    23	72
    24	74
    25	76
    26	78
    27	80
    28	82
    29	83
    30	85
    31	87
    32	89
    33	91
    34	92
    35	94
    36	96
    37	98
    38	100
    39	101
    40	103
    41	105
    42	107
    43	109
    44	111
    45	113
    46	115
    47	117
    48	119
    49	121
    50	123
    51	125
    52	127
    53	130
    54	132
    55	135
    56	137
    57	140
    58	143
    59	146
    60	150
    61	154
    62	158
    63	164
    64	177
    


    Kąty 0d 0-180 zamieniamy na czas od 0-10ms po przejściu napięcia przez zero i mamy liniowe sterowanie.
  • #4
    MES Mariusz
    Level 36  
    Kawałek niezłej roboty :-) Ale skoro już tyle wkleiłeś, trzeba było też arkusze excela załączyć. Jak ktoś będzie chciał sobie 100 przedziałów zrobić, będzie jak znalazł :-)
  • #5
    And!
    Admin of Design group
    W arkuszach nie ma nic ciekawego, ale faktycznie może ułatwić to początkowe obliczenia.
    Także dobry pomysł arkusz umieszczam.
  • #7
    Bigfoot
    Level 25  
    Tak dla scislosci dla ciekawych swiata: calka z sinusa to po prostu minus cosinus :)

    BF
  • #8
    luap
    Level 12  
    Witam , każdą całkę można również obliczy korzystając z interpretacji geometrycznej całki, trzeba założyc sobie elementarny krok "delta (X) " (im mniejszy tym dokładnośc liczenia większa) i wartośc całki w danym przedziale jest równa sumie iloczynów f(x) razy delta (X).
  • #9
    Bigfoot
    Level 25  
    :arrow: luap - tak wlasnie zrobil kolega And!

    :arrow: And! - popelniles maly blad. Π wynosi 3.14159(...) a nie 3.1492 jak przyjales w tym arkuszu. Wprowadzi to co prawda tylko minimalne zmiany ale pisze o tym gwoli scislosci.

    BF
  • #10
    And!
    Admin of Design group
    Faktycznie wkradł się błąd, zmienia to nieco tablicę wyjściową:

    
    moc	°	ms po przejściu przez zero
    1	13	0,72
    2	19	1,06
    3	24	1,33
    4	28	1,56
    5	31	1,72
    6	35	1,94
    7	38	2,11
    8	40	2,22
    9	43	2,39
    10	46	2,56
    11	48	2,67
    12	50	2,78
    13	53	2,94
    14	55	3,06
    15	57	3,17
    16	59	3,28
    17	61	3,39
    18	63	3,5
    19	65	3,61
    20	67	3,72
    21	69	3,83
    22	71	3,94
    23	73	4,06
    24	74	4,11
    25	76	4,22
    26	78	4,33
    27	80	4,44
    28	82	4,56
    29	83	4,61
    30	85	4,72
    31	87	4,83
    32	89	4,94
    33	91	5,06
    34	92	5,11
    35	94	5,22
    36	96	5,33
    37	98	5,44
    38	100	5,56
    39	101	5,61
    40	103	5,72
    41	105	5,83
    42	107	5,94
    43	109	6,06
    44	111	6,17
    45	113	6,28
    46	115	6,39
    47	117	6,5
    48	119	6,61
    49	121	6,72
    50	123	6,83
    51	125	6,94
    52	127	7,06
    53	130	7,22
    54	132	7,33
    55	135	7,5
    56	137	7,61
    57	140	7,78
    58	143	7,94
    59	146	8,11
    60	149	8,28
    61	153	8,5
    62	158	8,78
    63	164	9,11
    64	173	9,61
    
  • #11
    mirekk36
    Level 42  
    And! -> możesz mi podpowiedzieć co źle robię?

    otóż zrobiłem deketor przejścia przez ZERO, działa bardzo ładnie, w Czasie przejscia przez Zero mam ładną szpileczkę w dół o szerokości nie więcej niż 1ms

    to oczywiście leci na INT0 w Atmega8

    w Int0 wyłączam triaka, i jak wiadomo trzeba odczekać jakiś czas aby go załączyć. Oczywiście załączyć go trzeba w przedziale czasowym pomiędzy 0 a 10ms mniej więcej i po to są te czasy, które podałeś po scałkowaniu od 0,72 do 9,61 jak rozumiem tak?

    a co to jest ta druga kolumna liczb ? do czego? jak to wykorzystać? czy to wartości jakie trzeba ładować do timera? a jeśli tak to do jakiego i zjakim preskalerem?

    bo pierwsza kolumna to ilość kroków
  • #12
    pixel7
    Level 22  
    mirekk36 wrote:


    a co to jest ta druga kolumna liczb ? do czego? jak to wykorzystać? czy to wartości jakie trzeba ładować do timera? a jeśli tak to do jakiego i zjakim preskalerem?

    bo pierwsza kolumna to ilość kroków


    Ściągnij sobie plik który załączyłem kilka postów wyżej.
    Jest to program który wszystko wylicza - podajesz liczbę kroków, kwarc jak również który timer używasz. Program wylicza gotową tablicę z wartościami dla timera.
    Jak wrócę do domu to załączę działający program do ściemniacza.

    Pozdrawiam.
  • #13
    mirekk36
    Level 42  
    pixel7 -> mam ten programik i próbowałem działać wg niego ale hmmm jakieś dziwolągi mi wychodzą.

    z tym, że muszę się przyznać, że teraz próbuję to zrobić w Bascomie. W sumie te operacje typu załadowanie wartości do timera, w jego przerwaniu włączenie triaka i wyłączenie timera nie powinny zajmować aż tyle czasu w Bascomie żeby takie proste sterowanie zrobić chyba?

    kiedyś zrobiłem sobie ściemniacz w asemblerze i nie było problemu (z tym, że nie używałem tablicy ze scałkowanymi wartościami a tak na oko). Ale ostatnio uczę się Bascoma i takie rzeczy jak ściemniacze w oparciu o detekcję zera też ludzie robią w Bascomie - więc powinno się dać to zrobić.

    ale z chęcią bym zobaczył twój programik jeśli będziesz łaskaw go wrzucić - obojętnie w czym napisany (byłbym wdzięczny) - może jednak ja jakiś błąd robię gdzieś i go nie widzę

    a to mój programik (tylko nie zabijcie mnie za Bascoma)

    $regfile = "m8def.dat"
    
    $crystal = 8000000
    
    Config Pinc.5 = Output                                      ' wyjście do sterowania diodą LED
    
    Config Pinc.4 = Output                                      ' wyjście do sterowania Triakiem
    Reset Portc.4
    
    Config Int0 = Falling                                       ' INT0 wyzwalane zboczem opadającym
    On Int0 Zero_cross
    
    Config Timer1 = Timer , Prescale = 64
    On Timer1 Tim1_isr
    
    
    Enable Int0
    Enable Interrupts
    
    
    Dim Level1 As Byte                                          ' zmienna przechowująca poziom jasności żarówki
    
    Led Alias Portc.5
    Tr1 Alias Portc.4                                           ' to jest mój Triak
    
    
    Dim K As Word                                               ' zmienna pomocnicza w przerwaniu INT0
    Set Led
    
    
    
    Do
    
          For Level1 = 0 To 63                                  ' pętla ROZJAŚNIAJĄCA
             Waitms 20
          Next Level1
    
          Reset Led
    
          For Level1 = 63 To 0 Step -1                          ' pętla ŚCIEMNIAJĄCA
             Waitms 20
          Next Level1
    
          Set Led
    
    LOOP
    
    
    
    '******************** Timer 0 interrupt service routine ****************
    Tim1_isr:
       Set Tr1
       Disable Timer1
    Return
    
    '************** External interrupt - Zero Cross *************
    Zero_cross:
    
       Reset Tr1                                                ' wył. Triaka w ZERO sieci 230V
    
       K = Lookup(level1 , Data1)                               ' pobranie z tablicy wartości Timera1
       Load Timer1 , K                                          ' załadowanie pobranej wartości do Timera1
       Enable Timer1                                            ' załączenie Timera1 
    
    Return
    '******************************************
    
    
    'tablica z programu "Podział Mocy"
    ' dla ustawień: kwarc 8MHz, 64 kroki, Timer1, Preskaler 64
    Data1:
    Data 1150% , 1109% , 1076% , 1049% , 1025% , 1002% , 982% , 962% , 944% , 927% , 910% , 894% , 878% , 863%
    Data 848% , 833% , 819% , 805% , 791% , 778% , 765% , 751% , 738% , 726% , 713% , 700% , 687% , 675%
    Data 662% , 650% , 637% , 625% , 613% , 600% , 588% , 575% , 563% , 550% , 537% , 524% , 512% , 499%
    Data 485% , 472% , 459% , 445% , 431% , 417% , 402% , 387% , 372% , 356% , 340% , 232% , 306% , 288%
    Data 268% , 248% , 225% , 201% , 174% , 141% , 100% , 1%
  • #14
    pixel7
    Level 22  
    Oto mój program (atinny2313, zegar 8 mHz). Dodatkowo obsługa pilota sony:

    
    Dim Moc As Word
    
    Dim Table As Word
    Dim Ready As Byte
    Dim Code As Word
    Dim Period As Word
    Dim Command As Long
    Dim Bitcount As Byte
    
    
    Config Timer0 = Timer , Prescale = 1024
    Config Timer1 = Timer , Prescale = 256 , Capture Edge = Rising , Compare A No_output = Disconnect
    Config Int0 = Rising
    Stop Timer0
    
    On Int0 zero
    On Timer0 Tim
    On Capture1 Capture1_int
    On Compare1a Compare1a_int
    
    
    Compare1a = 180
    
    Config Pind.2 = Input
    Set Portd.2
    
    Config Pind.4 = Output
    Set Portd.4
    
    Bramka Alias Portd.4
    
    Enable Interrupts                                           
    Enable Int0                                                 
    Enable Capture1
    Enable Compare1a
    Enable Timer0
    
    
    Do                                                          
    
    Loop                                                        
    End
    
    zero:
    
    Bramka = 0
    Table = Lookup(moc , Pwm_table)
    Load Timer0 , Table
    Start Timer0
    Return
    
    Tim:
       Bramka = 1
       Stop Timer0
    Return
    
    
    Compare1a_int:
    Ready = 1
     If Bitcount = 12 Then
     Shift Command , Right , 19
     Else
     Ready = 0
     End If
     Code = Command And &H0000007F
     Bitcount = 0
    Return
    
    Capture1_int:
     Timer1 = 0
     Period = Capture1
     If Period >= 200 Then
     Command = 0
     Bitcount = 0
     Else
     If Period > 45 Then
     Command = Command Or &H80000000
     End If
     Shift Command , Right
     Incr Bitcount
     End If
    Return
    
    
    Pwm_table:
    Data 68% , 64% , 61% , 58% , 55%
    Data 53% , 50% , 48% , 46% , 44% , 42% , 40% , 38% , 36% , 34%
    Data 32% , 30% , 28% , 25% , 23% , 20% , 18% , 14% , 10% , 0%
  • #15
    mirekk36
    Level 42  
    pixel7 -> bardzo ci dziękuję, mi w międzyczasie też udało się to w końcu odpalić w 64 krokach z udziałem Timera1. Ale fajnie zobaczyć jeszcze inne rozwiązanie. Teraz będę już spokojnie główkował jak zrobić dla kilku kanałowego ściemniacza ;)

    poza tym fajnie że wplotłeś w to obsługę pilota Sony

    - szkoda że nie mogę kliknąć ci "POMÓGŁ"
    ale mogę przekazać ci trochę punktów, bo do tej pory nikt nie umieścił takiego gotowego programu dimerka w Bascomie.

    pozdrawiam i wielkie dzięki - wszystko śmiga że aż miło
  • #16
    czopas
    Level 12  
    Witam.

    Chciałbym się dowiedzieć jakiego układu używacie do wykrywania przejścia przez zero ?
  • #19
    MES Mariusz
    Level 36  
    Można prościej. Jeśli urządzenie zasilane jest z sieci 230V za pomocą transformatora sieciowego, wówczas między mostkiem prostowniczym a kondensatorem filtrującym wystarczy wstawić diodę prostowniczą. Sygnał sprzed diody podać na bazę tranzystora, który będzie bramkował wyprowadzenie mikrokontrolera odpowiedzialne za detekcję przejścia przez zero. Proste, ale sprawdza się rewelacyjnie :-)
  • #20
    melon
    Level 26  
    Witam
    Chciałbym zapytać jak pogodzić obsługę czujnika temperatury DS 18b20 z pracą przerwania INT wyzwalanego impulsem przejścia przez zero.
    Jak wiadomo żeby DS wypluł z siebie temperaturę trzeba wstrzymać program na ok 700 ms.
    Przerwania są generowane co 10ms, dodatkowo przerwanie powoduje wyskoczenie z głównej pętli np w czasie wysyłania komend do czujnika temperatury przez co zostaje zaburzona komunikacja 1 wire.
    Chcę zbudować prosty termostat do pieca CO z płynną regulacją pracy dmuchawy.
    Próby ze sterowaniem dmuchawy i odczytem DSa 18b20 wypadły pomyślnie lecz jako osobne programy, połączenie odczytu czujnika temp i sterownia dmuchawą powodują zakłócenia w pracy układu np znika odczytana temperatura oraz oscyloskop wykazuje przerwy w przebiegu na bramkę triaka.
    Wyłączenie przerwania INT na czas komunikacji 1 wire nie przynosi pożądanych efektów.
    Oto szkielet kodu o ktrórym mowa, oczywiście jest nie kompletny ale zawiera istotę działania programu

    
    $regfile = "M8def.dat"
    $crystal = 16000000
    
    Config Pinc.5 = Output
    Bramka Alias Portc.5
    
    Config Timer1 = Timer , Prescale = 8
    Config Int1 = Rising
    Stop Timer1
    On Timer1 Irq_timer1
    On Int1 Irq_int1                                       'przejście przez zero
    Enable Timer1
    Enable Int1
    
    do
      1wreset
      1wwrite &HCC
      1wwrite &H44
     
      waitms 700
    
      1wreset
      1wwrite &H55
      1wverify Dsid1(1)                                         
      1wwrite &HBE
      Tds2 = 1wread(2)
      Tds2 = Tds2 / 16
      locate 1,1:lcd "temperatura= ";tds2
     
    loop
    
    Irq_timer1:
     Bramka = 1
     Stop Timer1
    Return
    
    Irq_int1:
      Bramka = 0
      Table = Lookup(moc , Tablica_pwm)
      Load Timer1 , Table
      Start Timer1
    Return
    
    Tablica_pwm:
    Data 0%
    Data 10705% , 9940% , 9335% , 8810% , 8333% , 7887% , 7462% , 7051% , 6649% , 6250%
    Data 5851% , 5449% , 5038% , 4613% , 4167% , 3690% , 3165% , 2560% , 1795% , 100%
    
  • #21
    crazy_phisic
    VIP Meritorious for electroda.pl
    :arrow: melon, najwyższy czas porzucić polecenia "wait" i zaprzyjaźnić się z timerami. To tak zwana wędka - na rybę nie licz ;)
  • #22
    melon
    Level 26  
    Na gotowca nie liczę ale może jakaś wskazówka? :)
    Dodam ze poniższy programik działa bezbłędnie,schody zaczynają się po dodaniu do pętli głównej obsługi DS 18b20
    Nie wiem czy w bascomie da się pogodzić działanie tego czujnika temperatury z przerwaniami co 10ms

    
    $crystal = 16000000
    $regfile = "m8def.dat"
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
    Config Lcd = 24 * 2
    Cursor Off : Cls
    
    
    Config Pinc.5 = Output
    Bramka Alias Portc.5
    
    
    Dim Moc As Word
    Dim Table As Word
    Dim Procent As Byte
    
    
    Config Timer1 = Timer , Prescale = 8
    Config Int1 = Rising                                        'rising wyzwala zbocze narastające
    
    Stop Timer1
    On Timer1 Irq_timer1
    On Int1 Zero                                                'detekcja przejścia przez 0 
    Enable Timer1
    Enable Int1
    Enable Interrupts
    Moc = 10                                                    'zacznij od 50% mocy
    
    Do
    Waitms 100                                                  'opóźnienie dla przycisków
    
    If Pind.7 = 0 Then                                          'przycisk +moc
     Incr Moc
     If Moc = 21 Then
     Moc = 20
     End If
    End If
    
    If Pind.6 = 0 Then                                          'przycisk -moc
     Decr Moc
     If Moc = -1 Then
     Moc = 0
     End If
    End If
    
    Procent = Moc * 5                                           '20 kroków skok co 5%
    Locate 1 , 1 : Lcd Procent ; "% mocy "
    
    Loop
    
    
    Irq_timer1:
     Bramka = 1
     Stop Timer1
    Return
    
    Zero:
     Bramka = 0
     Table = Lookup(moc , Tablica)
     Load Timer1 , Table
    
     Start Timer1
    Return
    
    Tablica:
    Data 0%
    Data 17129% , 15903% , 14936% , 14097% , 13333% , 12620% , 11940% , 11282% , 10638% , 10000%
    Data 9362% , 8718% , 8060% , 7380% , 6667% , 5903% , 5064% , 4097% , 2871% , 100%
    
  • #23
    fliper_katrill
    Level 20  
    Witam serdecznie!
    Szukam właśnie takiego rozwiązania problemu więc pozwolę sobie odgrzebać ciut temat. Czy mogę prosić od kolegów schemacik elektryczny dla którego powstały programy w bascomie?
  • #24
    mirekk36
    Level 42  
    w tym temacie masz schemat detekcji przejścia przez ZERO jaki ja zwykle wykorzystywałem robiąc takie rzeczy kiedyś w Bascomie

    https://www.elektroda.pl/rtvforum/topic1227390.html

    pierwszy post
  • #25
    fliper_katrill
    Level 20  
    a czy z listingu coś zostało ? :)
  • #26
    User removed account
    Level 1  
  • #27
    slawo1
    Level 14  
    Podlacze sie pod temat ze swoim układem ktory współpracuje z zamieszczonym powyżej kodem na Atmega8.
    Jakoś to chodzi a mianowicie poczatek zaświecenia (min) żarówki tj 60% poniżej nie świeci (max) jest 85% powyżej gaśnie. Zapalenie triaka na włącz wyłącz nie jest na maxa. Zamieściłem poniżej schemat i wykresy. Może ktos poradzi czego to tak marnie chodzi.
    Sterowanie fazowe, PWM, całka i BASCOM
    Schemat
    Sterowanie fazowe, PWM, całka i BASCOM
    Wykres1
    Sterowanie fazowe, PWM, całka i BASCOM
    Wykres2
  • #28
    User removed account
    Level 1  
  • #29
    Tomasz.W
    Level 35  
    atom1477 wrote:
    Użyłeś MOC3041. Takie nie mogą być bo mają wyzwalanie z zerze napięcia sieci.
    A dlaczego to niby nie mogą. Gałąź z tym optotriakiem pracuje jako załącz<>wyłącz. A zastosowanie takiego rozwiązania zapewni zero zakłóceń przy wyłączaniu urządzenia.
    :arrow: slawo1
    Zaznacz na schemacie gdzie masz podłączone fazę a gdzie "N". Wbrew pozorom ma to dość istotne znaczenie dla poprawnej pracy optotriaka.
  • #30
    slawo1
    Level 14  
    MOC3041 celowo był użyty ponieważ chodzi o załączenie w zerze.
    Natomiast lini N nie ma ponieważ układ jest odseperowany, dwa bieguny fazowe są takie same.