用ESP32輸出PWM波需要用到ledc函數(shù)
下面先對ledc函數(shù)做一下介紹
ledcSetup(channel0, freq0, resolution0);
ledcAttachPin(DJ0_PWM, channel0);
ledcWrite(channel0,dutyCycle0);
第一個是設(shè)置通道、頻率和分辨率的函數(shù)赏淌。
channel用來設(shè)置輸出PWM波的通道权她。
freq設(shè)置頻率,這里將頻率設(shè)置成50也就是周期20ms用來控制舵機逗威。
resolution設(shè)置分辨率构眯,分辨率能夠大致理解成決定將周期分成多少份寥裂,計算方法為2^resolution趁舀,因為取值時是從0開始的,所以需要再-1我設(shè)置成10祝沸,也就是可以分成1024份矮烹,于是可以取0~1023的值。
第二個是通道與引腳相關(guān)聯(lián)的函數(shù)
DJ0_PWM處設(shè)置ESP32的引腳罩锐。
channel決定引腳與那個通道相連奉狈。
第三個是設(shè)置通道輸出PWM波的占空比。
channel設(shè)置是哪個通道涩惑。
dutyCycle設(shè)置占空比仁期,之前我們用的分辨率為10,所以這里占空比取0~1023竭恬,控制舵機需要0ms~2.5ms所以將1024/40=25.6跛蛋,每個25.6代表的就是0.5ms,因為取值是0~1023所以25.6近似成25痊硕,那么如果想讓舵機轉(zhuǎn)到-90°就需要將dutyCycle設(shè)置成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); // 設(shè)置通道0
? ledcAttachPin(DJ0_PWM, channel0);? // 將通道0與引腳13連接
}
int dutyCycle0 = 76;? // 設(shè)置占空比
void setup()
{
? ledc_Initialization();? // ledc初始化程序
}
void loop()
{
? ledcWrite(channel0, dutyCycle0);? // 輸出PWM,dutyCycle為占空比
? delay(5);
}
通過不斷改變數(shù)值來找到腿的初始狀態(tài)
當找到每一個舵機的初始位置后就可以進行下一步逆運動學的編寫了晋被。