|
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 |
23-06-2013, 05:16 PM | #1 |
Nhập môn đệ tử
Tham gia ngày: Feb 2012
Bài gửi: 1
: |
Thắc mắc xung điều khiển servo
chào mọi người. mình đang sử dụng servo RC96xx , như mình được viết thì đk servo cần cấp xung chu kỳ 20ms và Ton từ 1-2ms, trong chương trình dưới đây mình cho timer0 ngắt 20us, thì vậy để có được chu kì xung 20ms thì mình cho biến đếm tăng đến 1000 để điều khiển servo, và giá trị để phải nằm khoảng 100-200 thế nhưng mình mình gán giá trị để khảo sát và điều khiển servo thì tầm giá trị của nó lại nằm trong khoảng 1x-5x . mình nghĩ mãi mà không biết lý do tại sao. mong mọi người tính toán lại xem và giúp đỡ. mình đang cần đk 12 sv để làm đồ án tốt nghiếp.
#include <PIC18f4550.h> #use delay(clock=16000000, crystal=16000000) int16 dem; int flag; //int16 dem1; //int8 sv1,sv2,sv3,sv4,sv5,sv6,sv7,sv8,sv9,sv10,sv11,sv12 ; char const gt0[12]={39,30,32,32,43,38,35,43,26,37,36,38}; char const gtmin[12]={20,10,14,18,18,17,17,17,13,17,17,17}; char const gtmax[12]={56,40,61,55,55,54,54,54,55,54,54,54}; char const gocmax[12]={135,160,180,135,140,140,135,125,170,120,145,120} ; char sv[12]; void dunglen(); void translate(int8 gt0,int8 gtmin, int8 gtmax,int8 gocmax,int flag,int8 gocset,gocsv); #int_TIMER0 void TIMER0_isr(void) { set_timer0(216); dem++; //dem1++; if(dem==100) { dem=0; output_d(0x3f); output_e(0x07); output_high(pin_a4); output_b(0x30); output_toggle(pin_c1); } if(dem==sv[0]){output_low(pin_d0);} if(dem==sv[1]){output_low(pin_d1);} if(dem==sv[2]){output_low(pin_d2);} if(dem==sv[3]){output_low(pin_d3);} if(dem==sv[4]){output_low(pin_d4);} if(dem==sv[5]){output_low(pin_d5);} if(dem==sv[6]){output_low(pin_e2);} if(dem==sv[7]){output_low(pin_e1);} if(dem==sv[8])output_low(pin_e0); if(dem==sv[9])output_low(pin_a4); if(dem==sv[10])output_low(pin_b5); if(dem==sv[11])output_low(pin_b4); //if(dem1==20000) //{ // dem1=0; // sv12++; // output_toggle(pin_c2); //} } #int_TIMER1 void TIMER1_isr(void) { } void main() { set_timer0(216); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2|RTCC_8_bit) ; //128 us overflow setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); //16.3 ms overflow enable_interrupts(INT_TIMER0); //enable_interrupts(INT_TIMER1); enable_interrupts(GLOBAL); while(true) { dunglen(); } } void dunglen() { sv[0]=26; sv[1]=36; sv[2]=27; sv[3]=46; sv[4]=35; sv[5]=52; sv[6]=51; sv[7]=34; sv[8]=37; sv[9]=28; sv[10]=28; sv[11]=54; } void translate(int8 gt0,int8 gtmin, int8 gtmax,int8 gocmax,int flag,int8 gocset,gocsv) { int8 rate, tang; rate=(gtmax-gtmin)/gocmax; tang=gocset*rate; if(flag==1)gocsv=gt0+tang; if(flag==0)gocsv=gt0-tang; } |
|
|