PID szabályozás

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
dopplersax
Újonc
Újonc
Hozzászólások: 13
Csatlakozott: 2009. augusztus 21. péntek, 6:00

PID szabályozás

Hozzászólás Szerző: dopplersax »

Sziasztok!
Egy PID szabályozót szeretnék építeni de nem tudom hogy jó úton járok-e?
Egy max31855 küldi a vezérlőnek az akt. hőmérsékletet aminek a végén egy J hőelem van.
A pwm kimeneten egy szilárdtest van az kapcsolja a fűtést.
A program most igy néz ki.

Kód: Egész kijelölése

$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600
Config Timer1 = Pwm , Pwm = 10 , Prescale = 1024 , Compare A Pwm = Clear Down
Config Portb.0 = Output
Config Portb.1 = Output
Config Spi = Soft , Din = Pinb.4 , Dout = Portb.3 , Ss = None , Clock = Portb.5
Config Portb.2 = Output
Config Portb.5 = Output
Config Pinb.4 = Input
Sck Alias Portb.5
Cs Alias Portb.2
So Alias Pinb.4
Cs = 1
Sck = 0
Dim Maxdata As Long
Dim Setpoint As Single
Dim Pv As Single
Dim Pvlast As Single
Dim Error As Single
Dim Lasterror As Single
Dim Outp As Single
Dim P As Single
Dim I As Single
Dim D As Single
Dim A2 As Word
Dim A3 As Single
Dim Pwm As Word
Dim Dinput As Single
Dim Lasti As Single
Setpoint = 100
Const Kp = 1.6
Const Ki = 1
Const Kd = 0.4
Enable Interrupts
Enable Timer1
Start Timer1


Do
Doit:
Cs = 0
Shiftin So , Sck , Maxdata , 0 , 32                         ', 2
Cs = 1
A2 = Highw(maxdata)
Shift A2 , Right , 4
Pv = A2
A3 = Setpoint * 0.8
If Pv => A3 Then Gosub Pid
If Pv < A3 Then Gosub Felez
Pwm1a = Pwm
Print "pwm" ; Outp
Print ; Pv
'Waitms 50
Loop
End


Pid:
Error = Setpoint - Pv
'-----------------p-------------
P = Kp * Error
'-----------------i-------------
I = Ki + Lasti
I = I * Error
'-----------------d--------------
Dinput = Error - Lasterror
D = Kd * 0.01
D = D * Dinput
'----------------pid-------------
Outp = P + I
Outp = Outp + D
If Outp < 0 Then Outp = 0
If Outp > 1000 Then Outp = 1000
Outp = Round(outp)
Pwm = Outp
Lasti = I
Lasterror = Error
Return

Felez:
Pwm = 500
Return
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: PID szabályozás

Hozzászólás Szerző: Robert »

Nekem jónak tűnik (olvasva)
De tipp: http://www.mcselec.com/index.php?option ... &Itemid=57
Avatar
dopplersax
Újonc
Újonc
Hozzászólások: 13
Csatlakozott: 2009. augusztus 21. péntek, 6:00

Re: PID szabályozás

Hozzászólás Szerző: dopplersax »

Köszönöm a linket már én is néztem.
Viszont nálam az a gond hogy a holtidő túl nagy.
Az integrálásom ezért pillanatok alatt az egekbe szökken.
Megpróbáltam az integ. részt így:
Error = Sp - Pv
Sum_error = Sum_error + Error
Iterm = Ki * Sum_error
Így már nem lessz olyan magas az integ viszont sp=pv után a rendszer nagyon túl fűt majd nagyon visszahül.(leng)
Hát idáig jutottam.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: PID szabályozás

Hozzászólás Szerző: Robert »

PID-ből mind a 3 tag kell?
Nálam P és D van, I nincs a kemencémnél... A lengés a hőtehetetlenség miatt van (beavatkozás 1 sec, tehetetlenségi holtidő: 20 sec :P )
Avatar
dopplersax
Újonc
Újonc
Hozzászólások: 13
Csatlakozott: 2009. augusztus 21. péntek, 6:00

Re: PID szabályozás

Hozzászólás Szerző: dopplersax »

Igen pid-et szeretnék megvalósítani.
Műanyagiparban dolgozom és melegcsatorna fűtésére szeretném használni.
Használok Gefran, Fotek szabályzókat de a saját lenne az igazi.
Ezért a cél a pid.
Hajnalban megfűtöm a műhelyben lévő vasamat egy fotek szab.-val és megnézem azzal hogy viselkedik.
Ha sikerült érdemi dolgokra rájönni jelentkezem.
Köszönöm a segítséget.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: PID szabályozás

Hozzászólás Szerző: Robert »

Jé, szakmabeli ! :)
Fröccsöntés vagy vákuumformázás?

Voltak érdekességek, amikor mértem mindenféle jellemzőket.... de ez messze van az elektronikától... Rég volt és tanulságos...
Avatar
dopplersax
Újonc
Újonc
Hozzászólások: 13
Csatlakozott: 2009. augusztus 21. péntek, 6:00

Re: PID szabályozás

Hozzászólás Szerző: dopplersax »

Ez csak fröccs 50-800t-ig. 47gép 51robot és én javítgatom őket.
Nincsenek véletlenek!
Avatar
dopplersax
Újonc
Újonc
Hozzászólások: 13
Csatlakozott: 2009. augusztus 21. péntek, 6:00

Re: PID szabályozás

Hozzászólás Szerző: dopplersax »

Aki korán kel aranyat lel!(vagy egy jobb programot?)
Robert ez már így szebben dolgozik.
Avatar
dopplersax
Újonc
Újonc
Hozzászólások: 13
Csatlakozott: 2009. augusztus 21. péntek, 6:00

Re: PID szabályozás

Hozzászólás Szerző: dopplersax »

Javitott prog.
Ez már egy kicsit jobb.

$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600
Config Timer1 = Pwm , Pwm = 10 , Prescale = 1024 , Compare A Pwm = Clear Down
Config Portb.0 = Output
Config Portb.1 = Output
Config Spi = Soft , Din = Pinb.4 , Dout = Portb.3 , Ss = None , Clock = Portb.5
Config Portb.2 = Output
Config Portb.5 = Output
Config Pinb.4 = Input
Sck Alias Portb.5
Cs Alias Portb.2
So Alias Pinb.4
Cs = 1
Sck = 0
Dim Maxdata As Long
Dim Setpoint As Single
Dim Pv As Single
Dim Last_pv As Single
Dim Error As Single
Dim Lasterror As Single
Dim Summer As Single
Dim Outp As Single
Dim P As Single
Dim I As Single
Dim D As Single
Dim A2 As Word
Dim A3 As Single
Dim Pwm As Word
Dim Time1 As Word
Const Outmax = 350
Const Outmin = 0
Dim Dinput As Single
Dim Last_i As Single
Setpoint = 70
Const Kp = 1
Const Ki = 0.5
Const Kd = 0.8
Enable Interrupts
Enable Timer1
Start Timer1
Time1 = 10


Do
Doit:
Cs = 0
Shiftin So , Sck , Maxdata , 0 , 32 ', 2
Cs = 1
A2 = Highw(maxdata)
Shift A2 , Right , 4
Pv = A2
Gosub Pid
Print ; Pv
Pwm1a = Pwm

Print "pwm" ; Outp
Waitms Time1
Loop
End


Pid:
Error = Setpoint - Pv
'-----------------p-------------
P = Kp * Error
'-----------------i-------------
I = Ki * Error
I = I + Last_i
If I < Outmin Then I = Outmin
If I > Outmax Then I = Outmax
If Pv = Setpoint Then I = 100
'-----------------d--------------
Dinput = Pv - Last_pv
D = Kd
D = D * Dinput
'----------------pid-------------
Outp = P + I
Outp = Outp - D
If Outp < Outmin Then Outp = Outmin
If Outp > Outmax Then Outp = Outmax
Pwm = Outp
Last_pv = Pv
Last_i = I
Return
Válasz küldése