舵机无法运转,无法接受到数据
思路是想一个中断产生两个PWM,分别给两个舵机,但是估计代码思路有误
晶振11.0592 舵机SG90
不知道有没有什么好的改进方式
代码如下
#include <REGX52.H>
#include <intrins.h>
//舵机信号输入端
#define Sevro_moto_pwm1 P2_7
#define Sevro_moto_pwm2 P2_5
unsigned char pwm_val_left1 = 0;//变量定义
unsigned char pwm_val_left2 = 0;//变量定义
unsigned char push_val_left[2]={20,20};
unsigned int Angle[2]={0x5A,0x5A};
int count=0;
void UART_SendByte(unsigned char Byte)
{
SBUF=Byte;
while(TI==0);
TI=0;;
}
函数名 :UsartInit()
函数功能 :设置串口
void UsartInit() // 9600bps
{
SCON=0X50; //设置为工作方式1
TMOD&=0X0F;
TMOD|=0X20; //计数器工作方式2
PCON=0X7F; //波特率加倍
//PCON &= 0x7F; //波特率不加倍
TH1=0XFD; //计数器初始值设置,波特率是4800
TL1=0XFD;
ES=1; //打开接收中断
ET1 = 0;
EA=1; //总中断
TR1=1; //计数器
}
/*调节push_val_left的值改变舵机占空比 */
void pwm_Servomoto(void)
{
if(count==0)
{
if(pwm_val_left1<=push_val_left[1])
Sevro_moto_pwm1=1;
else
Sevro_moto_pwm1=0;
if(pwm_val_left1>=200)
{
pwm_val_left1=0;
}
}
if(count==1)
{
if(pwm_val_left2<=push_val_left[2])
Sevro_moto_pwm2=1;
else
Sevro_moto_pwm2=0;
if(pwm_val_left2>=200)
{
pwm_val_left2=0;
}
}
}
void time1()interrupt 1 using 2
{
TH0=(65536-100)/256; //100US定时
TL0=(65536-100)%256;
pwm_val_left1++;
pwm_val_left2++;
pwm_Servomoto();
}
void Usart() interrupt 4
{
if(RI==1)
{
Angle[count]=SBUF;//出去接收到的数据
UART_SendByte(Angle[count]);
push_val_left[count]=1/9*Angle[count]+5;
count++;
count%=2;
RI=0;
}
}
void main(void)
{
TMOD=0X21;//根据器件手册选择想要的功能进行设置,我这里同时用了定时器0,1
TH0=(65536-100)/256; //100US
TL0=(65536-100)%256;
ET0= 1;
TR0= 1;//打开计数器
UsartInit();
while(1); /无限循环/
}
用两个变量产生PWM
电脑发送两个数据,分别控制两个舵机(水平方向竖直方向,发送坐标实现定位)