由 WangChong 贡献,Ai-Thinker 进行整理
PWM的详细教程请参考泽哥的文章,当前文章基于泽哥的文章进行补充。
操作步骤
零基础开发小安派-Eyes_DU之【PWM循环呼吸灯】
零基础开发小安派-Eyes_DU之【PWM循环呼吸灯】 http://ai-thinker.com/forum.php?mod=viewthread&tid=279 (出处: 物联网开发者社区-安信可论坛)
[[http://ai-thinker.com/forum.php?](http://ai-thinker.com/fo
[http://ai-thinker.com/forum.php? … pwm&_dsign=d510fc0b](http://ai-thinker.com/forum.php?mod=viewthread&tid=622&highlight=pwm&_dsign=d510fc0b)
直接上代码,我的代码也是基于泽哥的。
c
#include "bflb_mtimer.h"
#include "bflb_pwm_v2.h"
#include "bflb_clock.h"
#include "bflb_gpio.h"
#include "board.h"
struct bflb_device_s *pwm;
struct bflb_device_s *gpio;
#define PWM_PERIOD_MAX 255
int main(void)
{
int i;
board_init();
pwm = bflb_device_get_by_name("pwm_v2_0");
gpio = bflb_device_get_by_name("gpio");
// 白灯
bflb_gpio_init(gpio, 29, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
/* period = .XCLK / .clk_div / .period = 40MHz / 40 / 1000 = 1KHz */
struct bflb_pwm_v2_config_s cfg = {
.clk_source = BFLB_SYSTEM_XCLK,
.clk_div = 40,
.period = PWM_PERIOD_MAX,
};
/*初始化PWM输出*/
bflb_pwm_v2_init(pwm, &cfg);
bflb_pwm_v2_start(pwm);
while (1) {
// 白灯呼吸亮灭
bflb_pwm_v2_channel_positive_start(pwm, PWM_CH1); // 使能白灯通道
for (i = 0; i < PWM_PERIOD_MAX; i++) {
bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH1, 0, i);
bflb_mtimer_delay_ms(5);
}
for (i = PWM_PERIOD_MAX; i > 0; i--) {
bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH1, 0, i);
bflb_mtimer_delay_ms(5);
}
bflb_pwm_v2_channel_positive_stop(pwm, PWM_CH1); // 失能白灯通道
}
}这里主要说明的是这个文档的信息。我需要额外补充一下。
- 首先,Ai-M61-32S-Kit 的规格书中,只说明了哪些端口可以用PWM0,并没有说明哪些端口用什么通道。
- 需要查看具体的通道的话则需要查看,BL616/618的文档。文档如下:
上传的附件: 
bl616_bl618_ds_zh_cn_1.4.pdf(1023.13 KB, 下载次数: 4)
解释说明: 关于通道,请查看管脚定义的章节。 拿GPIO21 举例(开发板上的引脚),如下代表这个IO可以支持两个PWM通道,正PWM通道1, 和负PWM通道2,其他的同理. 
下图为树莓派PICO逻辑分析仪捕获的数据:



遇到问题?
如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

