Made in heaven!! 2022-04-12 16:28 采纳率: 80%
浏览 204
已结题

51单片机串口控制两个舵机发送数据进行定位

舵机无法运转,无法接受到数据
思路是想一个中断产生两个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
电脑发送两个数据,分别控制两个舵机(水平方向竖直方向,发送坐标实现定位)

  • 写回答

5条回答 默认 最新

  • 键鼠亦有温度 2022-04-12 17:04
    关注

    如果单片机有PWM端口的话就用PWM端口进行舵机控制,用定时器并不是很好的选择。还有做事不要着急,一步一步来,可以先调通串口,然后再调PWM,一下全写了哪里出问题都不好查

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 4月23日
  • 已采纳回答 4月15日
  • 修改了问题 4月12日
  • 创建了问题 4月12日

悬赏问题

  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿