【外设移植】Ai-WB2+舵机控制(SG90)

[复制链接]
查看248 | 回复4 | 2024-9-11 12:19:04 | 显示全部楼层 |阅读模式
本帖最后由 King6688 于 2024-9-27 11:18 编辑

SG90舵机介绍:

  首先介绍说一下什么是舵机。舵机是一种位置(角度)伺服的驱动器。适用于一些需要角度不断变化的,可以保持的控制系统。SG90就是舵机的一种。

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

  SG90舵机的工作电压一般为4.8V~ 6V通常使用5V供电,最大扭矩为1.6kg/cm。控制信号采用50Hz PWM脉冲。分为180度版本和360度版本,外观上看180度的内部带挡板,360度的则没有。其有三个引脚,分别是红线(VCC),棕线(GND)和橙线(信号线)。
      SG90.jpg

SG90舵机的注意事项:

使用SG90舵机时需要注意以下事项:

  1. 确保使用的电源符合舵机的工作电压要求。

  2. 确保舵机的接线正确,避免接反或短路等情况。

  3. 在使用过程中,避免超过舵机的工作角度范围,以免损坏舵机。

  4. 在使用过程中,避免过度负载,以免损坏舵机。

  5. 在使用过程中,避免过度震动,以免影响舵机的正常工作。


移植过程:
PWM驱动规则:
  SG90舵机采用50Hz的PWM波驱动,需要的PWM高电平在0.5ms~2.5ms之间,脉冲宽度为20ms:

      SG90角度对应占空比1.jpg                 SG90角度对应占空比.jpg
180度和360度的区别:
  180度的舵机可以控制角度;
  360度的舵机只能控制正反转和速度

驱动逻辑:
180度:
t = 0.5ms————转动 0 °
t = 1.0ms————转动 45°
t = 1.5ms————转动 90°
t = 2.0ms————转动 135°
t = 2.5ms————转动180°

360度:
t = 0.5ms————正转最大转速
t = 1.5ms————不转
t = 2.5ms————反转最大转速

接线:
AI-WB2-32S开发板 SG90
GND 棕线(GND)
5V 红线(VCC)
GPIO4 橙线(信号线)

算法简介:
        PWM 频率 = WB2的BCLK频率80MHz ÷ 分频Divider ÷ 周期Period ,即:80000000 ÷ 80 ÷ 20000 = 50Hz
        // 根据图上的时间,计算出对应的threshold
        /** 占空比,占空比是指高电平在一个周期之内所占的时间比率:
         * 转动0度(-90度)需要的占空比为:   0.5/20 = 2.5%
         * 转动45度(-45度)需要的占空比为:  1.0/20 = 5%
         * 转动90度(-0度)需要的占空比为:  1.5/20 = 7.5%
         * 转动135度(45度)需要的占空比为: 2.0/20 = 10%
         * 转动180度(90度)需要的占空比为: 2.5/20 = 12.5%
         *
         * Period为20000时,带入以上公式,得出对应的高电平时间分别为:
         * 20000 * 0.025 = 500
         * 20000 * 0.05 = 1000
         * 20000 * 0.075 = 1500
         * 20000 * 0.1 = 2000
         * 20000 * 0.125 = 2500
         */
关键代码:
  1.         startServo(SERVO_PIN,500);
  2.         vTaskDelay(pdMS_TO_TICKS(2000));
  3.         PWM_Channel_Disable(SERVO_PIN);
  4.         vTaskDelay(pdMS_TO_TICKS(2000));

  5.         startServo(SERVO_PIN,1000);
  6.         vTaskDelay(pdMS_TO_TICKS(2000));
  7.         PWM_Channel_Disable(SERVO_PIN);
  8.         vTaskDelay(pdMS_TO_TICKS(2000));

  9.         startServo(SERVO_PIN,1500);
  10.         vTaskDelay(pdMS_TO_TICKS(2000));
  11.         PWM_Channel_Disable(SERVO_PIN);
  12.         vTaskDelay(pdMS_TO_TICKS(2000));

  13.         startServo(SERVO_PIN,2000);
  14.         vTaskDelay(pdMS_TO_TICKS(2000));
  15.         PWM_Channel_Disable(SERVO_PIN);
  16.         vTaskDelay(pdMS_TO_TICKS(2000));

  17.         startServo(SERVO_PIN,2500);
  18.         vTaskDelay(pdMS_TO_TICKS(2000));
  19.         PWM_Channel_Disable(SERVO_PIN);
  20.         vTaskDelay(pdMS_TO_TICKS(2000));
复制代码


附上代码: myServo.rar (4.87 KB, 下载次数: 5)

本帖被以下淘专辑推荐:

回复

使用道具 举报

爱笑 | 2024-9-11 13:45:35 | 显示全部楼层
效率不错啊!
用心做好保姆工作
回复 支持 反对

使用道具 举报

iiv | 2024-9-11 19:08:27 | 显示全部楼层
很棒棒
回复

使用道具 举报

粉色小风扇 | 2024-9-12 10:26:30 | 显示全部楼层
很棒棒
回复

使用道具 举报

IBelieve | 2024-9-12 10:34:19 | 显示全部楼层
很棒棒
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则