赞
踩
1、 舵机介绍
我用的是MG 946R 360°舵机
这种360°舵机相当于无极变速的减速电机,只能控制速度和方向,控制方式跟180°舵机是一样的,使用pwm进行控制。
2、 如何控制
我使用的是ESP8266进行控制
ESP8266 PWM输出,输出引脚为GPIO12
//1.头文件
#include “gpio.h”
#include “pwm.h”
//2.全局变量
uint32 pwm_duty_init[1] = {0};
uint32 io_info[1][3] =
{
{PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12,12},
//{PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13,13}, //GPIO13
//{PERIPHS_IO_MUX_MTDO_U,FUNC_GPIO15,15} //GPIO15
};
//3初始化引脚和pwm
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);//设置输出模式
gpio_output_set(0,BIT12,BIT12,0);//gpio12输出低电平
pwm_init(20000,pwm_duty_init,1,io_info); //配置PWM的周期为20ms,占空比为0,PWM通道数量为1
//4、设置占空比,舵机进行转动 注意:360度舵机其实只有三个状态:正传、反转和停止。除了给定的(停止)位置以外(如下例子,90是静止位置),0-90是全速到静止之间的设定,90-180是静止到反向全速之间)
static int32 duty1 = 33333;//pwm占空比,对应90° static int32 duty2 = 44444;//pwm占空比,对应135° static int32 duty3 = 22222;//pwm占空比,对应45° while(1){ pwm_set_duty(duty2,0); pwm_start(); delay_ms(748); //延时让舵机转动 pwm_set_duty(duty1,0); pwm_start(); delay_ms(1000); pwm_set_duty(duty3,0); pwm_start(); delay_ms(748); pwm_set_duty(duty1,0); pwm_start(); }
//5、主函数初始化ESP8266后调用函数
void ICACHE_FLASH_ATTR user_init(void) { system_init_done_cb(sys_init_cb);//创建初始化完成后回调函数 } void ICACHE_FLASH_ATTR sys_init_cb(void) { PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);//设置输出模式 gpio_output_set(0,BIT12,BIT12,0);//gpio12输出低电平 pwm_init(20000,pwm_duty_init,1,io_info); //配置PWM的周期为1000us/1kHZ,占空比为0,PWM通道数量为3 static int32 duty1 = 33333;//pwm占空比,对应90° static int32 duty2 = 44444;//pwm占空比,对应135° static int32 duty3 = 22222;//pwm占空比,对应45° while(1){ pwm_set_duty(duty2,0); pwm_start(); delay_ms(748); pwm_set_duty(duty1,0); pwm_start(); delay_ms(1000); pwm_set_duty(duty3,0); pwm_start(); delay_ms(748); pwm_set_duty(duty1,0); pwm_start(); } /* os_timer_disarm(&pwmTimer); os_timer_setfn(&pwmTimer,pwm_put,NULL); os_timer_arm(&pwmTimer,50,TRUE);*/ }
//5、可以使用定时器来控制
ETSTimer pwmTimer;//定时器 pwm,全局变量
os_timer_disarm(&pwmTimer); // 关闭定时器
os_timer_setfn(&pwmTimer,pwm_put,NULL);// 设置定时器
os_timer_arm(&pwmTimer,50,TRUE);// 使能定时器
//6、这是PWM输出函数,使用定时器回调的方式调用这个函数
void ICACHE_FLASH_ATTR pwm_put(void *arg)//pwm输出 { pwm_set_duty(duty2,0); pwm_start(); delay_ms(748); pwm_set_duty(duty1,0); pwm_start(); delay_ms(1000); pwm_set_duty(duty3,0); pwm_start(); delay_ms(748); pwm_set_duty(duty1,0); pwm_start(); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。