功能很簡單,就是操作GPIO控制LED亮滅以及PWM輸出控制LED明亮度,但是在這個過程中遇到很多問題。
首先是GPIO輸出高低電平控制LED燈亮滅。查看官方文提供的原理圖,找到燈部分的電路。發現燈板其實有兩塊,只是其中一塊是交通燈板,另外一塊是三色RGB燈。控制引腳完全相同。這里以RGB燈板為例。
根據接口再去底板接口那里去查看,可以對應出:
紅色--GPIO10_PWM1
綠色--GPIO11_PWM2
藍色--GPIO12_PWM3
核心板的LED1--GPIO9
接下來的修改就是直接在SDK中的ap/iothardware/led_example.c中進行修改了。里面已經有了GPIO的初始化以及調用了,這里只是增加和修改引腳而已。
注意:例程里面用的GPIO9,也就是核心板上的LED1.如果插上的是RGB燈板,則LED1始終亮,不會隨引腳改變而改變。這一點讓我懷疑代碼懷疑了很久,后來查電路圖才發現RGB燈板GPIO9引腳接了紅外檢測引腳。這個引腳是上拉的,也就是說就是主控下拉讓LED1滅,實際上也不會滅。
到這里操作GPIO就完成了,很簡單,就在官方的例程里面修改就行了。但是,還沒結束,上面也說了,RGB這三個引腳是復用功能,可以復用PWM輸出功能,這里繼續將代碼改為PWM控制。
首先初始化GPIO,然后將這3個引腳設為PWM復用輸出功能,并指定PWM的時鐘。
#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占空比調節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)里面循環執行,改變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相關的函數都是在hi_PWM.h中定義的,所以要引用這個頭文件,另外這個例子所在的BUILD.gn文件中也要新增其所在的位置:“//vendor/hisi/hi3861/hi3861//include”。
在app所在的BUILD.gn里面的features項目中加入新增的led_example.c所在的路徑:“iothardware:led_example”,到這里貌似都完成了設置以及實現。但是編譯的時候直接報錯:undefined reference to hi_PWM_start以及其他幾個函數的錯誤。
這個問題糾結了我好久。后來還是看連志安的ole驅動中的IIC操作才知道要在hi3861驅動中配置打開PWM功能才會編譯PWM部分進代碼,不然始終找不到具體的實現。編譯通不過。
具體在vendor/hisi/hi3861/hi3861/build/config/usr_config.mk文件中新增CONFIG_PWM_SUPPORT=y 才行。
不熟悉整個框架遇到問題并不好處理。
另外調試PWM過程中發現hi_PWM_start函數中的duty參數不要設置為0。在調試3色時候兩色設為0,實際上是白色,都亮了。后來設置為2就ok,三色互不影響。
責任編輯:lq
-
led燈
+關注
關注
22文章
1592瀏覽量
107841 -
PWM
+關注
關注
114文章
5146瀏覽量
213410 -
GPIO
+關注
關注
16文章
1196瀏覽量
51919 -
OpenHarmony
+關注
關注
25文章
3661瀏覽量
16159
原文標題:WiFi-IoT套件的LED燈控制以及PWM控制
文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發燒友開源社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論