衡阳派盒市场营销有限公司

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

    文章

    212

    瀏覽量

    29976
收藏 人收藏

    評論

    相關推薦

    零基開發小安-Eyes-S1 進階 ——通過屏幕輸入連接 Wi-Fi

    等。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預留TF卡座,并且引出USB接口,可接入USB攝像頭。 從開始學習小安
    的頭像 發表于 01-16 09:47 ?91次閱讀
    <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> ——通過屏幕輸入連接 Wi-Fi

    零基開發AiPi-Eyes-S1——通過屏幕輸入連接Wi-Fi

    等。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預留TF卡座,并且引出USB接口,可接入USB攝像頭。 從開始學習小安
    的頭像 發表于 01-15 09:27 ?181次閱讀
    <b class='flag-5'>零基</b>礎<b class='flag-5'>開發</b>AiPi-<b class='flag-5'>Eyes-S1</b>——通過屏幕輸入連接Wi-Fi

    小安 DSL做一個天氣站

    前言 小安-DSL(AiPi-DSL) 是安信可開源團隊專門為Ai-M61-32S設計的一款屏幕驅動開發板,支持2.8/3.5寸等30Pin SPI顯示屏、2.4寸及1.28寸等18
    的頭像 發表于 01-06 16:44 ?181次閱讀
    用<b class='flag-5'>小安</b><b class='flag-5'>派</b> DSL做一個天氣站

    零基開發小安-Eyes-S1【進階】——初識 LVGL 并搭建最小工程

    等。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預留TF卡座,并且引出USB接口,可接入USB攝像頭。 從開始學習小安
    的頭像 發表于 01-06 16:14 ?186次閱讀
    <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>】——初識 LVGL 并搭建最小工程

    零基開發小安-Eyes-S1——初識LVGL并搭建最小工程

    等。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預留TF卡座,并且引出USB接口,可接入USB攝像頭。 從開始學習小安
    的頭像 發表于 01-03 14:09 ?400次閱讀

    使用小安DSL制作天氣站

    小安 DSL做天氣站 用戶分享DIY ? 前言 小安-DSL(AiPi-DSL) 是安信可開源團隊專門為Ai-M61-32S設計的一款
    的頭像 發表于 01-03 11:18 ?190次閱讀
    使用<b class='flag-5'>小安</b><b class='flag-5'>派</b>DSL制作天氣站

    零基開發小安-Eyes-S1 外設——DAC

    等。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預留TF卡座,并且引出USB接口,可接入USB攝像頭。 從開始學習小安
    的頭像 發表于 12-27 10:55 ?899次閱讀
    <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>——DAC

    零基開發小安-Eyes-S1外設——I2S

    等。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預留TF卡座,并且引出USB接口,可接入USB攝像頭。 從開始學習小安
    的頭像 發表于 12-13 18:02 ?1144次閱讀
    <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>——I2<b class='flag-5'>S</b>

    電子DIY作品 小安R1做個86盒中控

    前言 筆者之前看小安的開源資料, 就對 R1 這個板子情有獨鐘 這就是為 86 盒而生啊 剛好安信可社區一直有積分兌換活動 (https://bbs.ai-thinker.com/) 這次就用
    的頭像 發表于 12-05 14:34 ?334次閱讀
    電子DIY作品 <b class='flag-5'>小安</b><b class='flag-5'>派</b>R<b class='flag-5'>1</b>做個86盒中控

    零基開發小安-Eyes-S1外設】——FLASH

    。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預留TF卡座,并且引出USB接口,可接入USB攝像頭。 從開始學習小安
    的頭像 發表于 12-05 14:31 ?291次閱讀
    <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>】——FLASH

    零基開發小安-Eyes-S1 外設 ——I2C

    。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預留TF卡座,并且引出USB接口,可接入USB攝像頭。 從開始學習小安
    的頭像 發表于 11-27 16:39 ?318次閱讀
    <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

    零基開發小安-Eyes-S1【入門】——工程文件架構

    -Eyes-S1【入門】——初識小安-Eyes-S12、零基
    的頭像 發表于 11-06 16:10 ?220次閱讀
    <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 ?807次閱讀
    <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 ?1084次閱讀
    <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 ?341次閱讀
    <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
    百家乐官网技巧-百家乐官网开户指定代理网址 | 百家乐官网注册开户送彩金| 查找百家乐官网群| 网上百家乐的玩法技巧和规则 | 足球注册网站| 百家乐官网板路| 上市百家乐评论| 全讯网1932888.com| 百家乐官网如何投注技巧| 百家乐娱乐求指点呀| 百家乐最新打法| 博彩生物| 百家乐官网强弱走势图| 红9百家乐的玩法技巧和规则| 百家乐官网美女真人| 百家乐分析博彩正网| 博彩通评价| 跪求百家乐官网打法| 百家乐游戏种类| 足球百家乐官网投注| 网上百家乐娱乐网| 网上百家乐官网的技巧| 百家乐象棋玩法| 成武县| 百家乐官网的出牌技巧| 永利高平台| 红桃K百家乐官网的玩法技巧和规则 | 阳谷县| 百家乐赢谷输缩| 百家乐官网游戏规测| 娱乐网百家乐官网的玩法技巧和规则 | 菲律宾云顶国际| 百家乐连闲几率| 菲律宾太子娱乐城| 百家乐官网机器出千| 大发888官方lc8| 韩国百家乐官网的玩法技巧和规则 | 鼎盛娱乐城开户| 百家乐官网是娱乐场最不公平的游戏 | 恒和国际| 澳门百家乐的赢钱不倒翁|