本帖最后由 WangChong 于 2023-10-27 12:14 编辑
PWM的详细教程请参考泽哥的文章,当前文章基于泽哥的文章进行补充。
1- 零基础开发小安派-Eyes_DU之【PWM循环呼吸灯】
http://ai-thinker.com/forum.php?mod=viewthread&tid=279
(出处: 物联网开发者社区-安信可论坛)
2- http://ai-thinker.com/forum.php? ... pwm&_dsign=d510fc0b
直接上代码,我的代码也是基于泽哥的。
- #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); // 失能白灯通道
- }
- }
复制代码 这里主要说明的是这个文档的信息。我需要额外补充一下。
- 首先,[color=rgba(0, 0, 0, 0.87)]Ai-M61-32S-Kit 的规格书中,只说明了哪些端口可以用PWM0,并没有说明哪些端口用什么通道。
- [color=rgba(0, 0, 0, 0.87)]需要查看具体的通道的话则需要查看,BL616/618的文档。文档如下:
bl616_bl618_ds_zh_cn_1.4.pdf
(1023.13 KB, 下载次数: 3)
|
|