[范例教程] 用单片机控制SG90舵机

[复制链接]
2534|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的值,观察一下具体的情况。
  1. sbit SG_PWM=P0^0;
  2. unsigned char count=0;
  3. unsigned char PWM_count=3;                  //1--0度,2--45度,3--90度,4--135度,5--180度
  4. unsigned char a=0;
  5. void Timer_Init()
  6. {
  7.   TMOD=0X01;      //T0定时方式1
  8.   TH0=0Xfe;
  9.   TL0=0X33;       //计数初值设置为0.5ms
  10.   ET0=1;          //打开定时器0的中断
  11.   TR0=1;          //打开定时器0
  12.   EA=1;           //开总中断
  13. }
  14. void Timer() interrupt 1      //特别注意此处,0--外部中断0,1--定时器中断0,2--外部中断1,3--定时器中断1,4--串行口中断1
  15. {
  16.   TR0=0;
  17.   TH0=0Xfe;
  18.   TL0=0X33;       //重新赋计数初值为0.5ms
  19.   if(count<=PWM_count)
  20.   {
  21.     SG_PWM=1;
  22.   }
  23.   else
  24.   {
  25.     SG_PWM=0;
  26.   }
  27.   count++;
  28.   if(count>=40)
  29.   {
  30.     count=0;
  31.     a++;
  32.   }
  33.   TR0=1;
  34. }
  35. void main()
  36. {
  37.   Timer_Init();
  38.   while(1)
  39.   {
  40.       if(a==16)                             //20是比较舒服的连贯动作,20以上动作些许不连贯  10的时候出现打架情况,15的时候打架几乎没有,16比较完美
  41.       {
  42.         PWM_count=1;
  43.       }
  44.       if(a==32)
  45.       {
  46.               PWM_count=3;
  47.         a=0;
  48.       }
  49.   }
  50. }


gygp 发表于 2023-7-22 17:12 | 显示全部楼层
可以使用传感器或其他方式,检测舵机的状态,以便及时调整控制策略和修正错误。
eefas 发表于 2023-7-22 19:14 | 显示全部楼层
通常需要设置脉宽的占空比来控制舵机的位置。
youtome 发表于 2023-7-22 19:27 | 显示全部楼层
SG90舵机通常采用PWM(脉宽调制)信号进行控制。
iyoum 发表于 2023-7-22 19:52 | 显示全部楼层
保护舵机和单片机,建议添加适当的电源滤波和电流限制电路,避免过电压和过电流的情况发生。
burgessmaggie 发表于 2023-7-22 20:12 | 显示全部楼层
通过改变PWM信号的脉宽占空比,你可以控制舵机的位置。通常,SG90舵机的脉宽范围为0.5ms到2.5ms,其中0.5ms对应舵机的最小位置,2.5ms对应舵机的最大位置。你可以根据需求逐步改变脉宽占空比,使舵机转动到期望的位置。
eefas 发表于 2023-7-23 07:26 | 显示全部楼层
根据设定的PWM周期和分辨率,在每个周期内改变PWM信号的脉宽,以使舵机转动到所需的角度。可以使用定时器的比较匹配功能或定时器溢出中断来实现。
yorkbarney 发表于 2023-7-23 08:06 | 显示全部楼层
在主循环中设置舵机的位置。通过改变PWM信号的脉宽来控制舵机的位置。可以使用定时器/计数器来生成所需的PWM信号。
olivem55arlowe 发表于 2023-7-23 08:26 | 显示全部楼层
通过调整PWM信号的脉宽和周期,微调舵机的位置和运动速度,确保舵机按预期进行控制。
mollylawrence 发表于 2023-7-23 16:31 | 显示全部楼层
初始化单片机的GPIO引脚,并配置为输出模式。选择一个合适的GPIO引脚作为舵机的控制引脚。
sesefadou 发表于 2023-7-23 17:08 | 显示全部楼层
需要确定单片机的PWM输出电平范围和频率,以与SG90舵机的要求相匹配。
10299823 发表于 2023-7-23 17:24 | 显示全部楼层
8位单片机的计算能力相对较低,可能无法实现复杂的控制算法或同时控制多个舵机。
belindagraham 发表于 2023-7-23 17:38 | 显示全部楼层
单片机的计算能力和定时器/计数器的精度可能会对舵机控制的稳定性和精度产生影响。
wwppd 发表于 2023-7-23 17:54 | 显示全部楼层
将舵机的信号线连接到单片机的一个数字输出引脚。确保使用合适的电平转换电路(如电平转换器或电阻分压器),以将单片机的输出电平转换为舵机所需的电平(通常为5V)。
febgxu 发表于 2023-7-23 18:03 | 显示全部楼层
选择PWM参数,提供足够的计算资源和时间来处理舵机控制任务。
hilahope 发表于 2023-7-23 18:13 | 显示全部楼层
可以使用PWM(脉冲宽度调制)信号来控制舵机
geraldbetty 发表于 2023-7-23 19:48 | 显示全部楼层
对控制系统进行初始化,包括设置单片机的时钟频率、初始化外设和设置舵机控制模式等。
averyleigh 发表于 2023-7-23 21:03 | 显示全部楼层
确定合适的PWM周期和分辨率。PWM周期决定了舵机的刷新频率,分辨率决定了舵机的角度精度。
bestwell 发表于 2023-7-23 21:55 | 显示全部楼层
要确保控制信号的稳定性和精确性,避免信号干扰或抖动。
sdlls 发表于 2023-7-23 22:22 | 显示全部楼层
SG90舵机通常采用PWM(脉宽调制)信号来进行控制,输入的PWM信号脉宽范围一般为0.5ms到2.5ms,对应角度范围通常为0°到180°。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

279

主题

8835

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部