Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 3768|回復: 2
打印 上一主題 下一主題

關於servo和timer

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-4-12 16:03:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我想寫一個8051的c program,透過vb和電腦的rs232,
來同時控制6-9個servo,但8051的兩個timer,一個給rs232用了,而另一個則用來做約20ms一次的interrupt
那servo那兒的pwm應該怎麼寫?
在沒有外接pwm晶片的情況下怎樣可以在20ms的週期中輸出0.5ms-2.5ms的pwm給不同的servo?

我是一名新手,
這點一直都想不通......希望各位大大幫忙解困........


/* ser.c  */
#include <reg51.h>
sbit  wled  = P2^3;
sbit  spu0   = P2^4;
sbit  spu1   = P2^7;


sbit  wled2        = P2^6; //S

/* S3003 pulse time */
#define  DEA    3  /* servo backward  TC */
#define  DEB    19 /* servo forkward  TC */
#define  DEC    12 /* 10 11  12 13   14 15 servo center    TC */

#define  SERVOS 2

//int timercounter;
//int servocounts[SERVOS];
//int tmp;

int servo0_time;
int servo1_time;
int time,a,b,temp0,temp1,temp2;
unsigned char high,low;

mov_servo(void);
compare_SBUF(void);
/*------------------------------*/
delay(int d)
{
int i, j;
for(i=0; i<d; i++)
    for(j=0; j<50; j++)  ;
}
/*----------------------------*/
led_bl()
{
int i;
for(i=0; i<2; i++)
  {
   wled=0;  delay(50);
   wled=1;  delay(50);
  }
}
/*------------------------------------------------*/
del() /* 100 uS  0.1 mS delay */
{
char  i;
for(i=0; i<50; i++) ;               
}
/*---------------------------(s)*/




void t0isr(void) interrupt 1
{
compare_SBUF();
mov_servo();
TH0=high;
TL0=low;

}

void UART_int(void) interrupt 4

{
if (RI==1)
{
RI=0;
temp0=SBUF;
switch(SBUF)
{

case 0:        servo0_time=5;
                servo1_time=15;
                break;

case 1: servo0_time=15;
                servo1_time=5;
                break;

//case 2:

//case 3:

//case 4:

//case 5:

//case 6:

//case 7:

//case 8:

//case 9:

default: break;

}

temp1=servo0_time;
temp2=servo1_time;
}




}
/*-----------------------*/
mov_servo()
{

//timercounter++;
//  for (tmp=0; tmp < SERVOS; tmp++)
//  {
//      if (timercounter  < servocounts[tmp])
//          servocounts[tmp]=1;
//      else
//          servocounts[tmp]=0;
//  }


if (servo0_time > 0)
   {spu0=1;
        servo0_time--;}
         
else
   spu0=0;

if (servo1_time > 0)
   {spu1=1;
        servo1_time--;}
         
else
   spu1=0;


del();


}
/*------------------(S)*/

compare_SBUF()
{
if (SBUF==temp0)
{


servo0_time=temp1;
servo1_time=temp2;

}
}
/*-----------------(RS232)*/

init_UART()
{
  SCON=0x50;
  TMOD=0x21;
  TH1 =0xFD;
  TH0=high=(65536-20000)/256;
  TL0=low=(65536-20000)%256;


}


/*----------------(RS232)*/
main()
{

spu0=0;
spu1=0;
led_bl();
init_UART();
ET0=1;
ES=1;
EA=1;
TR1=1;
PS=1;


while(1);
}

/*----------------------*/
2#
發表於 2008-4-21 10:36:24 | 只看該作者

同意?上意?~

同意?上兄弟的意?~

-------------------------------------------------------------------------------------------------------------------
浙江老虎機上分器,上海老虎機上分器,江?老虎機上分器,水果機上分器,水果機?控器
3#
發表於 2008-5-23 10:32:37 | 只看該作者
Hi, you do not need to set all the 6 servos in phase simutaneously, you can make the 20ms for each servo by servo.
that means totally 120ms handling for each interrupt. using internal delay routine.

Or you can make some maths. to make delays for all 6 servos as well as the total periods.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-6-22 18:25 , Processed in 0.212104 second(s), 8 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表