搖桿控制舵機轉動角度
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include<stdio.h>
#include "delay.h"
#include "i2c.h"
/*********
舵機的控制一般需要一個20ms左右的時基脈沖,
該脈沖的高電平部分一般為0.5ms~2.5ms范圍內的角度控制脈沖部分。
以180度角度伺服為例,那么對應的控制關系是這樣的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
***********/
sbit motor=P1^0;
unsigned char num=1;
unsigned long time_20ms=0; //定時器計數
void Init_Timer0(void);
unsigned int moTimHigh,moTimlow; //電機控制 高低電平處理時間
unsigned char dealAdVal = 0; //ad處理值
unsigned char remAdVal = 0; //記錄上一次ad值
void main (void)
{
Init_Timer0(); //定時器0初始化
DelayMs(20); //延時有助于穩定
while (1) //主循環
{
dealAdVal =ReadADC(0); //ADtemp的取值范圍是0-255,定時的時間范圍是0.5-2.5ms
if(dealAdVal>remAdVal) //取 前后兩次ad采集值差值
{
if((dealAdVal-remAdVal)>10)//偏轉較大位置
{
remAdVal = dealAdVal ;//ad記錄
}
}
else
{
if((remAdVal-dealAdVal)>10)//偏轉較大位置
{
remAdVal = dealAdVal ;//ad記錄
}
}
//從上述12M計算公式可以換算出11.0592M計算方式
moTimHigh=(65535-500.0*0.9216)-(2000.0*0.9216/255.0)*ReadADC(0); //11.0596M情況下 11.0596/12=0.9216
moTimlow=(65535-19500.0*0.9216)+(2000.0*0.9216/255.0)*ReadADC(0); //11.0596M情況?
DelayMs(10);
}
}
void Init_Timer0()
{
//**All notes can be deleted and modified**//
TMOD |= 0x10; //定時器設置 0.1ms in 11.0592M crystal
// TH0=(65536-78)/256;
// TL0=(65536-78)%256; //定時0.1mS
ET0=1;//定時器中斷打開
EA=1;//總中斷
TR0=1; //啟動定時器0
}
void T0_time() interrupt 1
{
static unsigned char count;
if (!count)
{
motor = 1; //給高電平
TH0=moTimHigh/256;
TL0=moTimHigh%256;
}
else
{
motor=0 ;
TH0=moTimlow/256;
TL0=moTimlow%256;
}
count=~count;
}
僅供參考
|