用ESP32输出PWM波需要用到ledc函数
下面先对ledc函数做一下介绍
ledcSetup(channel0, freq0, resolution0);
ledcAttachPin(DJ0_PWM, channel0);
ledcWrite(channel0,dutyCycle0);
第一个是设置通道、频率和分辨率的函数。
channel用来设置输出PWM波的通道。
freq设置频率,这里将频率设置成50也就是周期20ms用来控制舵机。
resolution设置分辨率,分辨率能够大致理解成决定将周期分成多少份,计算方法为2^resolution,因为取值时是从0开始的,所以需要再-1我设置成10,也就是可以分成1024份,于是可以取0~1023的值。
第二个是通道与引脚相关联的函数
DJ0_PWM处设置ESP32的引脚。
channel决定引脚与那个通道相连。
第三个是设置通道输出PWM波的占空比。
channel设置是哪个通道。
dutyCycle设置占空比,之前我们用的分辨率为10,所以这里占空比取0~1023,控制舵机需要0ms~2.5ms所以将1024/40=25.6,每个25.6代表的就是0.5ms,因为取值是0~1023所以25.6近似成25,那么如果想让舵机转到-90°就需要将dutyCycle设置成25,以此类推。
下面附完整程序
#include <Arduino.h>
#include <WiFi.h>
#define DJ0_PWM 13
int freq = 50;
int freq0 = freq; // 频率
int channel0 = 0; // 通道0,共16个通道,0~15
int resolution0 = 10; // 分辨率,取值0~20,duty最大取值为2^resolution-1
void ledc_Initialization() // ledc初始化程序
{
ledcSetup(channel0, freq0, resolution0); // 设置通道0
ledcAttachPin(DJ0_PWM, channel0); // 将通道0与引脚13连接
}
int dutyCycle0 = 76; // 设置占空比
void setup()
{
ledc_Initialization(); // ledc初始化程序
}
void loop()
{
ledcWrite(channel0, dutyCycle0); // 输出PWM,dutyCycle为占空比
delay(5);
}
通过不断改变数值来找到腿的初始状态
当找到每一个舵机的初始位置后就可以进行下一步逆运动学的编写了。