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