ESP8266的PWM和硬件定时器都是使用同一个中断定时器,所以同时只能使用一个,这点要注意
1、PWM的初始化
void pwm_init(
uint32 period,
uint8 *duty,
uint32 pwm_channel_num,
uint32 (*pin_info_list)[3])
参数:
uint32 period : PWM 周期;
uint8 *duty : 各路 PWM 的占空⽐比
uint32 pwm_channel_num: PWM 通道数
uint32 (*pin_info_list)[3]: PWM 各通道的 GPIO 硬件参数。本参数是⼀一个 n * 3
uint32 pwm_duty[3]= {0};
uint32 io_info[3][3]={
{PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12,12},
{PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13,13},
{PERIPHS_IO_MUX_MTDO_U,FUNC_GPIO15,15}
};
//pwm_init(1000,pwm_duty,3,io_info);
pwm_init(1000, //设置pwm的周期
pwm_duty, //设置pwm的占空比
3, //pwm的通道数
io_info); //pwM的管脚
通过上面就设置好了GPIO12、GPIO13、GPIO15为PWM输出
2、使用软定时器的回调函数来改变占空比
os_timer_disarm(&pwm_timer);
os_timer_setfn(&pwm_timer,(os_timer_func_t *)pwm_callback,NULL);
os_timer_arm(&pwm_timer,100,0);
void pwm_set_duty(uint32 duty, uint8 channel) 这个函数就是用来改变占空比的,duty为改变占空比 channel为哪一个通道
uint32 duty : 设置⾼高电平时间参数,占空⽐比的值为 (duty*45)/ (period*1000)
uint8 channel : 当前要设置的 PWM 通道,取值范围依据实际使⽤用了⼏几路 PWM,
每次更新 PWM 设置后,都需要重新调用void pwm_start (void)函数才能生效
void pwm_callback(void)
{
static unsigned int duty = 0;
if(duty > 20000)
{
duty = 0;
}
duty = duty+ 200;
pwm_set_duty(duty,0);
pwm_set_duty(20000-duty,1);
pwm_set_duty(duty,2);
pwm_start();
os_timer_arm(&pwm_timer,100,0);
}
这样GPIO12、GPIO15、GPIO13就可以输出可变的PWM