 |
:: عضو ذهبي ::
تاريخ التسجيل: Jul 2009
الدولة: Egypt
المشاركات: 767
|
|
نشاط [ sheimy ]
قوة السمعة:
|
|
29-12-2011, 05:31 PM
المشاركة 4
|
|
الكود التالى عبارة عن
PID Controller
تم تصميمه ليعمل عل
877A
يمكنك الرجوع للكتاب التالى
Microcontroller Based
Applied Digital Control
وهذا هو الكود
كود:
#define DA_Write PORTC.B0
float a0,a1,a2,b_1,b_2,M1,M2,rk,rk_1,rk_2,ek,sk;
long yk,uk;
void Inatialize_AD(){
ADCON1=0b00000001; //ALL PORT A AS Analog AND refrance are AN3
ADCON0=0x41; //Select AN0
}
void Inatialize_TMR0(){
/*OPTION_REG.B5=0; //TMR0 Clock Source Select bit
OPTION_REG.PSA=0; // Prescaler is assigned to the Timer0 module
OPTION_REG.PS0=1;
OPTION_REG.PS1=0;
OPTION_REG.PS2=1; //Set pre-scaler to 64*/
OPTION_REG=0b00000101;
TMR0=100;
INTCON.GIE=1;
INTCON.T0IE=1;
INTCON.T0IF=0;
}
void Read_AD(){
yk=(long)ADC_Read(0);
yk=yk*5000; // Convert to
yk=yk/1023; // MV OR Convert from level to voltage
}
void interrupt(){
PORTD=~PORTD;
TMR0=100;
Read_AD();
ek = sk - yk; /* Calculate error term */
rk = ek + M1;
yk = a0*rk + M2; /* Calculate output */
uk = (yk*256)/5000; //Convert to Level again
PORTB = uk; /* Send to PORT B */
DA_Write = 0; /* Write to D/A converter */
DA_Write = 1;
rk_2 = rk_1; /* Update variables */
rk_1 = rk;
M1 = -b_1*rk_1 - b_2*rk_2;
M2 = a1*rk_1 + a2*rk_2;
INTCON.T0IF= 0; /* Re-enable timer interrupts */
}
void main() {
TRISD=0;
PORTD=0;
INTCON.GIE=1;
INTCON.T0IE=1;
a0 = 1; a1 = 0.8; a2 = 1.2;
b_1 = 1.85; b_2 = 0.92;
M1 = 0; M2 = 0; rk = 0; rk_1 = 0; rk_2 = 0;
sk = 1.0;
TRISA = 1; /* RA0 (AN0) is input */
TRISB = 0; /* PORT B is output */
TRISC = 0; /* RC0 is output */
DA_Write = 1; /* Disable D/A converter */
Inatialize_AD(); /* Initialize A/D converter */
Inatialize_TMR0(); /* Initialize timer interrupts */
for(;;); /* Wait for an interrupt */
}
|