ESP8266-SDK的3路PWM输出

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




评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做了不一定能实现但不做一定不会实现

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值