0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

零基础开发小安派-Eyes-S1【外设篇】——PWM

AIoT行业洞察 2024-11-06 16:10 次阅读

AiPi-Eyes-S1是安信可开源团队专门为Ai-M61-32S设计的一款开发板,支持WiFi6、BLE5.3。所搭载的Ai-M61-32S 模组具有丰富的外设接口,具体包括 DVP、MJPEG、Dispaly、AudioCodec、USB2.0、SDU、以太网 (EMAC)、SD/MMC(SDH)、SPI、UARTI2C、I2S、PWM、GPDAC、GPADC、ACOMP 和 GPIO 等。

AiPi-Eyes-S1集成了SPI屏幕接口,DVP摄像头接口,外置ES8388音频编解码芯片以及预留TF卡座,并且引出USB接口,可接入USB摄像头。

从零开始学习小安派:

1、零基础开发小安派-Eyes-S1【入门篇】——初识小安派-Eyes-S1

2、零基础开发小安派-Eyes-S1【入门篇】——安装VMware与Ubuntu

3、入门篇:零基础开发小安派-Eyes-S1——新建工程并烧录调试

4、零基础开发小安派-Eyes-S1入门篇——Win下SSH连接Linux

5、零基础开发小安派-Eyes-S1【入门篇】——Samba共享文件夹

6、零基础开发小安派-Eyes-S1【入门篇】——工程文件架构

7、零基础开发小安派-Eyes-S1【外设篇】——GPIO 输入输出

8、零基础开发小安派-Eyes-S1【外设篇】——GPIO中断编程

PWM 是英文“Pulse Width Modulation”的缩写,简称脉宽调制。一般 IO 口输出是高低电平,是数字信号,电压是以 1 或 0 的重复脉冲来模拟负载,我们可以通过对一个脉冲信号的高低电平时间控制来将数字信号模拟成模拟电压信号,这也是 PWM 最大的用处。总结下来就是,通过一个周期内改变占空比的方式来改变输出的有效电压。下面普及几个 PWM 的概念。

PWM 频率: 一秒钟内,信号完整的从高电平到低电平的次数(完整的一个脉冲周期),单位是 Hz。1Hz 也就是一秒钟一个脉冲周期,周期是 1000ms。

PWM 周期: 周期=1/频率,也就是周期与频率互为倒数,单位一般是 ms,若频率为 5Hz,周期也就是 1/5=0.2S=200ms。

PWM 占空比: 一个脉冲周期内,高电平的时间占整个周期时间的比例。单位是 %,高电平时间是 50ms,周期是 100ms。占空比就是 50/100*100%=50%。

了解小安派-Eyes-S1 的 PWM

小安派使用的 M61 模组是 BL618 芯片,基于 LHAL 库只支持 PWM_V2,该 PWM 版本支持四个 PWM 通道。

PWM V2 版本输出有效极性。当正向通道阈值位于设置的低阈值和高阈值之间,为有效极性,如果设置有效极性为高,则输出高电平,反之输出低电平。反向通道相反,阈值位于设置的低阈值和高阈值之外,为有效极性,如果设置有效极性为高,则输出高电平,反之输出低电平。

#define PWM_POLARITY_ACTIVE_LOW 0
#define PWM_POLARITY_ACTIVE_HIGH 1

1.struct bflb_pwm_v2_config_s

说明:pwm_v2 初始化配置结构体

struct bflb_pwm_v2_config_s {
uint8_t clk_source;
uint16_t clk_div;
uint16_t period;
};

PWM 最终产生的频率为 clk_source/clk_div/period

2.struct bflb_pwm_v2_channel_config_s

说明:pwm_v2 通道初始化配置结构体

struct bflb_pwm_v2_channel_config_s {
uint8_t positive_polarity;
uint8_t negative_polarity;
uint8_t positive_stop_state;
uint8_t negative_stop_state;
uint8_t positive_brake_state;
uint8_t negative_brake_state;
uint8_t dead_time;
};

3.bflb_pwm_v2_init

说明:初始化 pwm。使用之前需要选择 gpio 为 pwm 功能。

void bflb_pwm_v2_init(struct bflb_device_s *dev, const struct bflb_pwm_v2_config_s *config);

4.bflb_pwm_v2_deinit

说明: 复位 pwm。

void bflb_pwm_v2_deinit(struct bflb_device_s *dev);

5.bflb_pwm_v2_start

说明: 启动 pwm 输出。

void bflb_pwm_v2_start(struct bflb_device_s *dev);

6.bflb_pwm_v2_stop

说明: 关闭 pwm 输出。

void bflb_pwm_v2_stop(struct bflb_device_s *dev);

7.bflb_pwm_v2_set_period

说明: 修改 pwm 周期值,从而更改 pwm 输出的频率。

void bflb_pwm_v2_set_period(struct bflb_device_s *dev, uint16_t period);

8.bflb_pwm_v2_channel_init

说明: PWM 通道初始化。

void bflb_pwm_v2_channel_init(struct bflb_device_s *dev, uint8_t ch, struct bflb_pwm_v2_channel_config_s *config);

9.bflb_pwm_v2_channel_set_threshold

说明: 设置 PWM 占空比。

void bflb_pwm_v2_channel_set_threshold(struct bflb_device_s *dev, uint8_t ch, uint16_t low_threhold, uint16_t high_threhold);

PWM 占空比=(high_threhold - low_threhold)/period

10.bflb_pwm_v2_channel_positive_start

说明: PWM 正向通道使能输出。

void bflb_pwm_v2_channel_positive_start(struct bflb_device_s *dev, uint8_t ch);

11.bflb_pwm_v2_channel_negative_start

说明: PWM 反向通道使能输出。

void bflb_pwm_v2_channel_negative_start(struct bflb_device_s *dev, uint8_t ch);

12.bflb_pwm_v2_channel_positive_stop

说明: PWM 正向通道停止输出。

void bflb_pwm_v2_channel_positive_stop(struct bflb_device_s *dev, uint8_t ch);

13.bflb_pwm_v2_channel_negative_stop

说明: PWM 反向通道停止输出。

void bflb_pwm_v2_channel_negative_stop(struct bflb_device_s *dev, uint8_t ch);

14.bflb_pwm_v2_int_enable

说明: PWM 中断使能和关闭。

void bflb_pwm_v2_int_enable(struct bflb_device_s *dev, uint32_t int_en, bool enable);

int_en 可以填入以下值,多个中断可以使用 | 连接:

#define PWM_INTEN_CH0_L (1 << 0)
#define PWM_INTEN_CH0_H (1 << 1)
#define PWM_INTEN_CH1_L (1 << 2)
#define PWM_INTEN_CH1_H (1 << 3)
#define PWM_INTEN_CH2_L (1 << 4)
#define PWM_INTEN_CH2_H (1 << 5)
#define PWM_INTEN_CH3_L (1 << 6)
#define PWM_INTEN_CH3_H (1 << 7)
#define PWM_INTEN_PERIOD (1 << 8)
#define PWM_INTEN_BRAKE (1 << 9)
#define PWM_INTEN_REPT (1 << 10)

15.bflb_pwm_v2_get_intstatus

说明:获取 PWM 中断标志。

uint32_t bflb_pwm_v2_get_intstatus(struct bflb_device_s *dev);

返回值如下:

#define PWM_INTSTS_CH0_L (1 << 0)
#define PWM_INTSTS_CH0_H (1 << 1)
#define PWM_INTSTS_CH1_L (1 << 2)
#define PWM_INTSTS_CH1_H (1 << 3)
#define PWM_INTSTS_CH2_L (1 << 4)
#define PWM_INTSTS_CH2_H (1 << 5)
#define PWM_INTSTS_CH3_L (1 << 6)
#define PWM_INTSTS_CH3_H (1 << 7)
#define PWM_INTSTS_PERIOD (1 << 8)
#define PWM_INTSTS_BRAKE (1 << 9)
#define PWM_INTSTS_REPT (1 << 10)

16.bflb_pwm_v2_int_clear

说明: 清除 PWM 中断标志。

void bflb_pwm_v2_int_clear(struct bflb_device_s *dev, uint32_t int_clear);

int_clear 可以填入以下参数:

#define PWM_INTCLR_CH0_L (1 << 0)
#define PWM_INTCLR_CH0_H (1 << 1)
#define PWM_INTCLR_CH1_L (1 << 2)
#define PWM_INTCLR_CH1_H (1 << 3)
#define PWM_INTCLR_CH2_L (1 << 4)
#define PWM_INTCLR_CH2_H (1 << 5)
#define PWM_INTCLR_CH3_L (1 << 6)
#define PWM_INTCLR_CH3_H (1 << 7)
#define PWM_INTCLR_PERIOD (1 << 8)
#define PWM_INTCLR_BRAKE (1 << 9)
#define PWM_INTCLR_REPT (1 << 10)

17.bflb_pwm_v2_feature_control

说明: PWM 其他特性相关控制,一般不常用。

int bflb_pwm_v2_feature_control(struct bflb_device_s *dev, int cmd, size_t arg);

cmd 可以填入以下参数:

#define PWM_CMD_SET_TRIG_ADC_SRC (0x01)
#define PWM_CMD_SET_EXT_BRAKE_POLARITY (0x02)
#define PWM_CMD_SET_EXT_BRAKE_ENABLE (0x03)
#define PWM_CMD_SET_SW_BRAKE_ENABLE (0x04)
#define PWM_CMD_SET_STOP_ON_REPT (0x05)
#define PWM_CMD_SET_REPT_COUNT (0x06)

示例:PWM 实现呼吸灯

呼吸灯是 PWM 最常见的例子,非常的简单,首先将频率调好,人眼识别的频率大于 50Hz 时,由于识别不了这么高的闪烁频率,看起来就像常亮一样。总结起来就是:

频率很高时,看不到闪烁,占空比越大,LED 越亮;频率很低时,可看到闪烁,占空比越大,LED 越亮。

所以我们只需要调好频率,在改变占空比的情况下就可以看到 LED 灯亮度变化过程。在一个 while 函数里实现即可。

Main

#include "bflb_mtimer.h" //mtimer定时器头文件
#include "bflb_pwm_v2.h" //pwm_v2头文件
#include "bflb_clock.h" //系统时钟头文件
#include "board.h" //开发板头文件,包装的库
#include "bflb_gpio.h" //gpio头文件
struct bflb_device_s *pwm; //创建LHAL外设库结构体,名称为pwm
void my_pwm_gpio_init() //编写一个选择pwm输出的gpio口初始化函数
{
struct bflb_device_s *gpio;
gpio = bflb_device_get_by_name("gpio");
bflb_gpio_init(gpio, GPIO_PIN_0, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
//选择IO0作为pwm输出,
}
int main(void)
{
int i; //临时变量i,作为改变占空比的变量
board_init(); //板子初始化
my_pwm_gpio_init(); //调用函数,里面设置好了pwm输出的gpio口
pwm = bflb_device_get_by_name("pwm_v2_0"); //给外设接口赋名pwm_v2_0
/* 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 = 1000,
}; //设置PWM的频率,选择时钟,分频,和周期。根据上面的公式算出最终的频率。
/*初始化PWM输出*/
bflb_pwm_v2_init(pwm, &cfg);
bflb_pwm_v2_start(pwm); //将设置好的频率开启pwm输出
while (1) {
//蓝灯呼吸亮灭
bflb_pwm_v2_channel_positive_start(pwm, PWM_CH0); //那么问题来了,如何知道IO口对应的PWM通道,后面会解答,IO0是通道0
for(i=150;i>0;i--)
{
bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH0, i, 150); //改变占空比,变量i会不断变化

bflb_mtimer_delay_ms(10);
}
for(i=1;i<150;i++)
{
bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH0, i, 150);
bflb_mtimer_delay_ms(10);
}
bflb_pwm_v2_channel_positive_stop(pwm, PWM_CH0);
}
}

确定 IO 对应 PWM 通道

确定 IO 对应 PWM 通道

查看 BL616/618 的芯片数据手册:

bl616_bl618_ds_zh_cn_1.4.pdf (http://ai-thinker.com)

呼吸灯效果

动图封面

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开源硬件
    +关注

    关注

    8

    文章

    206

    浏览量

    29775
收藏 人收藏

    评论

    相关推荐

    零基开发小安-Eyes-S1 外设 ——I2C

    。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP摄像头接口,外置ES8388音频编解码芯片以及预留TF卡座,并且引出USB接口,可接入USB摄像头。 从开始学习小安
    的头像 发表于 11-27 16:39 131次阅读
    <b class='flag-5'>零基</b>础<b class='flag-5'>开发</b><b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b> <b class='flag-5'>外设</b><b class='flag-5'>篇</b> ——I2C

    小安 AiPi-Eyes-R2 玩植物大战僵尸

    - Eyes-R1 带外置 ES8388 音频芯片,支持两路音频输入输出。小安 - Eyes-R2 采用内置 CodeC,支持单路音频输入输出。 如果是编译带 8388
    的头像 发表于 11-06 16:10 163次阅读
    用<b class='flag-5'>小安</b><b class='flag-5'>派</b> AiPi-<b class='flag-5'>Eyes</b>-R2 玩植物大战僵尸

    零基开发小安-Eyes-S1【入门】——工程文件架构

    -Eyes-S1【入门】——初识小安-Eyes-S12、零基
    的头像 发表于 11-06 16:10 115次阅读
    <b class='flag-5'>零基</b>础<b class='flag-5'>开发</b><b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b>【入门<b class='flag-5'>篇</b>】——工程文件架构

    零基开发小安-Eyes-S1外设——GPIO中断编程

    等。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP摄像头接口,外置ES8388音频编解码芯片以及预留TF卡座,并且引出USB接口,可接入USB摄像头。 产品资料:https://docs.ai-thinker.com/eyes
    的头像 发表于 10-29 14:56 699次阅读
    <b class='flag-5'>零基</b>础<b class='flag-5'>开发</b><b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b><b class='flag-5'>外设</b><b class='flag-5'>篇</b>——GPIO中断编程

    零基开发小安-Eyes-S1外设——GPIO 输入输出

    等。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP摄像头接口,外置ES8388音频编解码芯片以及预留TF卡座,并且引出USB接口,可接入USB摄像头。 从开始学习小安
    的头像 发表于 10-25 13:50 985次阅读
    <b class='flag-5'>零基</b>础<b class='flag-5'>开发</b><b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b><b class='flag-5'>外设</b><b class='flag-5'>篇</b>——GPIO 输入输出

    开发教程 零基开发小安-Eyes-S1入门——Win下SSH连接Linux

    AiPi-Eyes-S1 是安信可开源团队专门为Ai-M61-32S设计的一款开发板,支持WiFi6、BLE5.3。所搭载的Ai-M61-32S 模组具有丰富的
    的头像 发表于 09-24 14:31 260次阅读
    <b class='flag-5'>开发</b>教程 <b class='flag-5'>零基</b>础<b class='flag-5'>开发</b><b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b>入门<b class='flag-5'>篇</b>——Win下SSH连接Linux

    功德+1,用小安-Eyes-S1做一个电子木鱼

    2024积德累功,心想事成!接下来 看看如何用小安-Eyes-S1做一个电子木鱼 。 01、GUI-Guider 页面设计 先新建一个工程。 直接进入 UI 设计界面,这里用到了两个组件, 一个是图片按钮,一个是文本框 。 先
    的头像 发表于 01-16 14:33 705次阅读
    功德+<b class='flag-5'>1</b>,用<b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b>做一个电子木鱼

    如何用小安-Eyes-S1做一个电子木鱼?

    2024年的第一教程来了,本篇学习如何添加LVGL事件,并制作完成一个电子木鱼(小美苦苦哀求,我略微出手而已)。祝大家2024积德累功,心想事成!接下来看看如何用小安-Eyes-S1
    的头像 发表于 01-13 15:18 990次阅读
    如何用<b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b>做一个电子木鱼?

    用安信可的小安小安,DIY个简单的CC表

    本作品由安信可社区用户 bzhou830 制作 原贴地址:【DIY电子作品】电压与电流CC表 基于小安AiPi-Eye-S1 汇总 https://bbs.ai-thinker.com
    的头像 发表于 12-25 17:07 662次阅读
    用安信可的<b class='flag-5'>小安</b><b class='flag-5'>派</b><b class='flag-5'>小安</b><b class='flag-5'>派</b>,DIY个简单的CC表

    小安DIY个简单的CC表

    Power-Z 上使用的是 INA226,正好手上有这个芯片。那么搭配小安惊艳的屏幕应该能实现出来一个高颜值的CC表。打开原理图可以看到S1正好预留了一个I2C的接口,完美
    的头像 发表于 12-22 18:15 1646次阅读
    用<b class='flag-5'>小安</b><b class='flag-5'>派</b>DIY个简单的CC表

    零基础入门 Hyperlynx 仿真教程

    电子发烧友网站提供《零基础入门 Hyperlynx 仿真教程.pdf》资料免费下载
    发表于 12-22 10:49 31次下载

    使用小安-DSL-3.5寸开发的Rd-03D雷达检测站

    Hello~工程师又来整活了。这是一个使用小安-DSL-3.5寸开发的Rd-03D 雷达检测站,可以把Rd-03D检测的内容显示在3.5寸触摸屏上,直观地查看雷达的检测结果。
    的头像 发表于 12-16 16:05 514次阅读
    使用<b class='flag-5'>小安</b><b class='flag-5'>派</b>-DSL-3.5寸<b class='flag-5'>开发</b>的Rd-03D雷达检测站

    入门3:零基开发小安-Eyes-S1——新建工程并烧录调试

    01 新建工程文件 1、复制helloworld工程 2、将工程移动到AiPi-Open-Kits下 3、修改helloworld文件夹下的Makefile文件 Makefile文件的修改一般只修改
    的头像 发表于 12-12 16:35 547次阅读
    入门<b class='flag-5'>篇</b>3:<b class='flag-5'>零基</b>础<b class='flag-5'>开发</b><b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b>——新建工程并烧录调试

    基于小安Eyes-S1开发板新建工程并烧录调试

    Makefile文件的修改一般只修改编译路径,make文件作为建立编译关系和依赖,我们所有的demo编译都依赖SDK
    的头像 发表于 12-11 11:27 603次阅读
    基于<b class='flag-5'>小安</b><b class='flag-5'>派</b><b class='flag-5'>Eyes-S1</b><b class='flag-5'>开发</b>板新建工程并烧录调试

    小安Arduino开发板 ,全新支持以太网口

    前面几款小安派出来的时候,经常有粉丝询问是否支持Arduino?其它款小安也是支持的,大家可以去安信可社区搜索查看,小安-UNO-ET4
    的头像 发表于 12-06 16:00 774次阅读
    <b class='flag-5'>小安</b><b class='flag-5'>派</b>Arduino<b class='flag-5'>开发</b>板 ,全新支持以太网口