一、PWM的使用
#include "gpio.h"
#include "pwm.h"
// 引脚寄存器地址 复用值(普通IO) 引脚序号
uint32 io_info[1][3] = {PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2, 2};
uint32 duty[1] = { 1023/1000*100 }; //高电平时间约是100us
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_init(void)
{
os_printf("=== System start ===\n");
os_printf("SDK version:%s\n", system_get_sdk_version());
/* 1000: 周期1000us
* duty: 高电平时间100us
* 1: 就配置了一个管脚,因为数组是[1][3]
* io_info: GPIO信息数组
*/
pwm_init(1000, duty, 1, io_info); //PWM初始化
pwm_start(); //启动PWM
}
关于高电平占空比的说明:假设设置的周期是1000us,说明无论设置周期是多少us,都是把周期分成了1024份 (0 - 1023 就代表了 0 - 1000us高电平),由于资料说最大值是1023,所以我才写的是uint32 duty[1]={1023/1000*100};//高电平时间约是100us
;实际上应该写 1024/1000*100
,但是担心大家如果设置高电平时间是1000,就变为 1024/1000*1000 = 1024
,超过了 1023 ,所以我写的是1023。
二、PWM实战–呼吸灯
PWM原理:PWM控制占空比,就是控制一个周期内高电平和低电平的比例。
假定小灯的阻值是恒定的,如果要计算小灯做功的话,根据公式W=Pt=I2Rt,电压和电阻恒定不变,那么电流也是不变的;
如果要计算做功的时间,肯定是计算高电平所占的那部分时间,所以如果高电平占比更多,小灯的做功也就越过,所以小灯会越亮;
呼吸灯的原理:根据上面我们得出了结论,高电平占比越多,小灯约亮;高电平占比越少,小灯越暗;呼吸灯就是慢慢变的越来越亮,然后变得越来越暗,一直循环这个过程,就好像在小灯在呼吸一样。所以我们只需要定时去切换高电平的占比就可以实现呼吸灯!
#include "gpio.h"
#include "pwm.h"
// 引脚寄存器地址 复用值(普通IO) 引脚序号
uint32 io_info[1][3] = {PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2, 2};
uint32 duty[1] = { 1023/1000*0 }; //高电平时间约是0us
os_timer_t os_timer_one; //定义软件定时器结构体变量
int LightValue = 1;
//定时器回调函数
void os_timer_one_function(void *parg) {
os_printf("parg: %s\n", parg);
pwm_set_duty(duty[0], 0); //设置0通道的PWM时间
duty[0] = duty[0] + 5*LightValue;
if(duty[0]>1023) {
duty[0] = 1023;
LightValue = -1;
}
if(duty[0]<0) {
duty[0] = 0;
LightValue = 1;
}
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_init(void)
{
os_printf("=== System start ===\n");
os_printf("SDK version:%s\n", system_get_sdk_version());
//配置GPIO2
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
/* 1000: 周期1000us
* duty: 高电平时间100us
* 1: 就配置了一个管脚,因为数组是[1][3]
* io_info: GPIO信息数组
*/
pwm_init(1000, duty, 1, io_info); //PWM初始化
pwm_start(); //启动PWM
//配置定时器
os_timer_setfn(&os_timer_one, os_timer_one_function, "Timer_callback");
//使能定时器
os_timer_arm(&os_timer_one, 10, 1); //10:10ms响应一次 1:循环(0:不循环)
}