Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Sterowanie fazowe, PWM, całka i BASCOM

01 Maj 2008 13:42 23348 67
  • Poziom 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?
  • Poziom 25  
    Nie implementowac liczenia calki w programie tylko stablicowac te 64 kroki (chocby w Excelu) i do nich sie pozniej odwolywac w programie.

    BF
  • Pomocny post
    Admin grupy Projektowanie
    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:

    Code:

    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.
  • Poziom 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ł :-)
  • Admin grupy Projektowanie
    W arkuszach nie ma nic ciekawego, ale faktycznie może ułatwić to początkowe obliczenia.
    Także dobry pomysł arkusz umieszczam.
  • Poziom 25  
    Tak dla scislosci dla ciekawych swiata: calka z sinusa to po prostu minus cosinus :)

    BF
  • Poziom 11  
    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).
  • Poziom 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
  • Admin grupy Projektowanie
    Faktycznie wkradł się błąd, zmienia to nieco tablicę wyjściową:

    Code:

    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
  • Poziom 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
  • Poziom 22  
    mirekk36 napisał:


    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.
  • Poziom 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)

    Code:
    $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%
  • Poziom 22  
    Oto mój program (atinny2313, zegar 8 mHz). Dodatkowo obsługa pilota sony:

    Code:

    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%
  • Poziom 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
  • Poziom 11  
    Witam.

    Chciałbym się dowiedzieć jakiego układu używacie do wykrywania przejścia przez zero ?
  • Poziom 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 :-)
  • Poziom 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

    Code:

    $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%
  • VIP Zasłużony dla elektroda
    :arrow: melon, najwyższy czas porzucić polecenia "wait" i zaprzyjaźnić się z timerami. To tak zwana wędka - na rybę nie licz ;)
  • Poziom 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

    Code:

    $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%
  • Poziom 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?
  • Poziom 20  
    a czy z listingu coś zostało ? :)
  • Poziom 43  
    MES Mariusz napisał:
    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 :-)



    Nie do końca, bo transformator wprowadza przesunięcie fazowe. Działało będzie, ale będą problemy z uzyskaniem wypełnienia 100%.
  • Poziom 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
  • Poziom 35  
    atom1477 napisał:
    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.
  • Poziom 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.