这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 舵机控制——一篇就够

共13条 1/2 1 2 跳转至

舵机控制——一篇就够

高工
2022-03-03 09:08:47     打赏

来看文章的都是想快速学会使用的,咱们挑重点的说


【舵机有多种,本文仅介绍固定180度舵机(MG996R舵机、SG90舵机、MG90S舵机等)】


image.png


红色 棕色 黄色

VCC GND 信号线

2.如何让舵机转动起来?

舵机的转动角度跟输入脉冲有关,详细看下表:


 image.png            


脉冲总周期20ms

角度 高电平 低电平

0 0.5ms 19.5ms

45 1ms 19ms

90 1.5ms 18.5ms

135 2ms 18ms

180 2.5ms 17.5ms

          可以发现一个规律:角度每次增加45度,高电平时间相应增加0.5ms


          总周期 - 高电平脉冲 = 低电平脉冲


         舵机角度的转动就是通过高、低脉冲的变化实现的


知道了规律,这下子我们可以来写代码了↓ 


#include <regx51.h>

 

sbit PWM=P1^1;  //定义给舵机信号线接的I/O口

 

void Delay(unsigned char i)   //12MHz 延时函数  

{

    unsigned char a,b;        //该段延时函数Delay(1)=0.5ms

    for(;i>0;i--)

      for(b=71;b>0;b--)

        for(a=2;a>0;a--);

}

 

/****************************************************************

                            总周期20ms

                通过调节占空比实现舵机需要转动的角度

舵机代码用定时器控制更方便稳定,本文方便读者了解使用,使用延时计算

                         其功能可正常使用

*****************************************************************/

void zero(void) //0度 子程序

{   

        PWM=1;

        Delay(1);       //高电平 Delay(1)=0.5ms。因为周期为20ms,所以低电平就是19.5ms 

        PWM=0;

        Delay(39);      //低电平 Delay(39)=19.5ms

}

 

void one(void) //45度 子程序

{

        PWM=1;

        Delay(2);      //高电平  Delay(2)=1ms

        PWM=0;   

        Delay(38);     //低电平  Delay(38)=19ms

}

 

void two(void)  //90度 子程序

{

         PWM=1;

        Delay(3);       //高电平 Delay(3)=1.5ms

        PWM=0;

        Delay(37);     //低电平  18.5ms

}

 

void three(void) //135度 子程序

{

        PWM=1;

        Delay(4);       //高电平 Delay(4)=2ms

        PWM=0;

        Delay(36);      //低电平 18ms

}

 

void four(void) //180度 子程序

{

        PWM=1;

        Delay(5);      //高电平 Delay(5)=2.5ms

        PWM=0;

        Delay(35);     //低电平 17.5ms

}

 

 

void main()  //主程序

{     

    while(1)

    {    

         two();     //调用90度的子程序,实现舵机转动90度

    }

}

 

//end

如果需要按键控制,可以通过改变主程序代码实现,如↓ 


void main()

{     

while(1)

{

         if(P3_1==0)   //按键接P3^1口。如果按键按下

{

  /* Delay(20);   //10ms的按键消抖,可删,看需要添加。

if(P3_1==0)    */

             two();  //如果按键按下,调用舵机90度子程序,实现转动90度。  

}

 

else         //否则

    zero();   //舵机为0度

    }

}

PS:建议写代码时先写一个0度的程序,先确定舵机0度位置,方便确定舵机转动的方向和角度





关键词: 舵机     控制    

专家
2022-03-03 09:19:12     打赏
2楼

谢谢分享


高工
2022-03-03 09:40:33     打赏
3楼

好东西!谢谢楼主分享!


工程师
2022-03-10 22:01:53     打赏
4楼

谢谢了


专家
2022-03-10 22:27:37     打赏
5楼

看看 


高工
2022-03-11 08:40:50     打赏
6楼

顶楼主,谢谢楼主无私分享!


专家
2022-03-11 10:25:43     打赏
7楼

谢谢分享


高工
2022-03-11 23:53:47     打赏
8楼

学到了


专家
2022-03-12 03:22:51     打赏
9楼

谢谢了


菜鸟
2022-03-12 06:50:03     打赏
10楼

十分感谢


共13条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]