摇杆控制舵机转动角度
#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;
}
仅供参考
|