一、簡介
1.1 PWM
脈沖寬度調(diào)制(PWM),是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調(diào)試。 是利用微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制的一種非常有效的技術(shù)。廣泛應(yīng)用在從測量、通信到功率控制與變換的許多領(lǐng)域中。
例如上圖中,圖b)是微處理輸出的數(shù)字信號,實際上他接到電機(jī)等功率設(shè)備上時,效果相當(dāng)于圖a)。這就是PWM調(diào)制。例如輸出占空比為50%,頻率為10Hz的脈沖,高電平為3.3V.則其輸出的模擬效果相當(dāng)于輸出一個1.65V的高電平。脈沖調(diào)制有兩個重要的參數(shù),第一個就是輸出頻率,頻率越高,則模擬的效果越好。第二個就是占空比。占空比就是改變輸出模擬效果的電壓大小。占空比越大則模擬出的電壓越大。
1.2 GPIO復(fù)用功能
HI3861V100 芯片有 15 個 GPIO,引腳分布如下:


其中 PWM 端口有 6 個,每個 GPIO 可復(fù)用成 PWM 的端口如下:
| Pin | 管腳名稱 | 復(fù)用信號 |
|---|---|---|
| 2 | GPIO_00 | PWM3_OUT |
| 3 | GPIO_01 | PWM4_OUT |
| 4 | GPIO_02 | PWM2_OUT |
| 5 | GPIO_03 | PWM5_OUT |
| 6 | GPIO_04 | PWM1_OUT |
| 17 | GPIO_05 | PWM2_OUT |
| 18 | GPIO_06 | PWM3_OUT |
| 19 | GPIO_07 | PWM0_OUT |
| 20 | GPIO_08 | PWM1_OUT |
| 27 | GPIO_09 | PWM0_OUT |
| 28 | GPIO_10 | PWM1_OUT |
| 29 | GPIO_11 | PWM2_OUT |
| 30 | GPIO_12 | PWM3_OUT |
| 31 | GPIO_13 | PWM4_OUT |
| 32 | GPIO_14 | PWM5_OUT |
二、API說明
以下 GPIO 接口位于 base\iot_hardware\interfaces\kits\wifiiot_lite\wifiiot_gpio.h。
2.1 GpioInit
| 功能 | 初始化GPIO外設(shè) |
|---|---|
| 函數(shù)定義 | unsigned int GpioInit(void) |
| 參數(shù) | 無 |
| 返回 | 錯誤碼 |
2.2 GpioSetDir
| 功能 | 設(shè)置GPIO輸出方向 |
|---|---|
| 函數(shù)定義 | unsigned int GpioSetDir(WifiIotGpioIdx id, WifiIotGpioDir dir) |
| 參數(shù) | id:表示GPIO引腳號 dir:表示GPIO輸出方向 |
| 返回 | 錯誤碼 |
以下擴(kuò)展 GPIO 接口位于 base\iot_hardware\interfaces\kits\wifiiot_lite\wifiiot_gpio_ex.h。
2.3 IoSetFunc
| 功能 | 設(shè)置GPIO引腳功能 |
|---|---|
| 函數(shù)定義 | unsigned int IoSetFunc(WifiIotIoName id, unsigned char val) |
| 參數(shù) | id:表示GPIO引腳號 val:表示IO復(fù)用功能 |
| 返回 | 錯誤碼 |
以下 PWM 接口位于 base\iot_hardware\interfaces\kits\wifiiot_lite\wifiiot_pwm.h。
業(yè)務(wù)BUILD.gn中包含路徑
include_dirs = [
"http://utils/native/lite/include",
"http://kernel/liteos_m/components/cmsis/2.0",
"http://base/iot_hardware/interfaces/kits/wifiiot_lite",
]
2.5 PwmInit
| 功能 | 初始化PWM功能 |
|---|---|
| 函數(shù)定義 | unsigned int PwmInit (WifiIotPwmPort port) |
| 參數(shù) | port:初始化PWM端口號 |
| 返回 | 錯誤碼 |
2.6 PwmStart
| 功能 | 根據(jù)輸入?yún)?shù)輸出PWM信號 |
|---|---|
| 函數(shù)定義 | unsigned int PwmStart(WifiIotPwmPort port, unsigned short duty, unsigned short freq) |
| 參數(shù) | port:PWM端口號 duty:占空比 freq:分頻倍數(shù) |
| 返回 | 錯誤碼 |
2.7 PwmStop
| 功能 | 關(guān)閉PWM輸出信號 |
|---|---|
| 函數(shù)定義 | unsigned int PwmStop(WifiIotPwmPort port) |
| 參數(shù) | port:初始化PWM端口號 |
| 返回 | 錯誤碼 |
三、使用GPIO的PWM功能實現(xiàn)呼吸燈的效果
編譯時在業(yè)務(wù)BUILD.gn中包含路徑
include_dirs = [
"http://utils/native/lite/include",
"http://kernel/liteos_m/components/cmsis/2.0",
"http://base/iot_hardware/interfaces/kits/wifiiot_lite",
]
使用板載的LED來驗證GPIO的PWM功能,在BearPi-HM_Nano開發(fā)板上LED的連接電路圖如下圖所示,LED的控制引腳與主控芯片的GPIO_2連接,所以需要編寫軟件去控制GPIO_2輸出PWM波實現(xiàn)呼吸燈的效果。

#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_pwm.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#define PWM_TASK_STACK_SIZE 512
#define PWM_TASK_PRIO 25
static void PWMTask(void)
{
unsigned int i;
//初始化GPIO
GpioInit();
//設(shè)置GPIO_2引腳復(fù)用功能為PWM
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_2, WIFI_IOT_IO_FUNC_GPIO_2_PWM2_OUT);
//設(shè)置GPIO_2引腳為輸出模式
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_2, WIFI_IOT_GPIO_DIR_OUT);
//初始化PWM2端口
PwmInit(WIFI_IOT_PWM_PORT_PWM2);
while (1)
{
for (i = 0; i < 40000; i += 100)
{
//輸出不同占空比的PWM波
PwmStart(WIFI_IOT_PWM_PORT_PWM2, i, 40000);
usleep(10);
}
i = 0;
}
}
static void PWMExampleEntry(void)
{
osThreadAttr_t attr;
attr.name = "PWMTask";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 512;
attr.priority = 25;
if (osThreadNew((osThreadFunc_t)PWMTask, NULL, &attr) == NULL)
{
printf("Falied to create PWMTask!\n");
}
}
APP_FEATURE_INIT(PWMExampleEntry);
? 由 Leung 寫于 2021 年 10 月 9 日
