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

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,一下全写了哪里出问题都不好查

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 杨佳啊 2022-04-12 18:01
    关注
    1. 我记得我当时做的时候好像用的是外部中断方式,芯片采用的是stc89c52, 它有俩个专门的中断输出口,
    2. 你可以用示波器看下你代码里面的俩个pwm 输出口的波形是否正常,如果不正常,建议按照我上面的来做.如果波形正常的话,看下驱动电流够不够,不够的话,要买驱动板,当然自己搞个电池然后与单片机共地,舵机正负接电池,这样应该也是可以的.
      这个是三四年之前做的了,如果有需要我之前电路图和源码私聊
    评论
  • tnt1314 2022-04-12 18:25
    关注

    串口通讯可以用串口调试助手查看数据的,先调试一个,正常了再+另一个,一步步调,注意舵机通讯地址不要重复了

    评论
  • 无夜_ 2022-04-14 09:15
    关注

    使用两个串口的话可以考虑多线程里处理每个收发,单串口的话可以多线程发,收在一个线程里,采用事件通知机制

    评论
  • 工控匠 2022-04-13 09:55
    关注

    使用pwm进行控制,准确。简单的功能可以使用arduino进行实现,简单快捷

    评论
查看更多回答(4条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 相同型号电脑与配置,发现主板有一台貌似缺少了好多元器件似的,会影响稳定性和使用寿命吗?
  • ¥15 要求编写稀疏矩阵A的转置矩阵的算法
  • ¥15 编写满足以下要求的停车场管理程序,设停车场只有一个可停放n辆车的狭窄通道且只有一个大门可供车辆进出。
  • ¥20 powerbulider 导入excel文件,显示不完整
  • ¥15 用keil调试程序保证结果进行led相关闪烁
  • ¥15 paddle训练自己的数据loss降不下去
  • ¥20 用matlab的pdetool解决以下三个问题
  • ¥15 单个福来轮的平衡与侧向滑动是如何做到的?
  • ¥15 嵌入式Linux固件,能直接告诉我crc32校验的区域在哪不,内核的校验我已经找到了,uboot没有
  • ¥20 h3c静态路要求有详细过程