功能很簡單,就是操作GPIO控制LED亮滅以及PWM輸出控制LED明亮度,但是在這個(gè)過程中遇到很多問題。
首先是GPIO輸出高低電平控制LED燈亮滅。查看官方文提供的原理圖,找到燈部分的電路。發(fā)現(xiàn)燈板其實(shí)有兩塊,只是其中一塊是交通燈板,另外一塊是三色RGB燈??刂埔_完全相同。這里以RGB燈板為例。
根據(jù)接口再去底板接口那里去查看,可以對應(yīng)出:
紅色--GPIO10_PWM1
綠色--GPIO11_PWM2
藍(lán)色--GPIO12_PWM3
核心板的LED1--GPIO9
接下來的修改就是直接在SDK中的ap/iothardware/led_example.c中進(jìn)行修改了。里面已經(jīng)有了GPIO的初始化以及調(diào)用了,這里只是增加和修改引腳而已。
注意:例程里面用的GPIO9,也就是核心板上的LED1.如果插上的是RGB燈板,則LED1始終亮,不會隨引腳改變而改變。這一點(diǎn)讓我懷疑代碼懷疑了很久,后來查電路圖才發(fā)現(xiàn)RGB燈板GPIO9引腳接了紅外檢測引腳。這個(gè)引腳是上拉的,也就是說就是主控下拉讓LED1滅,實(shí)際上也不會滅。
到這里操作GPIO就完成了,很簡單,就在官方的例程里面修改就行了。但是,還沒結(jié)束,上面也說了,RGB這三個(gè)引腳是復(fù)用功能,可以復(fù)用PWM輸出功能,這里繼續(xù)將代碼改為PWM控制。
首先初始化GPIO,然后將這3個(gè)引腳設(shè)為PWM復(fù)用輸出功能,并指定PWM的時(shí)鐘。
#define LED_RED WIFI_IOT_IO_NAME_GPIO_10#define LED_GREEN WIFI_IOT_IO_NAME_GPIO_11#define LED_BLUE WIFI_IOT_IO_NAME_GPIO_12
GpioInit();
IoSetFunc(LED_RED, WIFI_IOT_IO_FUNC_GPIO_10_PWM1_OUT);
GpioSetDir(LED_RED, WIFI_IOT_GPIO_DIR_OUT);
IoSetFunc(LED_GREEN, WIFI_IOT_IO_FUNC_GPIO_11_PWM2_OUT);
GpioSetDir(LED_GREEN, WIFI_IOT_GPIO_DIR_OUT);
IoSetFunc(LED_BLUE, WIFI_IOT_IO_FUNC_GPIO_12_PWM3_OUT);
GpioSetDir(LED_BLUE, WIFI_IOT_GPIO_DIR_OUT);
hi_pwm_init(HI_PWM_PORT_PWM1);
hi_pwm_init(HI_PWM_PORT_PWM2);
hi_pwm_init(HI_PWM_PORT_PWM3);
hi_pwm_set_clock(PWM_CLK_160M);
完成初始化后就是功能了,控制pwm占空比調(diào)節(jié)led亮度。
void LedPWM(uint16 pwm_r, uint16 pwm_g, uint16 pwm_b){
hi_pwm_start(HI_PWM_PORT_PWM1, pwm_r, 1600);
hi_pwm_start(HI_PWM_PORT_PWM2, pwm_g, 1600);
hi_pwm_start(HI_PWM_PORT_PWM3, pwm_b, 1600);}
這一段在while(1)里面循環(huán)執(zhí)行,改變PWM占空比的值。
switch(sta) { case 0: if(pwm_R 《 1500) pwm_R += 5; else { sta = 1; pwm_R = 2; pwm_G = 2; pwm_B = 2; }
break; case 1: if(pwm_G 《 1200) pwm_G += 5; else { sta = 2; pwm_R = 2; pwm_G = 2; pwm_B = 2; }
break; case 2: if(pwm_B 《 1200) pwm_B += 5; else { sta = 0; pwm_R = 2; pwm_G = 2; pwm_B = 2; }
break; } LedPWM(pwm_R, pwm_G, pwm_B); usleep(2);
PWM相關(guān)的函數(shù)都是在hi_PWM.h中定義的,所以要引用這個(gè)頭文件,另外這個(gè)例子所在的BUILD.gn文件中也要新增其所在的位置:“//vendor/hisi/hi3861/hi3861//include”。
在app所在的BUILD.gn里面的features項(xiàng)目中加入新增的led_example.c所在的路徑:“iothardware:led_example”,到這里貌似都完成了設(shè)置以及實(shí)現(xiàn)。但是編譯的時(shí)候直接報(bào)錯(cuò):undefined reference to hi_PWM_start以及其他幾個(gè)函數(shù)的錯(cuò)誤。
這個(gè)問題糾結(jié)了我好久。后來還是看連志安的ole驅(qū)動中的IIC操作才知道要在hi3861驅(qū)動中配置打開PWM功能才會編譯PWM部分進(jìn)代碼,不然始終找不到具體的實(shí)現(xiàn)。編譯通不過。
具體在vendor/hisi/hi3861/hi3861/build/config/usr_config.mk文件中新增CONFIG_PWM_SUPPORT=y 才行。
不熟悉整個(gè)框架遇到問題并不好處理。
另外調(diào)試PWM過程中發(fā)現(xiàn)hi_PWM_start函數(shù)中的duty參數(shù)不要設(shè)置為0。在調(diào)試3色時(shí)候兩色設(shè)為0,實(shí)際上是白色,都亮了。后來設(shè)置為2就ok,三色互不影響。
責(zé)任編輯:lq
-
led燈
+關(guān)注
關(guān)注
22文章
1592瀏覽量
108096 -
PWM
+關(guān)注
關(guān)注
114文章
5191瀏覽量
214175 -
GPIO
+關(guān)注
關(guān)注
16文章
1205瀏覽量
52163 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3727瀏覽量
16382
原文標(biāo)題:WiFi-IoT套件的LED燈控制以及PWM控制
文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發(fā)燒友開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論