舵机的控制原理


项目介绍

舵机是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。舵机有很多规格,但所有的舵机都有外接三根线。由于舵机品牌不同,颜色也会有所差异,我们实验用到的这款舵机分别用棕、红、橙三种颜色进行区分,棕色为接地线,红色为电源正极,橙色为信号线。

舵机结构图 舵机结构图

舵机分为360度舵机、180度舵机和90度舵机,我们实验用到的这款舵机为90度舵机,但是它转动的角度范围最大接近180度,所以我们也可把它当做180度舵机使用,控制原理都是一样的。

舵机类型图

模块参数

工作电压DC 3.3 ~ 5V
工作温度-10°C ~ +50°C
尺寸32.25 x 12.25 x 30.42 mm
接口间距为2.54 mm 3pin接口

模块原理图

舵机模块原理图

舵机的控制信号是周期为20ms (50Hz)的PWM(脉冲宽度调制)信号。
舵机的转动的角度是通过调节PWM信号的占空比来实现的,一般在 0.5ms ~ 2.5ms 的范围内去控制,总间隔为 2ms,相对应舵盘的位置为0度 ~ 180度,呈线性变化。当脉冲宽度为 1.5ms 时,舵机旋转至中间角度,大于 1.5ms 时舵机旋转角度增大,小于 1.5ms 时舵机旋转角度减小。
也就是说,舵机的控制需要单片机产生一个周期为20ms的脉冲信号,以0.5ms到2.5ms的高电平来控制舵机转动的角度。具体脉冲参数下图所示:

舵机PWM控制原理图
注意事项:
1. 由于舵机品牌不同,对于同一信号,不同品牌的舵机旋转的角度也会有所不同。

实验组件

ESP32 Plus主板
ESP32 Plus主板 x1
9G 180度数字舵机
9G 180度数字舵机 x1
USB线
USB线 x1

实验①

舵机实验1接线图

代码

from machine import Pin, PWM
import time
pwm = PWM(Pin(4))
pwm.freq(50)

'''
Duty cycle corresponding to the Angle
0°----2.5%----25
45°----5%----51.2
90°----7.5%----77
135°----10%----102.4
180°----12.5%----128
'''

angle_0 = 25
angle_90 = 77
angle_180 = 128

while True:
pwm.duty(angle_0)
time.sleep(1)
pwm.duty(angle_90)
time.sleep(1)
pwm.duty(angle_180)
time.sleep(1)

实验结果

按照接线图正确接好模块,用USB线连接到计算机上电,单击 运行按钮 来执行程序代码。代码开始执行,舵机由0度转到90度,停顿1秒;再转到180度,停顿1秒;然后回到0度,停顿1秒,循环转动。
单击 停止按钮 或 Ctrl+C 退出程序。

实验②

舵机实验2接线图

代码

from utime import sleep
from machine import Pin
from machine import PWM

pwm = PWM(Pin(4)) #舵机销连接GP4
pwm.freq(50) #20ms周期,所以频率为50Hz
'''
Duty cycle corresponding to the Angle
0°----2.5%----25
45°----5%----51.2
90°----7.5%----77
135°----10%----102.4
180°----12.5%----128
'''

### 设置伺服旋转角度
def setServoCycle (position):
pwm.duty(position)
sleep(0.01)

### 将旋转角度转换为占空比
def convert(x, i_m, i_M, o_m, o_M):
return max(min(o_M, (x - i_m) * (o_M - o_m) // (i_M - i_m) + o_m), o_m)

while True:
for degree in range(0, 180, 1): #伺服电机从0到180
pos = convert(degree, 0, 180, 20, 150)
setServoCycle(pos)

for degree in range(180, 0, -1): #伺服电机从180到0
pos = convert(degree, 0, 180, 20, 150)
setServoCycle(pos)

实验结果

按照接线图正确接好模块,用USB线连接到计算机上电,单击 运行按钮 来执行程序代码。代码开始执行,舵机在0度 ~ 180度之间来回转动,每15ms转动一度。

代码说明

代码说明
pwm.duty(angle_0)根据信号脉宽的角度换算成占空比,公式为:2.5+角度/180*10 ,以ESP32的 PWM 引脚解析度为 2^10 = 1024,换算成 0 度时,其占空比值为 1024 * 2.5% = 25.6 ,当角度为180度时,其占空比值为1024 * 12.5% = 128,这两个值会跟程序有关,考虑到误差及转动角度,将占空比定在10与150 之间,可以让舵机顺利转动0~180度。
convert(degree, 0, 180, 20, 150)传进来一个需要转动的角度值为degree,然后这个值的范围是0度到180度,我们要映射的占空比范围为20到150,即把0到180转到了10到150然后被返回了,返回的数据类型为整型,余数会被截断,不进行四舍五入或平均。