View Single Post
Old 23-06-2013, 05:16 PM   #1
hoangtuanthien
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;

}
hoangtuanthien vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn