RookieC 发表于 2022-11-14 09:33:57

BPI-PicoW-S3 PWM控制舵机[CircuitPython]


https://forum.banana-pi.org.cn/uploads/default/optimized/2X/b/bd27a897a352fc58cb42271a597ab207b8b2e012_2_690x174.jpegBPI-Pico-S3 与 Raspberry Pi Pico 板尺寸相同,搭载ESP32S3芯片,8M flash,4层PCB,电镀半孔工艺,陶瓷天线,支持 2.4 GHz Wi-Fi 和 Bluetooth® LE 双模无线通信,是一款专为物联网开发和Maker DIY设计的开发板。出厂内置 tinyUF2 + CircuitPython,推荐使用Mu编辑器上手CircuitPython开发。BiliBili视频 https://www.bilibili.com/video/BV1CD4y1t79b/?share_source=copy_web&vd_source=fe857309245dbfd6ed5125b959d43261硬件接口示意图https://forum.banana-pi.org.cn/uploads/default/optimized/2X/8/8c67557dd471abc554140825684fc4710196ee87_2_674x500.jpegPWM控制舵机https://forum.banana-pi.org.cn/uploads/default/original/2X/1/16cb9ca4673ae4a40a4d32ee5c63bfbcc312112e.jpeg以MG90S舵机为例,其他各种舵机参考其对应的使用手册,在以下代码中修改相应的参数。
[*]MG90S舵机关键参数:
[*]控制角度,0° ~ 180°
[*]PWM 占空时长控制,500us ~ 2500us 对应 0° ~ 180°
[*]工作电压:4.8V 至 6V(典型值为 5V)
[*]失速扭矩:1.8 kg/cm (4.8V)
[*]最大失速扭矩:2.2 kg/cm (6V)
[*]工作速度为 0.1s/60° (4.8V)


[*]求取任意一个旋转角度所需的占空时长的表达式为:
设y为占空时长,x为旋转角度
y=(2500-500)/180*x+500
y=(100*x+4500)/9
[*]根据参数,可以确定舵机角度由PWM波的高电平持续时长所控制,且由于舵机的控制必须由周期性的PWM波形控制,所以一个周期时长必须超过控制此舵机达到180°所需的占空时长,即超过2500us,则PWM频率要低于400hz。

[*]设定PWM频率为200hz,则周期时长为5000us,对应控制此舵机旋转 0° ~ 180°的占空比为10% ~ 50% 。

[*]CircuitPython的PWM占空比控制精度为16bit,100%占空比在 2进制中表达为 1111 1111 1111 1111,16进制表达为 FFFF,10进制表达为 65535。

[*]求取任意一个旋转角度所需的占空比的表达式为:
设y为占空比,x为旋转角度
y=((50-10)/180*x+10)/100*65535
y=(4369*x+196605)/30
[*]MG90S舵机与BPI-PicoW-S3的接线方式:
BPI-PicoW-S3的VBUS引脚可输出+5V;除GP0以外,所有GP引脚都可以用于输出PWM,仅需在程序中修改到对应引脚即可。
MG90SBPI-PicoW-S3
GND 棕色GND
+5V 红色VBUS
PWM 橙色GP0

[*]根据以上表达式与参数设计一个可以任意控制此舵机旋转角度的程序:
import board
import pwmio
import time
servo_1 = pwmio.PWMOut(board.GP0, frequency=200, duty_cycle=0)#200hz, one cycle 5000us

def get_duty_cycle(x):
    return int((4369*x+196605)/30)

servo_1.duty_cycle = get_duty_cycle(90)# 90 degrees
[*]通过一个逻辑分析仪可以读出此程序所控制输出的PWM占空时长,与计算的数值应当相符。
https://forum.banana-pi.org.cn/uploads/default/original/2X/6/64909b3bf01fade67c7f2a05d3fd1c97a70d3325.pnghttps://forum.banana-pi.org.cn/uploads/default/original/2X/4/4774c88ab9511ce126dc556dfb52a5fcf826dac7.png
[*]使用列表设计一套连续的舵机动作:
import board
import pwmio
import time
servo_1 = pwmio.PWMOut(board.GP0, frequency=200, duty_cycle=0)#200hz, one cycle 5000us

def get_duty_cycle(x):
    return int((4369*x+196605)/30)

action_list1 =

while True:
    for i in action_list1:
      servo_1.duty_cycle = get_duty_cycle(i)
      time.sleep(0.5)BPI-PicoW-S3 + CircuitPython 教程聚合链接:https://forum.banana-pi.org.cn/t/topic/3986?u=wind_BPI-PicoW-S3 wiki 页面:https://wiki.banana-pi.org/BPI-PicoW-S3
购买BPI-PicoW-S3:
[*]比派科技官方速卖通店铺:https://www.aliexpress.com/item/1005004775634442.html

[*]SinoVoip 官方速卖通店铺:https://www.aliexpress.com/item/1005004775859077.html

[*]官方淘宝店铺:https://item.taobao.com/item.htm?spm=a2126o.success.0.0.25b04831CHV1Nc&id=684134360199

[*]OEM&OEM 定制服务: [email protected]

页: [1]
查看完整版本: BPI-PicoW-S3 PWM控制舵机[CircuitPython]