|
Tài trợ cho PIC Vietnam |
Điều khiển Lý thuyết điều khiển và ứng dụng lý thuyết điều khiển trong những trường hợp thực tế |
|
Ðiều Chỉnh | Xếp Bài |
|
24-03-2011, 07:19 PM | #1 |
Nhập môn đệ tử
Tham gia ngày: Mar 2011
Bài gửi: 3
: |
Giúp mình mình về PID
Mình có làm về điều khiển động có dùng PWM và thuật toán PID dùng PIC 16f876A. Dùng PWM không thì ổn rồi, nhưng khi dùng thuật toán PID có dùng hàm ngắt timer 0: int_TIMER0 thì chân ccp1 và ccp2 lại không ra xung nữa. Mình không hiểu tại sao, các bạn giúp mình với, mình đang làm đồ án.
|
25-03-2011, 07:38 PM | #2 |
Nhập môn đệ tử
Tham gia ngày: Mar 2011
Bài gửi: 3
: |
Mình đã tìm ra lỗi rồi, nhưng khi code pid vào thì tôc độ động cơ lại luôn max,
không phụ thuộc vào V_set. Mọi người xem giúp mình với. Code của mình đây:
#include "D:\My Documents\ccc\sdaada.h" int16 count; int8 a; int16 xung1=0,xung2=0; int16 count1=0,count2=0; int32 dem=0; float V_now1=0,V_sum1=0,V_last1=0,V_del1=0; long V_real1=0,V_set1=200; float duty1=0; float V_now2=0,V_sum2=0,V_last2=0,V_del2=0; long V_real2=0,V_set2=50; float duty2=0; int kp=8,ki=10,kd=1; void demxung2() { if (input(PIN_A5)==0) { while(input(PIN_A5)==0); count2=count2+1; xung2=count2; break;} else { xung2=count2; break;} } void demxung1() { if (input(PIN_A3)==0) { while(input(PIN_A3)==0); count1=count1+1; xung1=count1; break;} else { xung1=count1; break;} } #int_TIMER0 void TIMER0_isr() { set_timer0(6); ++dem; if(dem == 500) // 2000*500us = 1000000us = 1s { dem=0; V_real1=xung1; count1=0; V_now1=V_set1-V_real1; V_sum1=V_now1+V_last1; V_del1=V_now1-V_last1; V_last1=V_now1; duty1=duty1+Kp*V_now1+Ki*V_sum1+Kd*V_del1; if(duty1>255) duty1=255; if(duty1<0) duty1=0 ; delay_ms(200) ; set_pwm1_duty(duty1); V_real2=xung2; count2=0; V_now2=V_set2-V_real2; V_sum2=V_now2+V_last2; V_del2=V_now2-V_last2; V_last2=V_now2; duty2=duty2+Kp*V_now2+Ki*V_sum2+Kd*V_del2; if(duty2>255) duty2=255; if(duty2<0) duty2=0 ; delay_ms(200); set_pwm2_duty(duty2); } } void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DIV_BY_16,255,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); enable_interrupts(INT_TIMER0); enable_interrupts(GLOBAL); setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); set_tris_c(0x00); // TODO: USER CODE!! while(true) { demxung1(); demxung2(); //output_c(0xff); //delay_ms(200); //output_low(pin_c4); } } |
|
|