f
Warning: Cannot modify header information - headers already sent by (output started at /home/anderian/ftp/www_forum/db/mysql4.php:1) in /home/anderian/ftp/www_forum/includes/sessions.php on line 548

Warning: Cannot modify header information - headers already sent by (output started at /home/anderian/ftp/www_forum/db/mysql4.php:1) in /home/anderian/ftp/www_forum/includes/sessions.php on line 549

Warning: Cannot modify header information - headers already sent by (output started at /home/anderian/ftp/www_forum/db/mysql4.php:1) in /home/anderian/ftp/www_forum/includes/page_header.php on line 343
And-Tech :: Zobacz temat - Regulator PID

Strona korzysta z plików cookie w celu realizacji usług zgodnie z Politykš prywatnoœci.

Możesz okreœlić warunki przechowywania lub dostępu do cookie w Twojej przeglšdarce lub konfiguracji usługi.

And-Tech Strona Główna And-Tech
Forum firmy And-Tech

FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  GrupyGrupy
RejestracjaRejestracja  ZalogujZaloguj  AlbumAlbum  DownloadDownload

Poprzedni temat «» Następny temat
Regulator PID
Autor Wiadomość
grzeniu 73 

Dołączył: 11 Mar 2012
Posty: 39
Skąd: Dania
Wysłany: Sob Wrz 28, 2013 7:49 pm   Regulator PID

Witam!
W przykładach z Bascom znalazłem algorytm regulatora PID.Problem w tym ,ze wogole nie mogę tego zrozumieć. Jeżeli to nie będzie problemem proszę mi wytłumaczyć zamiast ,których zmiennych mam podstawić swoje dane.Temperaturę aktualna ,nastawiona i wyjście ,które będzie załączało grzałkę ,czy wiatrak. Robie sterownik do akwarium i mam zastosowane sterowanie grupowe,ale takie coś bylo by dużo lepsze.
Kod:
$regfile = "m8535.dat"
' NOTICE FROM MCS : SP changed to SPX since SP is a reserved word register
' -----[ Program Description ]--------------------------------------------------
'
' This program implements an PID algorithm in BASCOM
'
' This File is partialy based on a program from ?????? and
' I do not intent to touch any of his rights !!!
' So for correct use of his copyrights please inform as marked below!
' ?????????
'
'
' -----[ Disclaimer ]-----------------------------------------------------------
'
' This example is offered on an "AS IS" basis, no warranty expressed or implied.
' The programers disclaim liability of any damages associated with the use of
' the hardware or software described herein. You use it on your own risk.
' I'm not able to provide any free support.
'
' Copyright (c) 2001 Mike Eitel all rights reserved
'
' -----[ Revision History ]-----------------------------------------------------
'
' 060529 - Version AVRPID Ver .95    Basic PID functionality   Mike Eitel
'
' -----[ Aliases ]--------------------------------------------------------------
$sim                                                        ' Helps testing in a simulation
' -----[ Constant ]-------------------------------------------------------------

' -----[ Variables ]------------------------------------------------------------
   Dim Auto_mode As Bit                                     ' Regulator on ?
   Dim Manual_value As Single                               ' Output if not regulating

   Dim Spx As Single                                        ' Setpoint
   Dim Pv As Single                                         ' Process Value
   Dim Cv As Single                                         ' PID output

   Dim First_execution As Byte                              ' First start recognition
   Dim Initial_error As Single                              ' Startup difference

   Dim A As Byte                                            ' Tmp for random
   Dim B As Single                                          ' Tmp for random


' -----[ Start of program ]-----------------------------------------------------
' -----[ Start of program ]-----------------------------------------------------
' -----[ Start of program ]-----------------------------------------------------

   Auto_mode = 1                                            ' Permanent running choosen
   First_execution = 0                                      ' Set permanent running algorithm
   Manual_value = 40                                        ' Output if not regulating = on
   Spx = 37                                                 ' Value to aim to

Cyclic:
' -----[ Start of endless running program ]-------------------------------------
   Waitms 50                                                ' PID must run deterministic
                                                  ' time slices
   Gosub Regulator                                          ' Call the PID allgorithm
   Gosub Object                                             ' Call the simulated outer loop
Goto Cyclic

   ' -----[ End of endless running program ]------------------------------------
   ' -----[ End of endless running program ]------------------------------------
   ' -----[ End of endless running program ]------------------------------------


   ' ---------------------------------------------------------------------------
   ' -----------------------------[ Subroutines ]-------------------------------
   ' ---------------------------------------------------------------------------
Object:
   ' -----[ Start of simulated regulation loop ]--------------------------------
    Pv = Pv + Cv                                            ' linear function used

    If Pv = Spx Then                                        ' When PV=SP then make a
       A = Rnd(100)                                         ' random SP jump
       Spx = 1 * A
    End If
Return

Regulator:
   ' -----[ Start of PID Regulator]---------------------------------------------
   ' -----[ Constant ]----------------------------------------------------------
   Const Kp = .85                                           ' Proportional factor
   Const Ki = .67                                           ' Integration factor
   Const Kd = .15                                           ' Derivation factor
   ' -----[ Variables ]---------------------------------------------------------
   'Dim Sp As Single                               ' Setpoint
   'Dim Pv As Single                               ' Process Value
   'Dim Cv As Single                               ' PID output
   '
   'Dim First_execution As Byte                    ' First start recognition
   'Dim Initial_error As Single                    ' Startup difference
   Dim Last_pv As Single                                    ' Last PV
   Dim Last_sp As Single                                    ' Last SP
   Dim Sum_error As Single                                  ' Summed error value
   Dim D_pv As Single                                       ' Derrivated delta PV

   Dim Error As Single                                      ' Difference between SP and PV
   Dim Pterm As Single                                      ' Proportional calculated part
   Dim Iterm As Single                                      ' Integrated calculated part
   Dim Dterm As Single                                      ' Derivated calculated part
   ' -----[ Code ]--------------------------------------------------------------

   If Auto_mode = 1 Then
      ' -------- Regulating modus
      Error = Spx - Pv
      Sum_error = Sum_error + Error
      Iterm = Ki * Sum_error                                ' Integrated CV part

      ' -------- First time startup
      If First_execution < 2 Then
         If First_execution = 0 Then
            Sum_error = Manual_value / Ki
            First_execution = 1
            Initial_error = Error
         End If
         Pterm = 0
         Dterm = 0
         If Initial_error > 0 And Error < 0 Then
            First_execution = 2
            Last_pv = Pv
         End If
         If Initial_error < 0 And Error > 0 Then
            First_execution = 2
            Last_pv = Pv
         End If
         Last_sp = Spx

      ' -------- Normal calculation loop
      Else
         D_pv = Last_pv - Pv
         Last_pv = Pv
         Dterm = Kd * D_pv                                  ' Derivated CV part
         If Spx = Last_sp Then
            ' -------- Normal loop when setpoint not changed
            Pterm = Kp * Error                              ' Proportional CV part
            ' -------- Loop when setpoint changed
            Else
            Pterm = 0
            Dterm = 0
            If Spx > Last_sp And Pv > Spx Then
               Last_sp = Spx
               Last_pv = Pv
            End If
            If Spx < Last_sp And Pv < Spx Then
               Last_sp = Spx
               Last_pv = Pv
            End If
         End If                                             ' Enf of SP change seperation                                   '
      End If                                                ' Enf of first time running seperation                                  '

      Cv = Pterm + Iterm                                    ' Summing of the tree
      Cv = Cv + Dterm                                       ' calculated terms

   ' -------- Forced modus
   Else                                                     ' When running in non regulationg modus
      Cv = Manual_value                                     ' Set output to predefined value
      First_execution = 0                                   ' restart bumpless
   End If
Return
[/list]
 
     
Tadzik

Dołączył: 18 Lis 2014
Posty: 1
Wysłany: Wto Lis 18, 2014 6:43 pm   

Program regulacji PID oparty na kodzie AN #109 - PID Controller ze strony: http://www.mcselec.com/in...id=73&Itemid=57 oraz wzorowany na niektórych liniach kodu "Regulator PID Atmega8 + Bascom" Piotra Ludwikowskiego ze strony: http://www.elektroda.pl/rtvforum/topic1109345.html

zadana temeratura oraz współczynniki PID są na stałę (zmienne w kodzie) aby uprościć kod współczynniki PID należy dobrać indywidualnie.

Kod:
'Program regulacji PID oparty na kodzie AN #109 - PID Controller
' ze strony: http://www.mcselec.com/index.php?option=com_content&task=view&id=73&Itemid=57
' oraz wzorowany na niektórych liniach kodu "Regulator PID Atmega8 + Bascom" Piotra Ludwikowskiego
' ze strony: http://www.elektroda.pl/rtvforum/topic1109345.html
' zadana temeratura oraz współczynniki PID są na stałę (zmienne w kodzie) aby uprościć kod
' współczynniki PID należy dobrać indywidualnie.
'
'                                 Regulator PID
' =====================================================================================
' regulacja ogniwa Peltiera do utrzymania zadanej temperatury po stronie zimniej ogniwa
' podłączenie:
' PORTD.5                              -> 1 nózka IRF540N
' Czarny przewód ogniwa                -> 2 nózka IRF540N
' MASA Atmegi i masa zasilania ogniwa  -> 3 nózka IRF540N
' Czerwony przewód ogniwa + 5V (używam zasilacza AT i bez problemu działą
' na temperaturach do TZ=2.2 przy temperaturze otoczenia 22 stopnie i Dużym radiatorze z wentylatorem podpiętym do 5V!
' DS18B20 podpiętey do PORTC.0
'
' TadzikJ 16-11-2014 r.


$regfile = "m32def.dat"
$crystal = 16000000
Baud 19200
'-----------------------

  ' Konfiguracja wyświetlacza LCD
   Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
   Config Lcd = 16 * 2
   Cursor Off

   Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Disconnect , Prescale = 64

  ' 1Wire
   Config 1wire = Portc.0                                   ' Konfiguracja pinu 1Wire

 ' Zmienne dla odczytu DS18b20
   Dim Id_ds(8) As Byte                                     ' Tablica do przechowywania nr układu
   Dim I As Integer
   Dim Tab(9) As Byte
 ' koniec zmiennych do DS18B20

 ' Zmienne do regulatora
 ' -----[ Variables ]------------------------------------------------------------
   Dim Spx As Single                                        ' Setpoint
   Dim Pv As Single                                         ' Process Value
   Dim Cv As Single                                         ' PID output
   Dim First_execution As Byte                              ' First start recognition
   Dim Initial_error As Single                              ' Startup difference

  ' Pozostałe zmienne
   Dim Pwm As Word , Pwmp As Single
   Dim Tr As Single
   Dim Tz As Single
   '
   Id_ds(1) = 1wsearchfirst()                               ' Pobieramy nr pierwszego układu
   Id_ds(1) = 1wsearchnext()                                ' Pobieramy nr drugiego układu
   'Id_ds(1) = 1wsearchnext()                                ' Pobieramy nr drugiego układu
  ' Powyżcze jest dlatego, że używam 3 czujników podpiętych do portu, a do pomiaru ogniwa wykorzystuję 2 czujnik


  ' Temperatura zadana
  ' ############################################################################
   Tz = 19                                                  ' Temperatura zadana
  ' ############################################################################

  ' Główna pętla programu
   Do
    Gosub Pomiar
    Gosub Regulator
    Gosub Wyswietl
   Loop

End

  ' Odczytywanie temperatury z  DS18B20
  Pomiar:

   1wreset                                                  ' Inicjacja magistrali 1WIRE
   1wwrite &H55                                             ' Porównaj numer czujnika
   1wverify Id_ds(1)
   1wwrite &HBE                                             ' Żądanie odczytania temperatury
   Tab(1) = 1wread(9)                                       ' Odczytaj z magistrali 1WIRE do 1 elementu tablicy T
   1wreset                                                  ' Inicjacja magistrali 1WIRE
   1wwrite &HCC                                             ' Wybór układu (dla 1 sztuki pomijamy wysyłanie numeru)
   1wwrite &H44                                             ' Polecenie konwersji temperatury
   Waitms 750

   If Tab(9) = Crc8(tab(1) , 8) Then
    I = Makeint(tab(1) , Tab(2))
    Tr = I
    Tr = Tr / 16
   End If

  Return

  ' Regulator PID
  Regulator:
   ' -----[ Start of PID Regulator]---------------------------------------------
   ' -----[ Constant ]----------------------------------------------------------
   ' ############################################################################
   Const Kp = 20                                             '.87 Proportional factor (PROPORCJONALNY)
   Const Ki = .55                                           '.67 Integration factor (cAŁKUJĄCY)
   Const Kd = .15                                           '.15 Derivation factor (RÓŻNICZKUJĄCY)
   ' ############################################################################

   Dim Last_pv As Single                                    ' Last PV (OSTATNIE_PV)
   Dim Last_sp As Single                                    ' Last SP (OSTATNIE_SP)
   Dim Sum_error As Single                                  ' Summed error value
   Dim D_pv As Single                                       ' Derrivated delta PV

   Dim Error As Single                                      ' Difference between SP and PV (UCHYB)
   Dim Pterm As Single                                      ' Proportional calculated part (PROPORCJONALNY)
   Dim Iterm As Single                                      ' Integrated calculated part (cAŁKUJĄCY)
   Dim Dterm As Single

   '-------[ Nasze parametry ]--------------------------------------------------
   Spx = Tz                                                 ' Temperatura zadana
   Pv = Tr                                                  ' Temperatura rzeczywista - z czujnika DS18b20

                                         ' Derivated calculated part
   ' -----[ Code ]--------------------------------------------------------------
      ' -------- Regulating modus
      Error = Spx - Pv                                      ' Obliczanie uchybu
      Error = Error * -1                                    ' Inwersja uchybu
      Sum_error = Sum_error + Error                         ' Suma uchybów
      Iterm = Ki * Sum_error                                ' Integrated CV part (CAŁKUJĄCY)

      ' -------- First time startup
      If First_execution < 2 Then
         If First_execution = 0 Then
            Sum_error = 40 / Ki
            First_execution = 1
            Initial_error = Error
         End If
         Pterm = 0
         Dterm = 0
         If Initial_error > 0 And Error < 0 Then
            First_execution = 2
            Last_pv = Pv
         End If
         If Initial_error < 0 And Error > 0 Then
            First_execution = 2
            Last_pv = Pv
         End If
         Last_sp = Spx

      ' -------- Normal calculation loop
      Else
         D_pv = Last_pv - Pv
         Last_pv = Pv
         Dterm = Kd * D_pv                                  ' Derivated CV part
         If Spx = Last_sp Then
            ' -------- Normal loop when setpoint not changed
            Pterm = Kp * Error                              ' Proportional CV part
            ' -------- Loop when setpoint changed
            Else
            Pterm = 0
            Dterm = 0
            If Spx > Last_sp And Pv > Spx Then
               Last_sp = Spx
               Last_pv = Pv
            End If
            If Spx < Last_sp And Pv < Spx Then
               Last_sp = Spx
               Last_pv = Pv
            End If
         End If                                             ' Enf of SP change seperation                                   '
      End If                                                ' Enf of first time running seperation                                  '

      Cv = Pterm + Iterm                                    ' Summing of the tree
      Cv = Cv + Dterm                                       ' calculated terms
      ' --------End normal calculation loop

     ' Ograniczenie CV od 0 do 255. O - Ogniewo nie pracuje, 255 ogniwo na max`a
      If Cv > 255 Then
       Cv = 255
      End If

      If Cv < 0 Then
       Cv = 0
      End If
     ' Koniec ograniczenia

  Return

  ' Wyświetlanie danych na LCD
  Wyswietl:
   ' Przeliczenie PWM
    Pwm = Round(cv)
    Pwm1a = Pwm
    Pwmp = Pwm / 2.55
    Pwmp = Round(pwmp)

   ' Wyświeltenie danych na LCD
    Locate 1 , 1 : Lcd "Tr:" ; Tr
    Locate 1 , 8 : Lcd "   U:" ; Error
    Locate 2 , 1 : Lcd "Tz:" ; Tz
    Locate 2 , 8 : Lcd " PWM:" ; Pwmp
    Shiftcursor Left
    Shiftcursor Left
    Lcd "%  "

  Return


Pozdrawiam. Tadzik
 
     
grzeniu 73 

Dołączył: 11 Mar 2012
Posty: 39
Skąd: Dania
Wysłany: Sro Lis 26, 2014 7:15 pm   

OK! Dzieki. Będę musiał go potestowac.Długo mnie gryzł ten regulator.Ale teraz mam inny problem:)
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group