舵机的控制一般需要一个20Ms左右的时基脉冲,该脉冲的高电平部分一般为0.5Ms~2.5Ms范围内的角度控制脉冲部分,总间隔为2Ms。以180°舵机为例,对应的控制关系如下:
0.5Ms————0°
1.0Ms————45°
1.5Ms————90°
2.0Ms————135°
2.5Ms————180°
360°舵机与其他普通舵机不同,它实际相当于无极变速的减速电机,可以控制速度和方向,但是没有0-360°角度控制的功能。控制方向和一般舵机的控制信号相同:
0.5Ms————正向最大转速
1.5Ms————速度为0
2.5Ms————反向最大转速
我们以ESP8266 WIFI模块为例,查看其datasheet:
根据公式:占空比 = (duty * 45)/(period * 1000)
计算出duty。
代码设计:
// 全局变量
os_timer_t pwm_timer;
uint32 io_info[][3] = {
{PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12,12},
//{PERIPHS_IO_MUX_MTDO_U,FUNC_GPIO15,15},
//{PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13,13},
//{PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4,4},
//{PERIPHS_IO_MUX_GPIO5_U,FUNC_GPIO5,5}
};
//控制舵机
void pwm_callback(void)
{
static unsigned int duty = 0;
duty = duty+ 28000;
pwm_set_duty(duty,0);
pwm_start();
delay_ms(400);
//停止
duty = 33333;
pwm_set_duty(duty,0);
pwm_start();
delay_ms(450);
duty = 44444;
pwm_set_duty(duty,0);
pwm_start();
delay_ms(400);
//停止
duty = 33333;
pwm_set_duty(duty,0);
pwm_start();
os_timer_disarm(&pwm_timer);
}
// 定时器定时连接舵机
void ICACHE_FLASH_ATTR OS_Timer_1_Init_pwm(u32 time_ms, u8 time_repetitive)
{
os_timer_disarm(&pwm_timer); // 关闭定时器
os_timer_setfn(&pwm_timer,(os_timer_func_t *)pwm_callback, NULL); // 设置定时器
os_timer_arm(&pwm_timer, time_ms, time_repetitive); // 使能定时器
}
// 程序主入口
void ICACHE_FLASH_ATTR user_init(void)
{
//1. 初始化串口
uart_init(115200,115200); // 初始化串口波特率
os_delay_us(10000); // 等待串口稳定
//7. 启动定时连接舵机
uint32 p_duty[1] = {0};
pwm_init(20000,p_duty,1,io_info);
OS_Timer_1_Init_pwm(100,0);
}