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

二、什么是舵机

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

ESP32使用PWM实现对舵机的控制_第1张图片

二、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实现对舵机的控制

#include 

int freq = 50;      // 频率(20ms周期)
int channel = 8;    // 通道(高速通道(0 ~ 7)由80MHz时钟驱动,低速通道(8 ~ 15)由 1MHz 时钟驱动。)
int resolution = 8; // 分辨率
const int led = 16;

int calculatePWM(int degree)
{ //0-180度
 //20ms周期,高电平0.5-2.5ms,对应0-180度角度
  const float deadZone = 6.4;//对应0.5ms(0.5ms/(20ms/256)) 舵机转动角度与占空比的关系:(角度/90+0.5)*1023/20
  const float max = 32;//对应2.5ms
  if (degree < 0)
    degree = 0;
  if (degree > 180)
    degree = 180;
  return (int)(((max - deadZone) / 180) * degree + deadZone);
}

void setup()
{
  Serial.begin(9600);
  ledcSetup(channel, freq, resolution); // 设置通道
  ledcAttachPin(led, channel);          // 将通道与对应的引脚连接
}

void loop()
{
  for (int d = 0; d <= 180; d += 10)
  {
    ledcWrite(channel, calculatePWM(d)); // 输出PWM
    Serial.printf("value=%d,calcu=%d\n", d, calculatePWM(d));
    delay(1000);
  }  
}

资料引用:

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

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

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

你可能感兴趣的:(ESP32,java,开发语言)