打印
[范例教程]

用单片机控制SG90舵机

[复制链接]
503|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
i1mcu|  楼主 | 2023-7-15 22:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.舵机:舵机是一种位置(角度)伺服的驱动器,适用那些需要角度不断变化并可以保持的控制系统。舵机只是一种通俗的叫法,其实质是一个伺服马达

2.模拟舵机:需要不断的发送目的地PWM信号,才能旋转到指定位置。例如:我现在让它旋转90度,我就需要不断的发送90度的PWM信号直到到达指定位置才能停止。

3.数字舵机:只需给一个目的地PWM信号,即可旋转到指定位置。例如:我现在让它旋转90度,我只需要发送一次90度的PWM信号,它就可以旋转到90度。

4.PWM信号:PWM(脉冲宽度调制)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。那么什么叫PWM信号呢,笔者就简单的谈一下自己的看法,我们都知道,我们所使用的单片机都是数字电路,它的I/O口只有两种状态,那就是高电平1,低电平0知道了这些之后,我们通过控制微处理器输出1-0-1-0-1-0-1-0……如此循环往复,就成为下图1所示的情况,这就是PWM信号。

1.PWM信号
5.占空比高电平(或者低电平)占整个周期的时间就叫作占空比。

6.PWM频率PWM频率是指每秒钟信号从高电平到低电平再到高电平的次数。
工作原理  理解以上的概念,对我们接下来的学习是非常有必要的,**大家能好好掌握上面的概念。
我所使用的SG90舵机,如下图2所示

2
接线方法
          红-------------------------VCC
          棕色----------------------GND
          橙色----------------------信号线

原理:舵机内部有一个基准电压,微处理器产生的PWM信号通过信号线进入舵机产生直流偏置电压,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。当舵机开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。

重点:作为一个单片机编写者,具体的原理,我们不必要搞清楚,我们只需知道如何控制它即可,以下将讲解如何控制舵机运转。

第一步:我们需要使用单片机产生周期为20ms,高电平t等于0.5ms-2.5ms之间的这样一个方波。定时器+中断产生这样的方波。
高电平在一个周期20ms的持续时间对应的舵机角度,如下图所示。
高电平t占整个周期T(20ms)的时间
舵机旋转的角度
0.5ms
0度
1ms
45度
1.5ms
90度
2ms
135度
2.5ms
180度
第二步:简单讲一下编程思想吧,我所使用的是方法是定时器+中断,定时器每0.5ms中断一次,需要中断40次才能达到20ms。我们此时需要一个全局变量来记录中断的次数,当中断达到40次时,全局变量重新清零。当中断次数小于a时,信号线输出高电平,否则输出零。此时a的值对应关系如下(1--0度,2--45度,3--90度,4--135度,5--180度)。
第三步:着重讲程序中一个语句的含义

为什么此处要此处a==16,a==32,首先,这个值是我一步步测试出来的,如果你看见源程序的话,上面有详细的介绍,此处不再赘述。
我们知道SG90是一个模拟舵机,需要不断的给出信号才能到达指定的位置。到达这个位置并不是一蹴而就的,它需要时间,实际上面的a==16,相当于延时,这段时间刚好能够让舵机达到指定的位置,然后在接收下一个回摆程序。a==32,是因为我需要让它来回摆动的时间对称,所以才用a==32的。有兴趣的可以改变a的值,观察一下具体的情况。
sbit SG_PWM=P0^0;
unsigned char count=0;
unsigned char PWM_count=3;                  //1--0度,2--45度,3--90度,4--135度,5--180度
unsigned char a=0;
void Timer_Init()
{
  TMOD=0X01;      //T0定时方式1
  TH0=0Xfe;
  TL0=0X33;       //计数初值设置为0.5ms
  ET0=1;          //打开定时器0的中断
  TR0=1;          //打开定时器0
  EA=1;           //开总中断
}
void Timer() interrupt 1      //特别注意此处,0--外部中断0,1--定时器中断0,2--外部中断1,3--定时器中断1,4--串行口中断1
{
  TR0=0;
  TH0=0Xfe;
  TL0=0X33;       //重新赋计数初值为0.5ms
  if(count<=PWM_count)
  {
    SG_PWM=1;
  }
  else
  {
    SG_PWM=0;
  }
  count++;
  if(count>=40)
  {
    count=0;
    a++;
  }
  TR0=1;
}
void main()
{
  Timer_Init();
  while(1)
  {
      if(a==16)                             //20是比较舒服的连贯动作,20以上动作些许不连贯  10的时候出现打架情况,15的时候打架几乎没有,16比较完美
      {
        PWM_count=1;
      }
      if(a==32)
      {
              PWM_count=3;
        a=0;
      }
  }
}


使用特权

评论回复
沙发
gygp| | 2023-7-22 17:12 | 只看该作者
可以使用传感器或其他方式,检测舵机的状态,以便及时调整控制策略和修正错误。

使用特权

评论回复
板凳
eefas| | 2023-7-22 19:14 | 只看该作者
通常需要设置脉宽的占空比来控制舵机的位置。

使用特权

评论回复
地板
youtome| | 2023-7-22 19:27 | 只看该作者
SG90舵机通常采用PWM(脉宽调制)信号进行控制。

使用特权

评论回复
5
iyoum| | 2023-7-22 19:52 | 只看该作者
保护舵机和单片机,建议添加适当的电源滤波和电流限制电路,避免过电压和过电流的情况发生。

使用特权

评论回复
6
burgessmaggie| | 2023-7-22 20:12 | 只看该作者
通过改变PWM信号的脉宽占空比,你可以控制舵机的位置。通常,SG90舵机的脉宽范围为0.5ms到2.5ms,其中0.5ms对应舵机的最小位置,2.5ms对应舵机的最大位置。你可以根据需求逐步改变脉宽占空比,使舵机转动到期望的位置。

使用特权

评论回复
7
eefas| | 2023-7-23 07:26 | 只看该作者
根据设定的PWM周期和分辨率,在每个周期内改变PWM信号的脉宽,以使舵机转动到所需的角度。可以使用定时器的比较匹配功能或定时器溢出中断来实现。

使用特权

评论回复
8
yorkbarney| | 2023-7-23 08:06 | 只看该作者
在主循环中设置舵机的位置。通过改变PWM信号的脉宽来控制舵机的位置。可以使用定时器/计数器来生成所需的PWM信号。

使用特权

评论回复
9
olivem55arlowe| | 2023-7-23 08:26 | 只看该作者
通过调整PWM信号的脉宽和周期,微调舵机的位置和运动速度,确保舵机按预期进行控制。

使用特权

评论回复
10
mollylawrence| | 2023-7-23 16:31 | 只看该作者
初始化单片机的GPIO引脚,并配置为输出模式。选择一个合适的GPIO引脚作为舵机的控制引脚。

使用特权

评论回复
11
sesefadou| | 2023-7-23 17:08 | 只看该作者
需要确定单片机的PWM输出电平范围和频率,以与SG90舵机的要求相匹配。

使用特权

评论回复
12
10299823| | 2023-7-23 17:24 | 只看该作者
8位单片机的计算能力相对较低,可能无法实现复杂的控制算法或同时控制多个舵机。

使用特权

评论回复
13
belindagraham| | 2023-7-23 17:38 | 只看该作者
单片机的计算能力和定时器/计数器的精度可能会对舵机控制的稳定性和精度产生影响。

使用特权

评论回复
14
wwppd| | 2023-7-23 17:54 | 只看该作者
将舵机的信号线连接到单片机的一个数字输出引脚。确保使用合适的电平转换电路(如电平转换器或电阻分压器),以将单片机的输出电平转换为舵机所需的电平(通常为5V)。

使用特权

评论回复
15
febgxu| | 2023-7-23 18:03 | 只看该作者
选择PWM参数,提供足够的计算资源和时间来处理舵机控制任务。

使用特权

评论回复
16
hilahope| | 2023-7-23 18:13 | 只看该作者
可以使用PWM(脉冲宽度调制)信号来控制舵机

使用特权

评论回复
17
geraldbetty| | 2023-7-23 19:48 | 只看该作者
对控制系统进行初始化,包括设置单片机的时钟频率、初始化外设和设置舵机控制模式等。

使用特权

评论回复
18
averyleigh| | 2023-7-23 21:03 | 只看该作者
确定合适的PWM周期和分辨率。PWM周期决定了舵机的刷新频率,分辨率决定了舵机的角度精度。

使用特权

评论回复
19
bestwell| | 2023-7-23 21:55 | 只看该作者
要确保控制信号的稳定性和精确性,避免信号干扰或抖动。

使用特权

评论回复
20
sdlls| | 2023-7-23 22:22 | 只看该作者
SG90舵机通常采用PWM(脉宽调制)信号来进行控制,输入的PWM信号脉宽范围一般为0.5ms到2.5ms,对应角度范围通常为0°到180°。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

271

主题

8405

帖子

9

粉丝