HI3861學(xué)習(xí)筆記(13)——PWM接口使用

一、簡介

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 日

? 參考:【鴻蒙2.0設(shè)備開發(fā)教程】小熊派HarmonyOS 鴻蒙·季 開發(fā)教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容