当前位置:   article > 正文

ESP8266 PWM输出控制_esp8266 控制360舵机

esp8266 控制360舵机

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

	};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

//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
  • 1
  • 2
  • 3

//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();
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

//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);*/
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

//5、可以使用定时器来控制

ETSTimer pwmTimer;//定时器 pwm,全局变量
os_timer_disarm(&pwmTimer);  // 关闭定时器
os_timer_setfn(&pwmTimer,pwm_put,NULL);// 设置定时器
os_timer_arm(&pwmTimer,50,TRUE);// 使能定时器
  • 1
  • 2
  • 3
  • 4

//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();

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/67700
推荐阅读
相关标签
  

闽ICP备14008679号