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

Jak zrobić stabilizację obrotów silnika DC.

jacekk232 03 Mar 2010 19:29 4964 7
  • #1 03 Mar 2010 19:29
    jacekk232
    Poziom 16  

    Witam.

    Mam silnik prądu stałego (24V, 50W), który ma pracować z trzema prędkościami obrotowymi: 500, 1200, 2000 obr/min. No silniku zamontowany jest enkoder, który daje 60 impulsów na obrót. Enkoder podpięty jest do uC attiny2313. Na razie mam zrobiony pomiar prędkości obrotowej co 100ms i regulację obrotów silnika za pomocą PWM-a 10bit. I w tym miejscu utknąłem. Nie wiem jak te dwie rzeczy połączyć razem aby silnik utrzymywał w miarę stałe obroty niezależnie od obciążenia.
    W sieci dużo szukałem na ten temat i dowiedziałem się, że najlepiej by to zrobić na regulatorze PID. Niestety nie mam pojęcia jak takiego PID-a napisać w Bascomie? Czy ktoś mógł by mi w tym pomóc bo atomatyk ze mnie żaden.
    Pozdrawiam Jacek

    0 7
  • #2 03 Mar 2010 20:01
    czesiu
    Poziom 33  

    Ja też nigdy tego nie robiłem, ale może prościej zrobić to w analogu na kilku wzmacniaczach i nie angażować zbytnio procka. Schematy znajdziesz w sieci, dostroisz układ potencjometrami, nie będziesz musiał ciągle przeprogramowywać parametrów żeby uzyskać właściwą regulację.
    No chyba że myślisz o autotuningu, ale to już kolejna komplikacja.

    0
  • #3 03 Mar 2010 21:02
    1078231
    Użytkownik usunął konto  
  • #4 03 Mar 2010 22:26
    jacekk232
    Poziom 16  

    Pomiar prędkości obrotowej to akurat nie problem. Problemem jest dla mnie utrzymanie tej prędkości na zadanym poziomie niezależnie od obciążenia. Mikroprocesor chciałem zastosować tak z rozpędu gdyż od niedawna uczę się programować AVR-y, ale nic nie stoi na przeszkodzie aby zamiast procka zastosować jakiś inny układ np. na wzmacniaczach operacyjnych.
    Jak wspomniałem w pierwszym poście na wale silnika mam założony prosty enkoder, z którego impulsy można w prosty sposób zamienić na napięcie za pomocą np. LM2907.
    A co sądzicie o poniższym układzie?
    Jak zrobić stabilizację obrotów silnika DC.
    Z tego co wyczytałem LM317 w czasie normalnej pracy utrzymuje napięcie o wartości 1,25V między końcówkami Out a Adj. Czyli LM317 poda takie napięcie na silnik aby napięcie na końcówce Adj było mniejsze od napięcia na końcówce Out właśnie o te 1,25V. Jeśli obroty silnika spadną pod obciążeniem to napięcie na wejściu odwracającym WO również się zmniejszy co spowoduje wzrost napięcia na wyjściu WO i na końcówce Adj. A to spowoduje wzrost napięcia na końcówce Out przez co silnik zwiększy obroty. Czy ten układ ma szanse zadziałać? Bo wg mnie tak oczywiście przy odpowiednim doborze elementów.

    0
  • #5 04 Mar 2010 17:46
    macbe
    Poziom 15  

    jacekk232 napisał:

    Niestety nie mam pojęcia jak takiego PID-a napisać w Bascomie? Czy ktoś mógł by mi w tym pomóc bo atomatyk ze mnie żaden.

    Proszę bardzo:
    uj=uj-1+kp*(ej-ej-1)+kp*Tp/Ti*ej+kp*Td/Tp*(ej-2*ej-1+ej-2)

    uj, uj-1 - odpowiedzi regulatora (aktualna i poprzednia)
    ej, ej-1, ej-2 - odchyłki między wartością zadaną, a wartością aktualną (odchyłka aktualna, poprzednia, i jeszcze poprzednia :-))
    kp, Ti, Td - nastawy regulatora
    Tp - okres próbkowania

    Tyle teorii, w Bascomie pewnie da się bez problemu zrobić.

    Pozdrawiam

    0
  • #6 05 Mar 2010 03:39
    pluz
    Poziom 1  

    Do takiego rodzaju napędu z powodzeniem możesz zastosować regulator PI, jest prosty do implementacji w BASCOM-ie, bo wystarczy zrobić proste całkowanie na zasadzie
    y(t)=u(t)+u(t-1)
    następnie dodać do tego sygnał z członu proporcjonalnego i całość pomnożyć razy jakieś k.
    Wyjście regulatora powinno sterować PWM-em. Natomiast na wejście regulatora PI musisz podać sygnał różnicowy, czyli wartość zadana minus wartość z enkodera.
    Dobrze jest również ograniczyć całkowanie od góry i od dołu, wtedy układ jest stabilniejszy i szybciej osiąga wartość ustaloną.
    Proponuje jednak na początek pominąć całkowanie i zrobić sam regulator P, a potem bawić się z całkowaniem.
    Na sieci jest sporo opracowań na temat regulacji obrotów i prądu w napędach z silnikiem DC.
    I jeszcze, najlepsze efekty uzyskuje się przy zasilaniu mostkowym ale to wymaga ustawiania deadtime-ów dla tranzystorów i jest dość problemowe wg. mnie.

    Jak zrobić stabilizację obrotów silnika DC.

    0
  • #7 08 Maj 2010 23:48
    _ojeju_
    Poziom 9  

    Witam serdecznie.
    Chciałbym podobnie jak kolega jacekk232 napisać program (tylko że w C) do regulacji prędkości obrotowej z regulatorem typu pid, gdyby ktoś miał jakiś przykładowy program byłbym wdzięczny, z tym że odczyt prędkości obrotowej odbywa się u mnie co 1s.
    Gdyby ktoś posiadał jakieś algorytmy regulatora PI lub PD również będę wdzięczny.
    Z góry dziękuję

    -1
  • #8 13 Cze 2010 20:55
    jacekk232
    Poziom 16  

    Witam.

    Po dłuższej przerwie wracam do tematu stabilizatora. Zmagając się z regulatorem na wzmacniaczach operacyjnych postanowiłem jednak pójść w stronę regulatora na mikroprocesorze. W sieci znalazłem program PID-a w Bascomie na Atmege8, w którym wyłączyłem człon różniczkujący. Regulator działa średnio dobrze tzn. obroty wciąż oscylują wokół wartości zadanej. Parametry dobierałem metodą prób i błędów. W związku z tym mam kilka pytań:

    1. Wyjście regulatora to PWM 8bit. Czy lepsze byłoby zastosowanie PWM-a 10bit? Bo wydaje mi się, że PWM o większej liczbie "schodków" płynniej sterował by silnikiem.

    2. Pomiar obrotów dokonuję co 100ms. Przy maksymalnej prędkości silnika (3000 obr/min) procesor zlicza 300 impulsów w czasie 100ms. Skoro wyjście regulatora przyjmuje wartości 0...255 to czy wartości wejściowe (obroty zadane i zmierzone) mogą być dowolne czy powinny być odpowiednio wyskalowane aby mieściły się w przedziale 0...255?

    3. Impulsy z enkodera zlicza Timer0. Jednak nawet gdy silnik zasilany jest z osobnego źródła zasilania to wynik wciąż trochę "skacze". Zastanawiam się czy, podczas pracy regulatora, może to mieć wpływ na falowanie obrotów wokół wartości zadanej? Jeśli tak to jak to wyeliminować? Uśrednianie wyniku czy może inne rozwiązanie?
    Poniżej przedstawiam program regulatora PI:

    Code:

    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 32
    $swstack = 8
    $framesize = 24
    $baud = 19200


    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.7 , Rs = Portb.6

    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc

    Dim E As Integer
    Dim Esum As Integer
    Dim Eold As Integer
    Dim Kp As Integer , E_kp As Eram Integer
    Dim Ki As Integer , E_ki As Eram Integer
    Dim Kd As Integer , E_kd As Eram Integer
    Dim Ta As Integer
    Dim P As Integer
    Dim I As Integer
    Dim D As Integer
    Dim Cv As Integer
    Dim Gv As Single

    Dim Obroty As Integer
    Dim Obroty_zad As Single
    Dim Obroty_max As Integer , E_obroty_max As Eram Integer

    Dim Befehl As String * 9
    Dim Bcount As Integer
    Dim Ar(5) As String * 5
    Dim Tekst As String * 5 , Tekst2 As String * 5
    Dim Licz As Byte , Impulsy As Byte
    Dim Odczyt As Word , Pomoc As Integer

    Kp = E_kp
    Ki = E_ki
    Kd = E_kd
    Obroty_max = E_obroty_max
    Ta = 0.1

    E = 0
    Esum = 0
    Eold = 0

    Config Timer0 = Counter , Edge = Rising
    Enable Timer0
    On Timer0 Licz_imp

    Config Timer1 = Timer , Prescale = 256
    On Timer1 Pid
    Timer1 = 62419                               ' 65535 - (8000000/256/Ta)   Ta = 10




    Enable Timer1
    Enable Interrupts
    '62410
    Config Timer2 = Pwm , Compare Pwm = Clear Down , Pwm = On , Prescale = 1

    Cls
    Do
    Input "" , Befehl
    Bcount = Split(befehl , Ar(1) , "-")
       If Ar(1) = "kp" Then
          Kp = Val(ar(2))
          Print "Kp=" ; Kp
          E_kp = Kp
       End If
        If Ar(1) = "ki" Then
           Ki = Val(ar(2))
           Print "Ki=" ; Ki
           E_ki = Ki
       End If
        If Ar(1) = "kd" Then
           Kd = Val(ar(2) )
           Print "Kd=" ; Kd
           E_kd = Kd
       End If
        If Ar(1) = "max" Then
          Obroty_max = Val(ar(2))
          Print "Max=" ; Obroty_max
          E_obroty_max = Obroty_max
       End If
        If Ar(1) = "p" Then
            Print "Kp=" ; Kp ; "         " ; "P=" ; P
            Print "Ki=" ; Ki ; "         " ; "I=" ; I
            Print "Kd=" ; Kd ; "         " ; "D=" ; D
            Print "Esum=" ; Esum
            Print "PWM=" ; Ocr2
       End If
    Loop

    Licz_imp:
    Incr Impulsy
    Return


    Pid:                                         'przerwanie co 100ms
    Timer1 = 62410
    Pomoc = Impulsy                 'obliczanie obrotów rzeczywistych
    Impulsy = 0
    Pomoc = Pomoc * 256
    Pomoc = Pomoc + Timer0
    Timer0 = 0
    Obroty = Pomoc / 3
    Odczyt = Getadc(5)              'obliczanie obrotów zadanych
    Obroty_zad = 100 / 1024
    Obroty_zad = Obroty_zad * Odczyt

    E = Obroty_zad - Obroty                      'uchyb

    P = Kp * E                                   'człon proporcjonalny kp=3

    '******człon całkujący******
    Esum = Esum + E
    If Esum > 500 Then Esum = 500                'ograniczenie sumy uchybu
    If Esum < -500 Then Esum = -500              'aby nie rosło w nieskończoność
    I = Esum * Ki                                'ki=3

    'I = Ki * Ta
    'I = I * Esum

    If I > 600 Then I = 600                      'anti windup
    If I < -600 Then I = -600

    '******człon różniczkujący (nieaktywny)******
    'D = E - Eold
    'D = D / Ta
    'D = D * Kd

    Cv = P + I
    'Cv = Cv + D

    Gv = Obroty_max / 255                        '100/255
    Gv = Gv * Cv

    If Gv < 0 Then Gv = 0
    If Gv > 255 Then Gv = 255
    Ocr2 = Gv

    Eold = E

    Incr Licz
    If Licz = 5 Then
    Licz = 0
    Tekst = Fusing(obroty_zad , "#.##")
    'Tekst2 = Fusing(obroty , "#.##")
    Locate 1 , 1 : Lcd Obroty ; "  "
    Locate 1 , 10 : Lcd Gv ; "     "
    Locate 2 , 1 : Lcd Tekst ; "    "
    Locate 2 , 10 : Lcd E ; "    "
    End If
    Return

    Za wszelkie sugestie z góry dzięki.
    Pozdrawiam Jacek

    -1
  Szukaj w 5mln produktów