【Ai-M61-32S-Kit】【教程】PWM点呼吸灯

[复制链接]
查看1404 | 回复4 | 2023-11-20 16:49:04 | 显示全部楼层 |阅读模式
本帖最后由 aHaoii 于 2023-11-20 16:50 编辑

继刚刚点亮灯以后,便准备试试其它功能,不如整个呼吸灯吧。
纯粹用变量操作延时肯定没什么意思,所以用PWM来驱动。

                               
登录/注册后可看大图

【1】找例程
还是老样子,在官方的例程上进行修改。
找到该文件夹:
屏幕截图 2023-11-20 163045.jpg
打开里面有很多外设的例子,看到pwm_v1,pwm_v2,就是我们要找的。
屏幕截图 2023-11-20 163158.jpg
分别看这两个文件夹下pwm_basic的readme,发现pwm_v1只支持bl602, bl702这些芯片,而我们的Ai-M61-32S-Kit用的是bl618。
因此,找到pwm_v2,看pwm_basic的readme,OK,是我们需要的。

                               
登录/注册后可看大图

【2】修改例程
这是pwm_basic下原始的main.c内容:
屏幕截图 2023-11-20 160024.jpg
因为我们需要将连接RGB灯的IO口设置为PWM功能,所以默认的代码需要修改。
找到board_pwm_gpio_init的定义,如下:
  1. void board_pwm_gpio_init()
  2. {
  3.     struct bflb_device_s* gpio;

  4.     gpio = bflb_device_get_by_name("gpio");
  5.     bflb_gpio_init(gpio, GPIO_PIN_24, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLDOWN | GPIO_SMT_EN | GPIO_DRV_1);
  6.     bflb_gpio_init(gpio, GPIO_PIN_25, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
  7.     bflb_gpio_init(gpio, GPIO_PIN_26, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLDOWN | GPIO_SMT_EN | GPIO_DRV_1);
  8.     bflb_gpio_init(gpio, GPIO_PIN_27, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
  9.     bflb_gpio_init(gpio, GPIO_PIN_28, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLDOWN | GPIO_SMT_EN | GPIO_DRV_1);
  10.     bflb_gpio_init(gpio, GPIO_PIN_29, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
  11.     bflb_gpio_init(gpio, GPIO_PIN_30, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLDOWN | GPIO_SMT_EN | GPIO_DRV_1);
  12.     bflb_gpio_init(gpio, GPIO_PIN_31, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
  13. }
复制代码
可以发现该代码将GPIO24-31全部设置成了PWM,我们不需要这么多,因此复制一部分就行,如下:
  1.     struct bflb_device_s* gpio;

  2.     gpio = bflb_device_get_by_name("gpio");
  3.     bflb_gpio_init(gpio, GPIO_PIN_12, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLDOWN | GPIO_SMT_EN | GPIO_DRV_1);
复制代码
并添加一个头文件,该头文件有GPIO_PULLDOWN 这些东西的定义。
  1. #include "bflb_gpio.h"
复制代码

                               
登录/注册后可看大图

【3】占空比调节实现呼吸灯效果
  1. bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH0, 100, 500);
复制代码
前面的.period设置为1000,意思就是计数器从1-1000计数,100-500之间输出高,其它为低。(个人这么理解,还没细看)
因此修改该参数即可达到占空比控制实现呼吸灯效果。
完整代码如下:
  1. int main(void)
  2. {
  3.     board_init();
  4.     struct bflb_device_s* gpio;

  5.     gpio = bflb_device_get_by_name("gpio");
  6.     bflb_gpio_init(gpio, GPIO_PIN_12, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLDOWN | GPIO_SMT_EN | GPIO_DRV_1);
  7.    

  8.     pwm = bflb_device_get_by_name("pwm_v2_0");

  9.     /* period = .XCLK / .clk_div / .period = 40MHz / 40 / 1000 = 1KHz */
  10.     struct bflb_pwm_v2_config_s cfg = {
  11.         .clk_source = BFLB_SYSTEM_XCLK,
  12.         .clk_div = 40,
  13.         .period = 1000,
  14.     };

  15.     bflb_pwm_v2_init(pwm, &cfg);
  16.     bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH0, 1, 2); /* duty = (500-100)/1000 = 40% */
  17.     bflb_pwm_v2_channel_positive_start(pwm, PWM_CH0);
  18.     bflb_pwm_v2_start(pwm);

  19.     uint32_t val = 2;
  20.     bool flag = true;
  21.     while (1) {
  22.         if(flag){
  23.             val++;
  24.         }
  25.         else{
  26.             val--;
  27.         }
  28.         if(val>=999 || val <= 2){
  29.             flag = !flag;
  30.         }
  31.         bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH0, 1, val);
  32.         bflb_mtimer_delay_ms(1);
  33.     }
  34. }
复制代码

                               
登录/注册后可看大图

【4】编译烧录
在编译前需要修改一下Makefile,把Makefile这里改成bl616的配置。
屏幕截图 2023-11-20 164631.jpg
然后make flash COMX=COM3即可,COM3取决于自己电脑。
成功后即可看到红色呼吸灯闪烁效果。
烧录操作参见该贴:
【教程】点灯!解决Ai-M61-32S-Kit到手不亮
http://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=43396
(出处: 物联网开发者社区-安信可论坛)
——————————————————————————————
2023.11.20
回复

使用道具 举报

bd4kc | 2023-11-21 20:22:50 来自手机 | 显示全部楼层
太好了,赞。

CPU型号为什么是616?
回复 支持 反对

使用道具 举报

aHaoii | 2023-11-23 19:01:07 | 显示全部楼层
bd4kc 发表于 2023-11-21 20:22
太好了,赞。

CPU型号为什么是616?

bl616和bl618差不多,官方提供的配置没有做区分。
回复 支持 反对

使用道具 举报

干簧管 | 2023-11-24 20:26:24 | 显示全部楼层
回复

使用道具 举报

st780206 | 2024-5-24 21:24:57 | 显示全部楼层
学习到了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则