Hi all! I am the beginner in CCS.
I use the PID controller to control the velocity of the DC motor.
Here is my code, it does not work. And I don't know why,
Please help out.
#include "16F88.h"
#USE standard_io(B)
#use delay(clock=4000000)
double xung , Kp_t, Ki_t, Kd_t,Kp,Ki,Kd ,v_set, v_cur, e2, e1, e_sum, e_del, duty ;
#int_TIMER1
TIMER1_isr()
{
xung = get_timer0(); // xung= so xung dem duoc trong 1 ms
set_timer0 (0);
set_timer1 (-1000);
}
main()
{
setup_adc_ports(sAN0|sAN1|sAN2|sAN3|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_8);
setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
setup_timer_2(T2_DIV_BY_1,255,1); /*Chu ki cua PWM= (255 +1)* 4* 1us * (T2DIV)= 1024us
Do do tan so cua PWM la 976Hz
Muon tang gia tri chu ki PWM len, thi cao lam cung chi la
1024*16=16384 us<-->61 Hz.*/
setup_ccp1(CCP_PWM);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
/*****************************************************************/
// NOI NHAP HE SO PID CHO HE THONG KHI DIEU KHIEN TU DONG.
Kp_t=10;
Ki_t= 1;
Kd_t=0.1;
duty= 100;// 100 micro giay duty cycle.
/******************************************************************/
do{
/****** Quay phai hay quay trai?**************************/
If (PIN_B0 == 0)
output_low (PIN_B2) ; //Quay trai
Else output_high (PIN_B2); //quay phai.
/*********************************************************/
If (input(PIN_B5)==0) // PID tu dong
{ Kp = Kp_t;
Ki = Ki_t;
Kd = Kd_t;
}
Else //PID bang tay, chinh bang bien tro.
// Kp, Ki, Kd = 0--> 100
// 1 buoc adc = 100/1024= 0.0976
{set_adc_channel (1); //lay Kp
delay_us (500); //cho 500 us cho adc chinh xac.
Kp= read_adc()*0.0976; //Kp=gia tri tu bien tro.
set_adc_channel(2);
delay_us (500);
Ki=read_adc()*0.0976;
set_adc_channel (3);
delay_us (500);
Kd=read_adc()*0.0976;
}
/*************************************************************/
// lay van toc can thiet tu bien tro AN0, van toc = 0 --> 300 vong/phut
set_adc_channel(0);
delay_us(500);
v_set= read_adc()* 0.293; // read_adc = 0--> 1023
// 0.293= van toc toi da (300 v/p) / 1024
/******************************************************************************/
// lay van toc tuc thoi tu encoder.
// encoder 200 xung/vong,
//so vong trong 1phut = so xung trong 1ms * 12000000
set_timer0 (0); // dem xung encoder dua ve
set_timer1 (-1000); // thoi gian lay mau doi voi encoder la 1000us
v_cur= xung *12000000; // van toc hien tai (vo`ng/ phu't)
/******************************************************************************/
/******************************************************************************/
e2= v_set- v_cur ;
e_sum= e2 + e1;
e_del= e2 - e1;
e1=e2;
duty= duty + Kp*e2 + Ki*e_sum + Kd*e_del; // Day la he thuc tinh PID roi rac.
set_pwm1_duty(610);
}
while ( true);
}
I use the PID controller to control the velocity of the DC motor.
Here is my code, it does not work. And I don't know why,
Please help out.
#include "16F88.h"
#USE standard_io(B)
#use delay(clock=4000000)
double xung , Kp_t, Ki_t, Kd_t,Kp,Ki,Kd ,v_set, v_cur, e2, e1, e_sum, e_del, duty ;
#int_TIMER1
TIMER1_isr()
{
xung = get_timer0(); // xung= so xung dem duoc trong 1 ms
set_timer0 (0);
set_timer1 (-1000);
}
main()
{
setup_adc_ports(sAN0|sAN1|sAN2|sAN3|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_8);
setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
setup_timer_2(T2_DIV_BY_1,255,1); /*Chu ki cua PWM= (255 +1)* 4* 1us * (T2DIV)= 1024us
Do do tan so cua PWM la 976Hz
Muon tang gia tri chu ki PWM len, thi cao lam cung chi la
1024*16=16384 us<-->61 Hz.*/
setup_ccp1(CCP_PWM);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
/*****************************************************************/
// NOI NHAP HE SO PID CHO HE THONG KHI DIEU KHIEN TU DONG.
Kp_t=10;
Ki_t= 1;
Kd_t=0.1;
duty= 100;// 100 micro giay duty cycle.
/******************************************************************/
do{
/****** Quay phai hay quay trai?**************************/
If (PIN_B0 == 0)
output_low (PIN_B2) ; //Quay trai
Else output_high (PIN_B2); //quay phai.
/*********************************************************/
If (input(PIN_B5)==0) // PID tu dong
{ Kp = Kp_t;
Ki = Ki_t;
Kd = Kd_t;
}
Else //PID bang tay, chinh bang bien tro.
// Kp, Ki, Kd = 0--> 100
// 1 buoc adc = 100/1024= 0.0976
{set_adc_channel (1); //lay Kp
delay_us (500); //cho 500 us cho adc chinh xac.
Kp= read_adc()*0.0976; //Kp=gia tri tu bien tro.
set_adc_channel(2);
delay_us (500);
Ki=read_adc()*0.0976;
set_adc_channel (3);
delay_us (500);
Kd=read_adc()*0.0976;
}
/*************************************************************/
// lay van toc can thiet tu bien tro AN0, van toc = 0 --> 300 vong/phut
set_adc_channel(0);
delay_us(500);
v_set= read_adc()* 0.293; // read_adc = 0--> 1023
// 0.293= van toc toi da (300 v/p) / 1024
/******************************************************************************/
// lay van toc tuc thoi tu encoder.
// encoder 200 xung/vong,
//so vong trong 1phut = so xung trong 1ms * 12000000
set_timer0 (0); // dem xung encoder dua ve
set_timer1 (-1000); // thoi gian lay mau doi voi encoder la 1000us
v_cur= xung *12000000; // van toc hien tai (vo`ng/ phu't)
/******************************************************************************/
/******************************************************************************/
e2= v_set- v_cur ;
e_sum= e2 + e1;
e_del= e2 - e1;
e1=e2;
duty= duty + Kp*e2 + Ki*e_sum + Kd*e_del; // Day la he thuc tinh PID roi rac.
set_pwm1_duty(610);
}
while ( true);
}