• ESP32使用PWM实现对舵机的控制


    二、什么是舵机

    舵机是伺服电机的一种,伺服电机就是带有反馈环节的电机,我们可以通过伺服电机进行精确的位置控制或者输出较高的扭矩;
    一般舵机的旋转范围是0°~ 180°。舵机是由可变宽度的脉冲控制。脉冲的参数有最小值、最大值和频率。一般而言,舵机的基准信号周期为20ms,所以频率为50kHz。脉冲宽度和舵机的转角0°~ 180°相对应的。舵机转动角度与占空比的关系:

    List item

    二、PWM对舵机的控制
    舵机的控制就是通过一个固定的频率,给其不同的占空比的,来控制舵机不同的转角

    舵机的频率一般为频率为50HZ,也就是一个20ms左右的时基脉冲,而脉冲的高电平部分一般为0.5ms-2.5ms范围。来控制舵机不同的转角

    500-2500us的PWM高电平部分对应控制180度舵机的0-180度

    以180度角度伺服为例,那么对应的控制关系是这样的:
    0.5ms--------------0度;
    1.0ms------------45度;
    1.5ms------------90度;
    2.0ms-----------135度;
    2.5ms-----------180度;

    在这里插入图片描述

    三、控制函数

    1、ledcSetup()函数,设置 LEDC通道对应的频率和计数位数(占空比分辨率)

    double ledcSetup(uint8_t chan, double freq, uint8_t bit_num)

    其第一个参数chan表示通道号,取值为0 ~ 15即可设置16个通道,其中高速通道(0 ~ 7)由80MHz时钟驱动,低速通道(8 ~ 15)由 1MHz 时钟驱动;第二个参数freq为期望设置的频率;第三个参数为占空比分辨率的计数位数,其取值为0 ~ 20(该值决定后面 ledcWrite 方法中占空比可写值,比如该值写10,则占空比最大可写1023 即(1<

    2、ledcAttachPin()函数,将指定的 LEDC 通道绑定到指定的 IO 口上以实现PWM的输出

    void ledcAttachPin(uint8_t pin, uint8_t channel);

    第一个参数pin表示我们需要输出的IO口,第二个参数channel为我们指定的LEDC通道。

    3、ledcWrite()函数,为指定的 LEDC 通道的输出占空比

    void ledcWrite(uint8_t chan, uint32_t duty)

    第一个参数chan为我们指定的LEDC通道,第二个参数duty表示占空比,其取值范围与ledcSetup()函数的bit_num有关。

    四、ESP32使用PWM实现对舵机的控制

    1. #include <Arduino.h>
    2. int freq = 50; // 频率(20ms周期)
    3. int channel = 8; // 通道(高速通道(0 ~ 7)由80MHz时钟驱动,低速通道(8 ~ 15)由 1MHz 时钟驱动。)
    4. int resolution = 8; // 分辨率
    5. const int led = 16;
    6. int calculatePWM(int degree)
    7. { //0-180
    8. //20ms周期,高电平0.5-2.5ms,对应0-180度角度
    9. const float deadZone = 6.4;//对应0.5ms(0.5ms/(20ms/256)) 舵机转动角度与占空比的关系:(角度/90+0.5)*1023/20
    10. const float max = 32;//对应2.5ms
    11. if (degree < 0)
    12. degree = 0;
    13. if (degree > 180)
    14. degree = 180;
    15. return (int)(((max - deadZone) / 180) * degree + deadZone);
    16. }
    17. void setup()
    18. {
    19. Serial.begin(9600);
    20. ledcSetup(channel, freq, resolution); // 设置通道
    21. ledcAttachPin(led, channel); // 将通道与对应的引脚连接
    22. }
    23. void loop()
    24. {
    25. for (int d = 0; d <= 180; d += 10)
    26. {
    27. ledcWrite(channel, calculatePWM(d)); // 输出PWM
    28. Serial.printf("value=%d,calcu=%d\n", d, calculatePWM(d));
    29. delay(1000);
    30. }
    31. }

    资料引用:

    (98条消息) esp32+舵机的学习案例_HL?的博客-CSDN博客_esp32 舵机

    (98条消息) ESP32 Arduino开发之路(2)— 使用PWM实现LED呼吸灯_Willliam_william的博客-CSDN博客_ledcsetup函数

    (98条消息) PWM原理 PWM频率与占空比详解_Z小旋的博客-CSDN博客_pwm

  • 相关阅读:
    一位工作多年的测试人告诉你哪些抓包工具指的推荐~
    成功解决ES高亮内容引起的字段显示不一致问题
    Flink-常用算子、自定义函数以及分区策略
    Linux--shell脚本详解
    基于springboot+vue开发的教师工作量管理系
    【Unity】使用Unity实现双屏显示
    element 时间选择器
    【UCIe】UCIe 支持的协议及操作模式
    Zabbix实现对Tomcat的监控
    苹果或推出多屏幕iPhone;​爱彼迎CEO:办公室时代已过去;Apache Flink 1.15 发布|极客头条
  • 原文地址:https://blog.csdn.net/yushuir/article/details/126479016