本帖最后由 gaoyang9992006 于 2023-10-11 16:44 编辑
发现Arduino上的舵机驱动函数没有适配ESP32,于是我着手写一个。发现ESP32的Arduino标准库提供了LED控制函数ledc xxx,可以生成PWM信号。那么就在这个基础上实现
一个初始化:用于指定ledc通道和映射的引脚
一个设置舵机旋转角度的函数:用于指定对应通道上的旋转角度
舵机控制方式,通过一个50Hz信号来控制,对应脉宽如下
这个PWM的周期为20ms,高电平的时间在0.5ms~2.5ms之间可以控制舵机桨角度的停留位置。
O.5ms---------0度
1.0ms---------45度
1.5ms---------90度
2.0ms---------135度
2.5ms---------180度
#include "MG90S.h"
// use first channel of 16 channels (started from zero)
#define MG90S_CHANNEL_0 0
// 指定映射引脚
#define MG90S_01_PIN 9
void setup()
{
MG90S_init(MG90S_CHANNEL_0,MG90S_01_PIN);
}
void loop()
{
for(uint8_t i=0;i<=180;i++)
{
MG90S_servo(MG90S_CHANNEL_0,i);
delay(100);
}
}
经过测试效果贼拉好。
补充,以上是只负载一个舵机的测试,修改程序,再增加一路测试
#include "MG90S.h"
// use first channel of 16 channels (started from zero)
#define MG90S_CHANNEL_0 0
// 指定映射引脚
#define MG90S_01_PIN 9
void setup()
{
MG90S_init(MG90S_CHANNEL_0,MG90S_01_PIN);
MG90S_init(1,2);
}
void loop()
{
for(uint8_t i=0;i<180;i++)
{
MG90S_servo(MG90S_CHANNEL_0,i); MG90S_servo(1,i);
delay(50);
}
for(uint8_t i=180;i>0;i--)
{
MG90S_servo(MG90S_CHANNEL_0,i); MG90S_servo(1,i);
delay(50);
}
}
效果同样是惊人的好用,以后用Arduino开发ESP32的舵机驱动就用这个了,太好用了。最多可以驱动16个舵机运动。
|