PWM控制舵机

舵机的控制一般需要一个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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值