ESP8266 RTOS SDK学习之 PWM控灯

写在前面: 

本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。

 

这章用来学习 PWM控制,并用 LED来观察验证,先来看看与 PWM相关的主要的官方 API接口,至于简单、不怎么用的就不放出来了,自己去看手册

ESP8266 RTOS SDK学习之 PWM控灯_第1张图片

ESP8266 RTOS SDK学习之 PWM控灯_第2张图片

 

下面分析的主要用到也就这两个

首先在配置 PWM输出前要先把想要设置的 GPIO配置好

#define USER_GLED_GPIO			12
#define USER_GLED_GPIO_PIN		GPIO_Pin_12


/******************************************************************************
 * FunctionName : gled_gpio_config
 * Description  : green(GPIO12)配置
 * Parameters   : none
 * Returns      : none
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR gled_gpio_config(void)
{
	GPIO_ConfigTypeDef pGPIOConfig;

	pGPIOConfig.GPIO_IntrType = GPIO_PIN_INTR_DISABLE;
	pGPIOConfig.GPIO_Pullup = GPIO_PullUp_EN;
	pGPIOConfig.GPIO_Mode = GPIO_Mode_Output;
	pGPIOConfig.GPIO_Pin = USER_GLED_GPIO_PIN;			// gled
	gpio_config(&pGPIOConfig);
	GPIO_OUTPUT_SET(GPIO_ID_PIN(USER_GLED_GPIO), 0);	// close gled
}

 

然后配置我们需要的 PWM参数,在这里我是设了三个 led的参数,但用到的只是 GPIO12(gled)而已;至于你想要几个,根据自己的意愿去修改就好了

#define PWM_0_OUT_IO_MUX 		PERIPHS_IO_MUX_MTDI_U
#define PWM_0_OUT_IO_NUM 		12
#define PWM_0_OUT_IO_FUNC  		FUNC_GPIO12


/******************************************************************************
 * FunctionName : led_pwm_init
 * Description  : led PWM初始化
 * Parameters   : none
 * Returns      : none
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR led_pwm_init(void)
{
	/* 初始化 PWM,周期, pwm_duty_init占空比, 3通道数, 通道 IO */
	uint32 io_info[][3] ={	{PWM_0_OUT_IO_MUX,PWM_0_OUT_IO_FUNC,PWM_0_OUT_IO_NUM},
							{PWM_1_OUT_IO_MUX,PWM_1_OUT_IO_FUNC,PWM_1_OUT_IO_NUM},
							{PWM_2_OUT_IO_MUX,PWM_2_OUT_IO_FUNC,PWM_2_OUT_IO_NUM}	};
	uint32 pwm_duty_init[3] = {0, 0, 0};

//	pwm_init(1000, pwm_duty_init,3,io_info);	// 周期1000us,也就是1khz的频率,各通道初始占空比0

	pwm_init(450, &pwm_duty_init[0], 1, &io_info[0]);	// 只占用 1个通道、设定IO 12绿灯

	/* 重设占空比。
	pwm_set_duty(duty, channel);   	// 0 ~ 2(三通道)
	pwm_set_period(uint32 period);  // set period
	pwm_start();
	*/
}

 

弄完了之后,对 PWM-LED进行初始化

/******************************************************************************
 * FunctionName : uesr_LED_Init
 * Description  : LED初始化
 * Parameters   : none
 * Returns      : none
*******************************************************************************/
void ICACHE_FLASH_ATTR uesr_LED_Init(void)
{
//	rled_gpio_config();
	gled_gpio_config();
//	bled_gpio_config();

	led_pwm_init();
}

 

好了,我们就可以来调用一个函数来验证

void ICACHE_FLASH_ATTR GLED_ON(void)
{
//	GPIO_OUTPUT_SET(12, 1);		//GPIO12输出高电平

	/* PWM输出 */
	pwm_set_duty(100, 0);			// 重配置 LED PWM占空比、占用通道0
//	pwm_set_period(450);			// 重设置周期
	pwm_start();					// LED闪烁启动
}

 

在这里我只是把它亮度降低了而已(看占空比参数),当然你可以用个循环来对 pwm_set_duty()函数的 duty值进行自增或自减来实现渐变

你可能感兴趣的:(ESP8266)