电子产业一站式赋能平台

PCB联盟网

搜索
查看: 1570|回复: 0
收起左侧

【HarmonyOS_Hi3861学习笔记】【连载】LED灯控制以及PWM控制

[复制链接]

2607

主题

2607

帖子

7472

积分

高级会员

Rank: 5Rank: 5

积分
7472
发表于 2020-12-31 09:56:41 | 显示全部楼层 |阅读模式
【HarmonyOS_Hi3861学习笔记】【连载】LED灯控制以及PWM控制, 功能很简单,就是操作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灭,实际上也不会灭。



微信截图_20201230214033.png (52.05 KB, 下载次数: 0)

下载附件  保存到相册  

红外感应电路

昨天 21:42 上传



到这里操作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,三色互不影响。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表