KHIN CC PHN T KH NN
I) Phn bit cc loi cm bin: Cm bin quang: khi a bt c vt no che u cm bin th cm bin s ln mc 1. Cm bin in dung: khi a mt vt bt k li tht gn th cm bin s ln mc 1. Cm bin in cm : ch ln mc 1 khi a vt bng kim loi li gn. II) Cc v d chng trnh mu: 1)Th nghim 1C: Vit chng trnh iu khin xi lanh I,mi khi nhn SW2 xi lanh I y ra,sau 2 s th xi lanh t y vo Chng trnh LADDER:
SW2 00004 TIM1 1000 1000
1000
TIM1 #0020
1000 1001
Chng trnh danh sch lnh //Cho php t ng gi khi nhn SW2,cho xilanh I y ra,v dng khi timer 1 on LD 00004 OR 1000 AND NOT TIM 001 OUT 1000 //Khi ng Timer 1 khi xi lanh I bt u y ra LD 1000 TIM 001
1
#0020 //Thit lp 2 trng thi y ra v thu vo l ngc nhau LD NOT 1000 OUT 1001 2)Th nghim 1E: Vit chng trnh iu khin sao cho khi nhn SW2 ,th 2 xi lanh I v J lun phin y ra v vo vi chu k 4s,khi nhn SW3 th dng Chng trnh LADDER
00004
00005 1007
1007
1007
1000
1007 1001
1007
TIM1
TIM0
Chng trnh danh sch lnh //To ra 1 bin trung gian t gi (AUTO) khi nhn SW2 LD 00004 OR 1007 LD NOT 00005 OUT 1007
2
//Dng timer 0 c chu k 4s cho php xi lanh I v J y ra tun t nhau LD 1007 AND NOT TIM 000 OUT 1000 LD 1007 AND TIM 000 OUT 1002 //Thit lp ch y ra v thu vo ca xi lanh I ngc nhau LD 1000 AND 1007 OUT 1001 //To ra xung chu k 8s (ON 4s v OFF 4s) cho timer 0 LD 1007 AND NOT TIM 001 TIM 000 #0040 LD 1007 AND TIM 000 TIM 001 #0040 3)Th nghim 2D: (m rng ca 2A,2B,2C): -Vit chng trnh phn loi chai bia,nu gp chai li th cho xi lanh I y ra a chai li v bng chuyn sa cha,khi 12 chai th xi lanh J c y t trn xung ng nt chai. -Dy truyn c dng cm bin quang pht hin li kt chai,nu qu 30s ma cm bin quang ko pht hin c chai i qua s h ci bo ng -Nu b mt in th b m s chai s khng thay i v khi c in th vn hot ng bnh thng
1007 1000
TIM0 1000
1000
1007 1001
1007
0001
0002
CNT 1
CNT1 R 12
CNT1 1002
TIM2 1002
TIM3 #0300
TIM3
HORN 1004
Chng trnh danh sch lnh: //To ra 1 bin trung gian t gi (AUTO) khi nhn SW2 LD 00004 OR 1007 LD NOT 00005 OUT 1007 //Khi bng chuyn bt u hot ng,nu cm bin quang bo c chai i ngang (CB1 ON) v cm bin dung bo chai li (CB2 ON) th cho xi lanh I hot ng trong 2 s y chai li ra. LD 1007
5
1000 0001 0002 NOT TIM 0 1000 1000 000 #0020 LD NOT 1000 AND 1007 OUT 1001 //khi bng chuyn hot ng,cm bin quang bo c chai i ngang(CB1 ON) v cm bin dung khng bo li chai th ta bt u m s chai xung.Khi s chai m xung bng 0( 12 chai) th reset s chai m v 12 LD 1007 AND 0001 AND NOT 0002 LD CNT1 CNT 001 12 //Khi 12 chai th cho xi lanh J hot ng (trong 4s) ng np chai LD CNT1 OR 1002 AND NOT TIM 002 OUT 1002 LD 1002 TIM 002 #0040 //Thit lp ch bo ng ci khi c li kt chai:khi bng chuyn hot ng,v cm bin quang cha xc nh c chai ti th ta s cho timer 3 chy,nu sau 30s m khng c chai i ngang (tc b kt chai) timer 3 s on v h ci bo LD 1007 AND NOT 0001 TIM 003 #0300 LD TIM3 OUT 1004 III) Thc hin phng n c giao: Khi nhn Start (SW2) , h thng s thc hin mt cch tun t cc bc sau: 1/ xi lanh I y ra
6
2/ xi lanh J y ra 3/ xi lanh K y ra 4/ xi lanh I,J thu vo 5/ xi lanh K thu vo 6/ xi lanh K y ra 7/ xi lanh J y ra 8/ xi lanh I y ra 9/ xi lanh J,K thu vo 10/ xi lanh I thu vo 11/ tt h thng Mi bc cch nhau 1s Khi nhn Stop (SW3) h thng dng li.
1007
TIM1 #0010 TIM2 #0020 TIM3 #0030 TIM4 #0040 TIM5 #0050 TIM6 #0060 TIM7 #0070 TIM8 #0080 TIM9 #0090
1007
1007
1007
1007
1007
1007
1007
1007
1007
1007
1000
1007 1001
TIM2 TIM7
TIM3 TIM6
Chng trnh danh sch lnh: //To ra 1 bin trung gian t gi (AUTO) khi nhn STAR(SW2),bin t gi ny s tt khi nhn STOP (SW3) hoc h thng chy xong cc bc (timer 11 on) LD 00004 OR 1007 LD NOT 00005 AND NOT TIM 11 OUT 1007 //Khi h thng bt u hot ng,ta kch cho cc timer chy,mi timer tng ng vi mi mc thi gian bt u cc bc LD 1007 TIM 001 #0010
9
LD 1007 TIM 002 #0020 .. LD 1007 TIM 011 #0110 //da vo yu cu ta c xi lanh I s y ra khi timer 1 ON v thu vo khi timer 4 ON,v li y ra khi timer 8 ON thu vo khi timer 10 ON LD TIM1 AND NOT TIM4 OUT 1000 LD TIM8 AND NOT TIM10 OUT 1000 LD 1007 AND NOT 1000 OUT 1001 //Tng t ta c xi lanh J y ra khi timer 2 ON v thu vo khi timer 4 ON,tip tc y ra khi timer 7 ON,thu vo khi timer 9 ON LD TIM2 AND NOT TIM4 OUT 1002 LD TIM7 AND NOT TIM9 OUT 1002 //Tng t ta c xi lanh K y ra khi timer 3 ON v thu vo khi timer 5 ON,tip tc y ra khi timer 6 ON,thu vo khi timer 9 ON LD TIM3 AND NOT TIM5 OUT 1003 LD TIM6 AND NOT TIM9 OUT 1003 Nhn xt: h thng hot ng ng theo yu cu.
10
TIM1
20002
11
00000 00007
CNT 0 #0010
CNT0
TIM1 10001
00007
CNT0
CNTR(12) #0010
25314
20000
25313
CMP(20) #0010
25506 20001
IL(03)
END
Chng trnh danh sch lnh: //thit lp ch t gi khi nhn STAR LD 00001
12
OR 20000 AND NOT 00002 OUT 20000 //Cho timer 1 chy delay 5s sau khi nhn STAR LD 20000 TIM 001 #0050 //thit lp ch PAUSE dng a ch 20002 lm bin trung gian LD TIM1 AND 00003 LD TIM1 AND 20002 KEEP 20002 //S dng a ch 20002 lm iu kin cho hm kha on chng trnh LD 20002 IL //Bt u on chng trnh trong hm kha //Nu delay 5s v bng ti thng dng th cho bng ti to chy LD TIM1 AND NOT 10001 OUT 10000 //khi cng tc hnh trnh ON,bo thng n ng v tr th reset counter m to v dng cm bin to m s to i qua LD 00000 LD NOT 00007 CNT 000 #0010 //bng ti thng s chy khi timer 5s ON v cng tc hnh trnh khng ON(tc thng cha n ng v tr b to vo) hoc bng ti thng s chy khi to b (CNT0 ON), LD CNT0 OR NOT 00007 AND TIM1 OUT 10001 //Mi ln b xong 1 thng to (CNT0 ON) th cho counter m thng tng thm 1 v dng bin trung gian chy chng trnh (20000) reset counter m thng(mi ln h thng hot ng li th reset counter) LD CNT0 LD 25314 LD 20000 CNTR 0000 #0010 //thit lp gi tr so snh lin tc cho counter m thng LD 25313
13
CMP 00000#0010 //dng h thng khi b so snh bo m 10 thng (25506 ON) LD 25506 OUT 20001 //dng on chng trnh trong hm kha ILC II) Thc hin phng n c giao: Sau khi nhn Start, h thng s t ng ng gi 1 thng 5 to. Sau h thng ngh trong 10s. K tip ng lin tc 3 thng theo th t gm 3 to, 2 to v 1 to. H thng s dng hon ton sau khi thc hin xong tt c cc bc trn hoc khi ta nhn Stop. Khi h thng ang trong trng thi dng, nu ta nhn Start, h thng s thc hin li tt c cng vic theo th t nh trn. Chng trnh LADDER:
14
15
16
17
Chng trnh danh sch lnh: // gii quyt bi ton ta chia bi ton ra lm 2 giai on,giai on sau khi nhn START v giai on sau khi TIMER 0 ON tc l sau khi ngng h thng 10s //giai on u s chy vi bin t gi 20000 //giai on sau s chy vi bin timer 0 LD 000.01 OR 200.00 AND NOT 000.02 AND NOT TIM001 OUT 200.00 //thit lp iu kin cho bng ti to chy: +bin hot ng ca giai on 1 hoc 2 ON (20000 v TIMER 0 ON) +bng ti thng phi ang dng LD 200.00 AND NOT 100.01 LD NOT 200.01 OR TIM000
18
AND LD OUT 100.00 //thit lp cc Counter m s th t thng ti (1..4) v Counter m s to cho mi thng: LD 000.00 LD NOT 000.07 CNT 007 005 LD CNT020 AND 000.00 LD NOT 000.07 CNT 008 003 LD CNT002 AND 000.00 LD NOT 000.07 CNT 009 002 LD CNT003 AND 000.00 LD NOT 000.07 CNT 010 001 LD 000.07 LD 000.01 CNT 020 002 LD 000.07 LD 000.01 CNT 002 003 //Counter 7 m 5 to cho thng 1
LD 000.07 //Counter 3 ON khi c 4 thng qua LD 000.01 CNT 003 004 //Thit lp iu kin chy cho bng ti thng: gm 5 iu kin tng ng cho tng trng hp LD NOT 200.01 AND CNT007 OR NOT 000.07 OR CNT008 OR CNT009 OR CNT010
19
//Thit lp Timer0 Delay h thng 10s sau khi ng xong thng th 1 ( y m phng ch 2s) LD CNT020 TIM 000 020 OUT 200.01 //Sau khi ng xong tt c cc thng th cho bin 20003 ON v kch hot Timer1. Sau thi gian 2s, h thng s dng hon ton v ch nhn START khi ng li. LD CNT010 OR 200.03 AND NOT TIM001 OUT 200.02 LD 200.02 OUT 200.03 LD 200.03 TIM 001 020 END Nhn xt: h thng trn Board th nghim hot ng ng nh yu cu
m_Db = 0.5; m_T0 = 1000; m_Temp = 80; //}}AFX_DATA_INIT } void CSetting::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSetting) DDX_Text(pDX, IDC_DB, m_Db); DDX_Text(pDX, IDC_T0, m_T0); DDX_Text(pDX, IDC_TEMP, m_Temp); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CSetting, CDialog) //{{AFX_MSG_MAP(CSetting) ON_BN_CLICKED(IDC_ACCEPT, OnAccept) ON_EN_CHANGE(IDC_DB, OnChangeDb) ON_EN_CHANGE(IDC_T0, OnChangeT0) //}}AFX_MSG_MAP // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here VCL_InitControls(m_hWnd); Scope2.Open(m_Scope2.m_hWnd); Scope2.SizeLimit = 1000; Scope2.Channels.Add(0); Scope2.Title.Text="Control Power realtime trend"; Scope2.Channels[0].Name="Control Power"; Scope2.YAxis.AxisLabel.Text="Power(%)"; Scope2.YAxis.Max=100; Scope2.YAxis.Min=0; Scope1.Open(m_Scope1.m_hWnd); Scope1.SizeLimit = 1000; Scope1.Channels.Add(0); Scope1.Channels.Add(1); Scope1.Title.Text="Measuring temperature realtime trend"; Scope1.Channels[0].Name="Meas.Temp"; Scope1.Channels[1].Name="Set Temp"; Scope1.YAxis.AxisLabel.Text="Temperature(C)"; Scope1.YAxis.Max=200; Scope1.YAxis.Min=0; return TRUE; // return TRUE unless you set the focus to a control } 22
// If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CBai3_3Dlg::OnPaint() { if (IsIconic()) { END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSetting message handlers
s.Format("%0d", dwCurrentTime/1000); this->SetDlgItemText(IDC_RTIME, s); s.Format("%.2f",Temp); this->SetDlgItemText(IDC_STEMP, s); s.Format("%.2f",Temp - Input*62.5); this->SetDlgItemText(IDC_ERROR, s); // write output data if ((Temp-Input*62.5)<(Db))//db duoi { Output = 5; Pwr = 100 ; pw = 100 ; } if ((Input*62.5-Temp)>(Db))//db tren { Output = 0; Pwr = 0 ; pw = 0 ; } ptAOConfig.chan = gwChannelOutput ; ptAOVoltageOut.OutputValue = Output; DRV_AOVoltageOut(DriverHandle,(LPT_AOVoltageOut)&ptAOVoltageOut); CDialog::OnTimer(nIDEvent); } void CSetting::OnChangeDb() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. // TODO: Add your control notification handler code her } void CSetting::OnChangeT0() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. // TODO: Add your control notification handler code here }
1) iu khin PID: - on c tn hiu nhit : DRV_AIVoltageIn(DriverHandle,(LPT_AIVoltageIn)&ptAIVoltageIn); - on tnh v xut tn hiu iu khin: Error = Temp - 62.5*Input; ek2 = ek1; ek1 = ek; ek = Error; uk1 = uk; uk = uk1 + A0*ek + A1*ek1 + A2*ek2; if(uk>MaxValueOut) { uk = MaxValueOut; } if(uk<MinValueOut) { uk = MinValueOut; } Output = (float)uk; 2) iu khin ON-OFF: - on c tn hiu nhit : // read input data DRV_AIVoltageIn(DriverHandle,(LPT_AIVoltageIn)&ptAIVoltageIn); - on tnh v xut tn hiu iu khin: // write output data if ((Temp-Input*62.5)<(Db) ; { Output = 5; Pwr = 100 ; pw = 100 ; } if ((Input*62.5-Temp)>(Db)) { Output = 0; Pwr = 0 ; pw = 0 ; } ptAOConfig.chan = gwChannelOutput ;
26
p ng thu c:
Td=0.5L=25 Kd=Kp*Td=4
27
Bng gi tr thu c t p ng: B iu khin PID H s tm c H s mc nh Thi gian ln (s) 75 70 Thi gian xc lp (s) 550 450 vt l (%) 122.5 112.5 Sai s xc lp (0C) 9 5
28
Bng gi tr:
29
Sai s xc lp (0C) 15 10
=> Nhn xt: - iu khin ON-OFF khi rng vng cht cng nh th sai s xc lp cng nh. - B iu khin PID cho sai s nh hn so vi b iu khin ON-OFF.Cht lng b iu khin PID tt hn nhiu so vi ON-OFF. Cu hi thm: lm cho mn c tuyn khi iu khin ON-OFF (on nhp nh u nhau 2 bn gi tr xc lp) Tr li: -Nguyn nhn lm cho phn nhp nh khng u nhau l do qun tnh nhit lc tng v gim nhit khng u nhau.(tng th nhanh ,gim th chm) -Hng gii quyt:sa on code thnh nh sau: if ((Temp-Input*62.5)>(Db+a) if ((Input*62.5-Temp)>(Db-b)) .... vi a,b l cc s dng ta chn thch hp sai s phn trn v phn di u nhau (da vo thc nghim v phng php th v sai).
Bi 4: IU KHIN TC V V TR NG C DC
30
I) Cc on chng trnh mu :
// on chng trnh c xung:
PT_DioReadPortByte ptDioReadPortByte0,ptDioReadPortByte1; USHORT DataLo,DataHi; double Pulse; double Delta_Pulse; static double PrevPulse; // read low byte ptDioReadPortByte0.port = 0; ptDioReadPortByte0.value = (USHORT far *)&DataLo; // read high byte ptDioReadPortByte1.port = 1; ptDioReadPortByte1.value = (USHORT far *)&DataHi; DRV_DioReadPortByte(DriverHandle,(LPT_DioReadPortByte)&ptDioReadPortByte0); DRV_DioReadPortByte(DriverHandle,(LPT_DioReadPortByte)&ptDioReadPortByte1); Pulse = DataHi*256 + DataLo; Delta_Pulse = Pulse - PrevPulse; PrevPulse = Pulse; // processing counter overflow if(Delta_Pulse>+32768) Delta_Pulse = Delta_Pulse - 65536; if(Delta_Pulse<-32768) Delta_Pulse = Delta_Pulse + 65536; return (Delta_Pulse); // on x l tn hiu: void CBAI4Dlg::OnRun() { // TODO: Add your control notification handler code here //------------------------------------------------------------//configure input and output of the PCI card if(!flag) DRV_SelectDevice(m_hWnd,FALSE,&m_DeviceNume, m_DeviceName); DRV_DeviceOpen(m_DeviceNume,&DriverHandle); // configures the gain for the specifed analog input channel ptAIConfig.DasGain = DevFeatures.glGainList[gwGain].usGainCde; ptAIConfig.DasChan = gwChannelInput; DRV_AIConfig(DriverHandle,(LPT_AIConfig)&ptAIConfig); // reads an analog input channel ptAIVoltageIn.chan = gwChannelInput; ptAIVoltageIn.gain = ptAIConfig.DasGain; ptAIVoltageIn.TrigMode = 0; // internal trigger ptAIVoltageIn.voltage = (FLOAT far *)&Input; // configures the gain for the specifed analog output channel ptAOConfig.chan = gwChannelOutput; ptAOConfig.RefSrc = 0; // reference source internal ptAOConfig.MaxValue = MaxValueOut; 31
ptAOConfig.MinValue = MinValueOut; DRV_AOConfig(DriverHandle,(LPT_AOConfig)&ptAOConfig); // output data ptAOVoltageOut.chan = gwChannelOutput; ptAOVoltageOut.OutputValue = Output; DRV_AOVoltageOut(DriverHandle,(LPT_AOVoltageOut)&ptAOVoltageOut); //--------------------------------------------------m_nTimer = SetTimer(1,T0,0); if(!flag) gdwStartTime = GetTickCount(); flag =1; //-------------------------------------------a0 = Kp + Ki*T0/1000/2 + Kd*1000/T0; a1 = -Kp + Ki*T0/1000/2 - 2*Kd*1000/T0; a2 = Kd*1000/T0; }
32
if(m_nTimer) { m_speed = DataPulse()*speedratio/T0; updatespeed[9] = m_speed; for(i=0;i<10;i++){ avrspeed+= updatespeed[i];} avrspeed = avrspeed/10; for (i=0;i<9;i++) updatespeed[i] = updatespeed[i+1]; Output = (float)PID(avrspeed); Output = 2.5 + Output; if(Output> MaxValueOut) Output = MaxValueOut; if(Output < MinValueOut) Output = MinValueOut; ptAOVoltageOut.OutputValue = (Output); DRV_AOVoltageOut(DriverHandle,(LPT_AOVoltageOut)&ptAOVoltageOut); if(i<1000) { CurrentSpeed[i] = m_speed; i++; } //plot the measure speed, set speed, control voltage Scope1.Channels[0].Data.AddYPoint(SetSpeed); Scope1.Channels[1].Data.AddYPoint(avrspeed); Scope2.Channels[0].Data.AddYPoint(Output); } dwCurrentTime = GetTickCount()- gdwStartTime; s.Format("%0d", dwCurrentTime/1000); this->SetDlgItemText(IDC_STATIC_RUN, s); s.Format("%2.2f",Output); this->SetDlgItemText(IDC_STATIC_VOLTAGE, s); s.Format("%2.2f",SetSpeed - m_speed); this->SetDlgItemText(IDC_STATIC_ERROR, s); s.Format("%4d",m_speed); this->SetDlgItemText(IDC_STATIC_MEASPEED, s); s.Format("%4d",SetSpeed); 33
+ Trng hp Kp=0.002:
0.002 8 61.2 2
0.0025 10 75 0
Th Nghim vi Kd thay i,Kp=0.0004,Kd=0.0015: Kd 10^(-4) Thi gian xl (s) 4s vt l (%) 29.93% Sai s xl (v/p) 4
+ Trng hp Kd=3.10^(-4):
36
2) iu khin v tr ng c: Th Nghim vi Ki=0.05,Kp=0.002,Kd=0.025 Thi gian ln 0.07s Thi gian xl (s) 1.6s vt l (%) 15% Sai s xl (v/p) 0.41
37
III) Nhn
cao. Khi tng Kp th cc cc ca h thng ni chung c xu hung di chuyn ra xa trc thc. Nu tng Kp qu gi tr h s khuch i gii hn th h thng s tr nn mt n nh (dao ng). Khi tng Ki : lm chm p ng qu thi gian xc lp tng , vt l tng , sai s xc lp gim. Do h s khuch i ca khu PI bng v cng ti tn s bng 0 nn khu PI c th lm cho sai s ca tn hiu vo l hm nc ca h thng khng c khu vi phn l tng bng 0. Ngoi ra, do khu PI l mt b lc thng thp nn n cn c tc dng trit tiu nhiu tn s cao tc ng vo h thng. Khi tng Kd : p ng ca h thng cng nhanh ,thi gian ln ngn,nhng thi gian xc lp tng , vt l tng v sai s xc lp tng.
I) Yu cu ca thy:
To thm 1 nt nhn REVERSE o chiu quay ca ng c nhng ch nhn REVERSE c 1 ln.
if(SetSpeed > 0) USetSpeed = (2952.0 - SetSpeed)/1135.4; //QUY DOI TOC DO RA DIEN AP else USetSpeed = (2720.0 - SetSpeed)/1133.8; a[0][0] = a0; a[1][0] = a1; a[2][0] = a2; //on tnh tn hiu iu khin: double CBAI4Dlg::PID(double currentspeed) { static double u[2]; //u[0]: u(k-1); u[1]: u(k) static double e[3]; //e[0] la` e1(k), e[1]: e1(k-1), e[2]: e1(k-2) double etemp; double e2; int i1; /* //dua toc do do duoc thanh ap if(Output>2.6) etemp = (2952 - currentspeed)/1135.4; else if( Output >= 2.4) etemp = 0; else etemp =(2720 - currentspeed)/1133.8; /* Tinh' e2 //*/ if(Output<=2.4) e2 = 2.5-(2695.0-SetSpeed-25)/1133.8+Output; // 50ms (0V->2.5V) //if(u<2.4) e = 2.4-(2696.5-dat)/1135.9-u; // 50ms (0V->2.5V) (them 2.3V) if(Output>2.4 & Output<2.6) e2 = 2.5; if(Output>=2.6) e2 = 2.6-(2897.7- SetSpeed)/1135.4+Output; // 50ms (2.5V->5V) //sai lech dau vao tinh theo ap // e[2] = USetSpeed - etemp; /* Tinh e1(k) tuc la e[2]*/ if(Output<=2.4) e[2] = 2.4-(2695.0-(SetSpeed - currentspeed-25))/1133.8; // 50ms (0V->2.5V) // if(u<2.4) e_omega0 = 2.4-(2696.5-(dat - s/T1))/1135.9; // 50ms (0V->2.5V) if(Output>2.4 & Output<2.6) e[2] = 2.5; if(Output>=2.6) e[2] = 2.6-(2897.7-(SetSpeed
40
*/
currentspeed))/1135.4; // 50ms (2.5V->5V) // // //sai lech tinh theo ap giua toc do dat va tin hieu dieu khien Output = 2.5 - Output; e2 = -USetSpeed + Output; for(i1 =0;i1<3; i1++) //Cong thuc cap nhat thong so: an[k+1] = an[k] +beta*e2[k]*e1[k-n] a[i1][1] = a[i1][0] + beta*e[2-i1]*e2; u[1] = u[0] + a[0][1]*e[2] + a[1][1]*e[1] + a[2][1]*e[0]; u[0] = u[1]; e[0] = e[1]; e[1] = e[2]; for (i1 = 0; i1<3; i1++) a[i1][0] = a[i1][1]; return u[1]; } //on xut tn hiu iu khin: void CBAI4Dlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CString s; double m_speed; // static double updatespeed[MAXUPDATE]; double avrspeed =0; if(m_nTimer) { m_speed = DataPulse()*speedratio/T0; updatespeed[MAXUPDATE-1] = m_speed; for(i=0; i<MAXUPDATE; i++){ avrspeed+= updatespeed[i];} avrspeed = avrspeed/MAXUPDATE; //TINH TRUNG BINH DE TRANH' NHIEU for (i=0; i<MAXUPDATE-1; i++) updatespeed[i] = updatespeed[i+1]; Output = (float)PID(avrspeed);//********************************
41
Output = 2.5 - Output; if(Output> MaxValueOut) Output = MaxValueOut; if(Output < MinValueOut) Output = MinValueOut; ptAOVoltageOut.OutputValue = (Output); DRV_AOVoltageOut(DriverHandle, (LPT_AOVoltageOut)&ptAOVoltage Out); if(i<1000) { CurrentSpeed[i] = avrspeed; i++; // } //plot the measure speed, set speed, control voltage Scope1.Channels[0].Data.AddYPoint(SetSpeed); Scope1.Channels[1].Data.AddYPoint(avrspeed); Scope2.Channels[0].Data.AddYPoint(Output); } dwCurrentTime = GetTickCount()- gdwStartTime; s.Format("%0d", dwCurrentTime/1000); this->SetDlgItemText(IDC_STATIC_RUN, s); s.Format("%2.2f",Output); this->SetDlgItemText(IDC_STATIC_VOLTAGE, s); s.Format("%2.2f",SetSpeed - m_speed); this->SetDlgItemText(IDC_STATIC_ERROR, s); s.Format("%4d",m_speed); this->SetDlgItemText(IDC_STATIC_MEASPEED, s); s.Format("%4d",SetSpeed); this->SetDlgItemText(IDC_STATIC_SETSPEED, s); CDialog::OnTimer(nIDEvent); }
Ta thm vo FUNCTION sau cho nt bm REVERSE,v nh khai bo int reverse =0 u chng trnh xc nh ng c ang quay theo chiu no void CBAI4Dlg::OnReverse() { // TODO: Add your control notification handler code here If (reverse) SetSpeed=-SetSpeed; Else SetSpeed=SetSpeed; Reverse =1; }
43
Th nghim vi tc t 1000(v/p): B Thi gian Thi gian iu Khin ln(s) xc lp(s) PID 10 27 PID thch nghi 4.5 12
Sai s Xc lp(v/p) 0 0
44
45
Th nghim vi tc t 2000(v/p): B Thi gian Thi gian iu Khin ln(s) xc lp(s) PID 10 50 PID thch nghi 2.5 16
vt l(%) 25 10
Sai s Xc lp(v/p) 0 0
Th nghim vi tc t -200(v/p): B Thi gian Thi gian iu Khin ln(s) xc lp(s) PID 14 40 PID thch nghi 2 12
vt l(%) 15 30
Sai s Xc lp(v/p) 3 0
46
Sai s
47
xc lp(s) 50 6
vt l(%) 25 53
Xc lp(v/p) 0 0
48
Trong tt c cc trng hp iu khin vi tc t cho trc th b iu khin thch nghi lun c thi gian xc lp rt nhanh so vi b iu khin PID thng . Thi gian ln v thi gian xc lp ca b iu khin thch nghi lun b hn thi gian ln v xc lp ca b iu khin PID thng. ng thi b iu khin thch nghi lun cho sai s xc lp bng 0 do cc h s Kp,Kd,Ki s c t chnh nh sao sai s ng ra bng 0. Tuy nhin trong mt s trng hp th b iu khin thch nghi c vt l kh ln, gp i so vi vt l ca b iu khin PID thng thng. H s thch nghi phn nh tc thch nghi ca b iu khin: -Nu ln th h thng s hi t nhanh nhng vt l cng tng theo, h thng nhy vi nhiu -Nu nh th ngc li,h thng s hi t chm nhng vt l cng s gim xung => Ta phi chn h s sao cho thch hp c th chp nhn tc hi t v vt l l t yu cu so vi thc t
Quan st cui cng l kt qu ca th nghim thc t ta thy c kh nng
iu khin tn hiu ng ra bm theo tn hiu t ca b iu khin thch nghi l rt tt. chnh l l do ti sao b iu khin thch nghi c s dng trong cc trng hp i hi chnh xc cao v thi gian p ng nh.
49