Monday, February 20, 2006

CONTROLLER PID DIGITAL DALAM C/C++ BY LAS

#include
#include
#include
#include
#include

//Inisialisasi Komunikasi Data Parallel Port
#define ppdata 0x0378
#define ppstatus 0x0379
#define ppcontrol 0x037a
void main(){ unsigned char s4dkk, bit4, ActualConv; float K2=0.0, K1=0.0, K0=0.0, Kp=0.0, Ki=0.0, Kd=0.0; int Ref; float E0=0.0, E1=0.0, E2=0.0, U0=0.0, U1=0.0, U2=0.0; int Desimal_U0, Desimal_E0; int cWaktu, waktu; int putaran = 0; int key = 0; struct time t; long start, stop, T; int gDriver = DETECT, gMode, errorCode; int aa, bb; char buffer[64];

// Mempersiapkan Penulisan File
FILE*ujirataan; char*nama_file="pid0003.txt"
if ((ujirataan=fopen(nama_file,"w+"))==NULL)
{ printf("Gagal membuka berkas untuk menulis data."); exit(1); }

//clrscr();
initgraph(&gDriver, &gMode, "c:\\tc\\bgi");
errorCode = graphresult();
if (errorCode != grOk)
{ printf("Error Loading Graphics\n");
exit(0); }
//Ref. dan Waktu diberikan dari Keyboard (dalam Jumlah Putaran Tiap Detik, RPS)
printf("Teg. Referensi, V (1.57 s/d 5.00) : ");
scanf("%d", &Ref);
printf("Waktu Pengamatan (detik) : ");
scanf("%d", &waktu);
// printf("Kp : ");
scanf("%4.2f", &Kp);
// printf("Ki : ");
scanf("%4.2f", &Ki);
// printf("Kd : ");
scanf("%4.2f", &Ki);
cWaktu = 1;
gettime(&t);
start = (long)t.ti_hour*60*60*100 + t.ti_min*60*100 + t.ti_sec*100 + t.ti_hund;
do { putaran = 0;
do { putaran++;

//Ambil waktu PC dalam satuan PER SERATUS DETIK (atau 10ms)
gettime(&t);
stop=(long)t.ti_hour*60*60*100+t.ti_min*60*100+ t.ti_sec*100+t.ti_hund; }
while (stop-start < 100);
//periode sampling, T = 100*(1/100) det = 1 detik.
//Periode Sampling (detik)
T=(stop-start)/100;
printf("%d",cWaktu);
//Masukan untuk Controller
E0=Ref;//Untuk OLTF
//Pemberian Nilai Kp, Ki, dan Kd
Kp=0.5; Ki=0.1; Kd=0.0;
//Konstanta dari Persamaan Diskrit dari U(z)/E(z)...PID Controller
K2=(float) Kp+(0.5*Ki*T)+((2*Kd)/T);
K1=(float) (Ki*T)-((4*Kd)/T);
K0=(float) -Kp+(0.5*Ki*T)+((2*Kd)/T);
//Persamaan Diskrit dari PID Controller U0=(float)(K2*E0)+(K1*E1)+(K0*E2)+0.0*U1+U2;
//Simpan Data di File fprintf(ujirataan,"%d\t %d\t %5.2f\t %5.2f\t %5.2f\t %5.2f\n", cWaktu, Ref, U0, U1, U2, E0);
//Pertukaran variabel untuk sampling berikutnya start = stop; E2=E1; E1=E0; U2=U1; U1=U0;
//Variabel untuk Pengecheckan Waktu dinaikkan cWaktu++;
if (kbhit()) { key = getch(); if (key == 0) key = getch(); } } while (cWaktu <= waktu && key != 27);//esc}

No comments: