
AiPi-Eyes-S1是安信可開(kāi)源團(tuán)隊(duì)專門(mén)為Ai-M61-32S設(shè)計(jì)的一款開(kāi)發(fā)板,支持WiFi6、BLE5.3。所搭載的Ai-M61-32S 模組具有豐富的外設(shè)接口,具體包括 DVP、MJPEG、Dispaly、AudioCodec、USB2.0、SDU、以太網(wǎng) (EMAC)、SD/MMC(SDH)、SPI、UART、I2C、I2S、PWM、GPDAC、GPADC、ACOMP 和 GPIO 等。
AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預(yù)留TF卡座,并且引出USB接口,可接入U(xiǎn)SB攝像頭。
從零開(kāi)始學(xué)習(xí)小安派:
1、零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【入門(mén)篇】——初識(shí)小安派-Eyes-S1
2、零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【入門(mén)篇】——安裝VMware與Ubuntu
3、入門(mén)篇:零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1——新建工程并燒錄調(diào)試
4、零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1入門(mén)篇——Win下SSH連接Linux
5、零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【入門(mén)篇】——Samba共享文件夾
6、零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【入門(mén)篇】——工程文件架構(gòu)
7、零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【外設(shè)篇】——GPIO 輸入輸出
8、零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【外設(shè)篇】——GPIO中斷編程
PWM 是英文“Pulse Width Modulation”的縮寫(xiě),簡(jiǎn)稱脈寬調(diào)制。一般 IO 口輸出是高低電平,是數(shù)字信號(hào),電壓是以 1 或 0 的重復(fù)脈沖來(lái)模擬負(fù)載,我們可以通過(guò)對(duì)一個(gè)脈沖信號(hào)的高低電平時(shí)間控制來(lái)將數(shù)字信號(hào)模擬成模擬電壓信號(hào),這也是 PWM 最大的用處??偨Y(jié)下來(lái)就是,通過(guò)一個(gè)周期內(nèi)改變占空比的方式來(lái)改變輸出的有效電壓。下面普及幾個(gè) PWM 的概念。
PWM 頻率: 一秒鐘內(nèi),信號(hào)完整的從高電平到低電平的次數(shù)(完整的一個(gè)脈沖周期),單位是 Hz。1Hz 也就是一秒鐘一個(gè)脈沖周期,周期是 1000ms。
PWM 周期: 周期=1/頻率,也就是周期與頻率互為倒數(shù),單位一般是 ms,若頻率為 5Hz,周期也就是 1/5=0.2S=200ms。
PWM 占空比: 一個(gè)脈沖周期內(nèi),高電平的時(shí)間占整個(gè)周期時(shí)間的比例。單位是 %,高電平時(shí)間是 50ms,周期是 100ms。占空比就是 50/100*100%=50%。
了解小安派-Eyes-S1 的 PWM
小安派使用的 M61 模組是 BL618 芯片,基于 LHAL 庫(kù)只支持 PWM_V2,該 PWM 版本支持四個(gè) PWM 通道。
PWM V2 版本輸出有效極性。當(dāng)正向通道閾值位于設(shè)置的低閾值和高閾值之間,為有效極性,如果設(shè)置有效極性為高,則輸出高電平,反之輸出低電平。反向通道相反,閾值位于設(shè)置的低閾值和高閾值之外,為有效極性,如果設(shè)置有效極性為高,則輸出高電平,反之輸出低電平。
#define PWM_POLARITY_ACTIVE_LOW 0
#define PWM_POLARITY_ACTIVE_HIGH 1
1.struct bflb_pwm_v2_config_s
說(shuō)明:pwm_v2 初始化配置結(jié)構(gòu)體
struct bflb_pwm_v2_config_s {
uint8_t clk_source;
uint16_t clk_div;
uint16_t period;
};

PWM 最終產(chǎn)生的頻率為 clk_source/clk_div/period
2.struct bflb_pwm_v2_channel_config_s
說(shuō)明:pwm_v2 通道初始化配置結(jié)構(gòu)體
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
說(shuō)明:初始化 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
說(shuō)明: 復(fù)位 pwm。
void bflb_pwm_v2_deinit(struct bflb_device_s *dev);

5.bflb_pwm_v2_start
說(shuō)明: 啟動(dòng) pwm 輸出。
void bflb_pwm_v2_start(struct bflb_device_s *dev);

6.bflb_pwm_v2_stop
說(shuō)明: 關(guān)閉 pwm 輸出。
void bflb_pwm_v2_stop(struct bflb_device_s *dev);

7.bflb_pwm_v2_set_period
說(shuō)明: 修改 pwm 周期值,從而更改 pwm 輸出的頻率。
void bflb_pwm_v2_set_period(struct bflb_device_s *dev, uint16_t period);

8.bflb_pwm_v2_channel_init
說(shuō)明: 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
說(shuō)明: 設(shè)置 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
說(shuō)明: PWM 正向通道使能輸出。
void bflb_pwm_v2_channel_positive_start(struct bflb_device_s *dev, uint8_t ch);

11.bflb_pwm_v2_channel_negative_start
說(shuō)明: PWM 反向通道使能輸出。
void bflb_pwm_v2_channel_negative_start(struct bflb_device_s *dev, uint8_t ch);

12.bflb_pwm_v2_channel_positive_stop
說(shuō)明: PWM 正向通道停止輸出。
void bflb_pwm_v2_channel_positive_stop(struct bflb_device_s *dev, uint8_t ch);

13.bflb_pwm_v2_channel_negative_stop
說(shuō)明: PWM 反向通道停止輸出。
void bflb_pwm_v2_channel_negative_stop(struct bflb_device_s *dev, uint8_t ch);

14.bflb_pwm_v2_int_enable
說(shuō)明: PWM 中斷使能和關(guān)閉。
void bflb_pwm_v2_int_enable(struct bflb_device_s *dev, uint32_t int_en, bool enable);

int_en 可以填入以下值,多個(gè)中斷可以使用 | 連接:
#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
說(shuō)明:獲取 PWM 中斷標(biāo)志。
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
說(shuō)明: 清除 PWM 中斷標(biāo)志。
void bflb_pwm_v2_int_clear(struct bflb_device_s *dev, uint32_t int_clear);

int_clear 可以填入以下參數(shù):
#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
說(shuō)明: PWM 其他特性相關(guān)控制,一般不常用。
int bflb_pwm_v2_feature_control(struct bflb_device_s *dev, int cmd, size_t arg);

cmd 可以填入以下參數(shù):
#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 實(shí)現(xiàn)呼吸燈
呼吸燈是 PWM 最常見(jiàn)的例子,非常的簡(jiǎn)單,首先將頻率調(diào)好,人眼識(shí)別的頻率大于 50Hz 時(shí),由于識(shí)別不了這么高的閃爍頻率,看起來(lái)就像常亮一樣??偨Y(jié)起來(lái)就是:
頻率很高時(shí),看不到閃爍,占空比越大,LED 越亮;頻率很低時(shí),可看到閃爍,占空比越大,LED 越亮。
所以我們只需要調(diào)好頻率,在改變占空比的情況下就可以看到 LED 燈亮度變化過(guò)程。在一個(gè) while 函數(shù)里實(shí)現(xiàn)即可。
Main
#include "bflb_mtimer.h" //mtimer定時(shí)器頭文件
#include "bflb_pwm_v2.h" //pwm_v2頭文件
#include "bflb_clock.h" //系統(tǒng)時(shí)鐘頭文件
#include "board.h" //開(kāi)發(fā)板頭文件,包裝的庫(kù)
#include "bflb_gpio.h" //gpio頭文件
struct bflb_device_s *pwm; //創(chuàng)建LHAL外設(shè)庫(kù)結(jié)構(gòu)體,名稱為pwm
void my_pwm_gpio_init() //編寫(xiě)一個(gè)選擇pwm輸出的gpio口初始化函數(shù)
{
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; //臨時(shí)變量i,作為改變占空比的變量
board_init(); //板子初始化
my_pwm_gpio_init(); //調(diào)用函數(shù),里面設(shè)置好了pwm輸出的gpio口
pwm = bflb_device_get_by_name("pwm_v2_0"); //給外設(shè)接口賦名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,
}; //設(shè)置PWM的頻率,選擇時(shí)鐘,分頻,和周期。根據(jù)上面的公式算出最終的頻率。
/*初始化PWM輸出*/
bflb_pwm_v2_init(pwm, &cfg);
bflb_pwm_v2_start(pwm); //將設(shè)置好的頻率開(kāi)啟pwm輸出
while (1) {
//藍(lán)燈呼吸亮滅
bflb_pwm_v2_channel_positive_start(pwm, PWM_CH0); //那么問(wèn)題來(lái)了,如何知道IO口對(duì)應(yīng)的PWM通道,后面會(huì)解答,IO0是通道0
for(i=150;i>0;i--)
{
bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH0, i, 150); //改變占空比,變量i會(huì)不斷變化
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 對(duì)應(yīng) PWM 通道
確定 IO 對(duì)應(yīng) PWM 通道
查看 BL616/618 的芯片數(shù)據(jù)手冊(cè):
bl616_bl618_ds_zh_cn_1.4.pdf (http://ai-thinker.com)

呼吸燈效果

-
開(kāi)源硬件
+關(guān)注
關(guān)注
8文章
218瀏覽量
30616
發(fā)布評(píng)論請(qǐng)先 登錄
【「零基礎(chǔ)開(kāi)發(fā)AI Agent」閱讀體驗(yàn)】+ 入門(mén)篇學(xué)習(xí)
功德+1,用小安派-Eyes-S1做一個(gè)電子木魚(yú)

零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1 進(jìn)階篇 ——通過(guò)屏幕輸入連接 Wi-Fi

零基礎(chǔ)開(kāi)發(fā)AiPi-Eyes-S1——通過(guò)屏幕輸入連接Wi-Fi

零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【進(jìn)階篇】——初識(shí) LVGL 并搭建最小工程

零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1——初識(shí)LVGL并搭建最小工程
使用小安派DSL制作天氣站

零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1 外設(shè)篇——DAC

零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1外設(shè)篇——I2S

零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【外設(shè)篇】——FLASH

零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1 外設(shè)篇 ——I2C

零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【入門(mén)篇】——工程文件架構(gòu)

零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1外設(shè)篇——GPIO中斷編程

零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1外設(shè)篇——GPIO 輸入輸出

開(kāi)發(fā)教程 零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1入門(mén)篇——Win下SSH連接Linux

評(píng)論