在本教程中,我们将使用 MicroPython中的脉冲宽度调制来控制带有 Raspberry Pi Pico的伺服电机。到目前为止,我们已经学会了如何连接OLED和LCD。除此之外,我们还必须学习如何与Raspberry Pi Pico实现I2C,ADC通信。现在让我们了解脉宽调制的工作原理。
脉宽调制(PWM)是一种改变数字信号幅度以控制需要电源或电力的设备和应用的技术。它通过快速循环数字信号的开和关相位并改变“导通”阶段或占空比的广度,从电压分量的角度有效地调节输送到器件的功率量。对于设备,这将显示为恒定功率输入,其平均电压值由导通时间的比例决定。占空比表示为完全
(100%) 开启的百分比。
下图表示占空比为 50% 的 PWM
信号。我们可以通过将占空比从0%改变到100%来控制PWM信号的“导通时间”。我们将通过改变特定PWM信号的占空比来控制伺服电机。一个周期是PWM信号的完整ON和OFF时间,如上图所示。PWM 信号的频率决定了 PWM 完成一个周期的速度。计算频率的公式如下
Frequency = 1/Time Period Time Period = On time + Off time
通常,微控制器产生的PWM信号约为500
Hz,这种高频将用于逆变器或转换器等高速开关设备。但并非所有应用都需要高频。例如,要控制伺服电机,我们需要产生频率为50Hz的PWM信号,因此PWM信号的频率也可以通过程序控制所有微控制器。
伺服电机的连接非常简单。我们知道伺服电机有三根电线。黑色或棕色线用于接地,红色线用作VCC,黄色或橙色线用于提供脉冲信号。在电路图中,您可以看到我们已经将伺服的VCC与Pico板的VBUS引脚连接起来。伺服电机的信号引脚已与皮科板的GPIO0连接,舵机的接地引脚已连接到皮科板的接地针。
打开“ T6_How使用Pico控制伺服电机” 文件夹。在此文件夹中,您可以找到“ 代码 ”文件夹。在Thonny编辑器中打开 “main.py” python文件。现在,让我们讨论一下 main.py 文件。
from machine import Pin, PWM
from time import sleep
首先,我们需要如上所述从 machine.py 库中导入 Pin() 和 PWM() 类。在我们之前的教程中,我们已经多次使用机器库,希望您现在熟悉机器库。Pin() 用于声明伺服电机的信号引脚。
pwm = PWM(Pin(0))
pwm.freq(50)
当我将伺服电机的信号引脚连接到 Pico 板的 GPIO0 时,我声明了 Pin(0) 并将该引脚设置为 PWM,方法是将其传递到 PWM() 函数中。pwm 变量在这里用作对象。然后我使用 pwm.freq(50) 将频率指定为 50Hz。
#Function to set an angle
#The position is expected as a parameter
def setServoCycle (position):
pwm.duty_u16(position)
sleep(0.01)
setServoCycle(position) 函数可用于通过将位置参数从 1000 传递到 9000 来设置伺服的位置。duty_u16的值以微秒为单位,而不是以度为单位。伺服值 1000-9000 表示 0-180 度。
while True:
for pos in range(1000,9000,50):
setServoCycle(pos)
for pos in range(9000,1000,-50):
setServoCycle(pos)
在上面的 while 循环中,我使用了两个 for 循环。第一个用于将伺服位置从 0 设置为 180,即 1000 到 9000,第二个 for 循环用于将伺服位置从 180 设置为 0,即 9000 到 1000。现在,在Thonny IDE中,打开 “main.py” 文件。首先,通过按键盘上的“ctrl+shift+s”键将**“main.py”文件保存在** Pico 板上。在保存文件之前,请确保您的 Pico 板已连接到笔记本电脑 。保存代码时,会出现一个弹出窗口,如下图所示,您必须先 选择树莓派 Pico ,然后将 文件命名为“main.py” 并 保存 。此过程使您能够在 Pico 打开时运行该程序。
当您在微微板上上传并运行代码时,您将看到伺服器从 0 到 180 度和 180 到 0 度连续旋转。
from time import sleep
from machine import Pin
from machine import PWM
pwm = PWM(Pin(0))
pwm.freq(50)
#Function to set an angle
#The position is expected as a parameter
def setServoCycle (position):
pwm.duty_u16(position)
sleep(0.01)
while True:
for pos in range(1000,9000,50):
setServoCycle(pos)
for pos in range(9000,1000,-50):
setServoCycle(pos)
更多回帖