一限嫌、簡(jiǎn)介
1.1 PWM
脈沖寬度調(diào)制(PWM),是英文“Pulse Width Modulation”的縮寫(xiě),簡(jiǎn)稱脈寬調(diào)試哼蛆。 是利用微處理器的數(shù)字輸出來(lái)對(duì)模擬電路進(jìn)行控制的一種非常有效的技術(shù)。廣泛應(yīng)用在從測(cè)量霞赫、通信到功率控制與變換的許多領(lǐng)域中腮介。
例如上圖中,圖b)是微處理輸出的數(shù)字信號(hào)端衰,實(shí)際上他接到電機(jī)等功率設(shè)備上時(shí)叠洗,效果相當(dāng)于圖a)。這就是PWM調(diào)制旅东。例如輸出占空比為50%灭抑,頻率為10Hz的脈沖,高電平為3.3V.則其輸出的模擬效果相當(dāng)于輸出一個(gè)1.65V的高電平抵代。脈沖調(diào)制有兩個(gè)重要的參數(shù)腾节,第一個(gè)就是輸出頻率,頻率越高荤牍,則模擬的效果越好案腺。第二個(gè)就是占空比。占空比就是改變輸出模擬效果的電壓大小康吵。占空比越大則模擬出的電壓越大劈榨。
1.2 GPIO復(fù)用功能
HI3861V100 芯片有 15 個(gè) GPIO,引腳分布如下:
其中 PWM 端口有 6 個(gè)涎才,每個(gè) GPIO 可復(fù)用成 PWM 的端口如下:
Pin | 管腳名稱 | 復(fù)用信號(hào) |
---|---|---|
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說(shuō)明
以下 GPIO 接口位于 base\iot_hardware\interfaces\kits\wifiiot_lite\wifiiot_gpio.h力九。
2.1 GpioInit
功能 | 初始化GPIO外設(shè) |
---|---|
函數(shù)定義 | unsigned int GpioInit(void) |
參數(shù) | 無(wú) |
返回 | 錯(cuò)誤碼 |
2.2 GpioSetDir
功能 | 設(shè)置GPIO輸出方向 |
---|---|
函數(shù)定義 | unsigned int GpioSetDir(WifiIotGpioIdx id, WifiIotGpioDir dir) |
參數(shù) | id:表示GPIO引腳號(hào) dir:表示GPIO輸出方向 |
返回 | 錯(cuò)誤碼 |
以下擴(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引腳號(hào) val:表示IO復(fù)用功能 |
返回 | 錯(cuò)誤碼 |
以下 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端口號(hào) |
返回 | 錯(cuò)誤碼 |
2.6 PwmStart
功能 | 根據(jù)輸入?yún)?shù)輸出PWM信號(hào) |
---|---|
函數(shù)定義 | unsigned int PwmStart(WifiIotPwmPort port, unsigned short duty, unsigned short freq) |
參數(shù) | port:PWM端口號(hào) duty:占空比 freq:分頻倍數(shù) |
返回 | 錯(cuò)誤碼 |
2.7 PwmStop
功能 | 關(guān)閉PWM輸出信號(hào) |
---|---|
函數(shù)定義 | unsigned int PwmStop(WifiIotPwmPort port) |
參數(shù) | port:初始化PWM端口號(hào) |
返回 | 錯(cuò)誤碼 |
三跌前、使用GPIO的PWM功能實(shí)現(xiàn)呼吸燈的效果
編譯時(shí)在業(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來(lái)驗(yàn)證GPIO的PWM功能,在BearPi-HM_Nano開(kāi)發(fā)板上LED的連接電路圖如下圖所示陡舅,LED的控制引腳與主控芯片的GPIO_2連接抵乓,所以需要編寫(xiě)軟件去控制GPIO_2輸出PWM波實(shí)現(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 寫(xiě)于 2021 年 10 月 9 日
? 參考:【鴻蒙2.0設(shè)備開(kāi)發(fā)教程】小熊派HarmonyOS 鴻蒙·季 開(kāi)發(fā)教程