RVB2601开发板试用2——PWM的使用,既三色小灯驱动

简介: PWM信号的使用,既三色LED驱动显示

本文作者:我爱下载

 

1 概述

RVB2601评估板包含RGB三基色LED一个,为了学习PWM信号的驱动,我们可以通过驱动三基色LED来完成。


2 硬件接口描述

1.jpg


通过如上两个原理图对照可知。

序号

LED名称

GPIO(PWM)

1

LED_BLUE

PA7(CH7)

2

LED_GREEN

PA25(CH2)

3

LED_RED

PA4(CH4)

 

3 软件驱动设计    

3.1 PWM的CSI接口

驱动采用CSI接口实现。实际使用到CSI接口如下所示:

函数

说明

csi_pwm_init

初始化

csi_pwm_uninit

反初始化

csi_pwm_out_config

配置输出模式

csi_pwm_out_start

开始输出

csi_pwm_out_stop

停止输出


PWM接口详细说明

  • csi_pwm_init
csi_error_t csi_pwm_init(csi_pwm_t *pwm, uint32_t idx)


csi_pwm_t

成员

类型

说明

dev

csi_dev_t

csi设备统一句柄

callback

void (callback)(csi_pwm_t pwm, csi_pwm_event_t event, uint32_t ch, uint32_t time_us, void *arg)

用户回调函数

arg

void *

回调函数参数(用户自定义)

priv

void *

设备私有变量


  • csi_pwm_uninit
void csi_pwm_uninit(csi_pwm_t *pwm)


  • csi_pwm_out_config
csi_error_t csi_pwm_out_config(csi_pwm_t *pwm, 
                                     uint32_t channel, 
                                     uint32_t period_us, 
                                     uint32_t pulse_width_us,
                                     csi_pwm_polarity_t polarity)


csi_pwm_polarity_t

类型

说明

PWM_POLARITY_HIGH

高电平

PWM_POLARITY_LOW

低电平


  • csi_pwm_out_start
csi_error_t csi_pwm_out_start(csi_pwm_t *pwm, uint32_t channel)


  • csi_pwm_out_stop
void csi_pwm_out_stop(csi_pwm_t *pwm, uint32_t channel)


3.2 PIN的CSI接口

测试中用到的PIN的CSI接口说明如下所示:

函数

说明

csi_pin_set_mux

设置PIN的复用功能


接口详细说明

  • csi_pin_set_mux
csi_error_t csi_pin_set_mux(pin_name_t pin_name, pin_func_t pin_func)


4 软件测试代码

通过PWM接口完成三色灯亮度渐变调节驱动的测试程序。


4.1 初始化

void led_pinmux_init()
{
    csi_error_t ret;
    csi_pin_set_mux(PA7, PA7_PWM_CH7);    //设置PIN的复用功能
    csi_pin_set_mux(PA25, PA25_PWM_CH2);  //设置PIN的复用功能
    csi_pin_set_mux(PA4, PA4_PWM_CH4);    //设置PIN的复用功能
    ret = csi_pwm_init(&r, 0);        //初始化pwm设备
    if (ret != CSI_OK) {
            printf("===%s, %d\n", __FUNCTION__, __LINE__);
            return ;
}
//配置pwm通道的输出模式
    ret = csi_pwm_out_config(&r, 7 / 2, 300, 100, PWM_POLARITY_HIGH);
    if (ret != CSI_OK) {
            printf("===%s, %d\n", __FUNCTION__, __LINE__);
            return ;
    }
//配置pwm通道的输出模式
    ret = csi_pwm_out_config(&r, 2 / 2, 300, 100, PWM_POLARITY_HIGH);
    if (ret != CSI_OK) {
            printf("===%s, %d\n", __FUNCTION__, __LINE__);
            return ;
    }
//配置pwm通道的输出模式
    ret = csi_pwm_out_config(&r, 4 / 2, 300, 100, PWM_POLARITY_HIGH);
    if (ret != CSI_OK) {
            printf("===%s, %d\n", __FUNCTION__, __LINE__);
            return ;
    }
}

image.gifimage.gif

4.2 三色led亮度PWM控制

  • 点亮led
csi_pwm_out_stop(&r, 2 / 2);
csi_pwm_out_stop(&r, 7 / 2);
csi_pwm_out_stop(&r, 4 / 2);

image.gifimage.gif

  • 熄灭led
csi_pwm_out_start(&r, 7 / 2);
csi_pwm_out_start(&r, 2 / 2);
csi_pwm_out_start(&r, 4 / 2);

image.gifimage.gif

  • 亮度调节控制
void  ft_led_slow_change(void)
{
    csi_error_t ret;
    if (g_led_refresh) {
        if (g_ctr == 0)
        {
      ret = csi_pwm_out_config(&r, 7 / 2, 300, led_pwm_count, PWM_POLARITY_HIGH);
      if (ret != CSI_OK) {
          printf("===%s, %d\n", __FUNCTION__, __LINE__);
          return ;
      }
      if(led_change_flag == 0)
      {
        if(led_pwm_count == 0)
        {
          csi_pwm_out_start(&r, 7 / 2);
          csi_pwm_out_stop(&r, 2 / 2);
          csi_pwm_out_stop(&r, 4 / 2);
        }
        led_pwm_count += 10;
        if(led_pwm_count >= 300)
        {
          led_change_flag = 1;
        }
      }
      else
      {
        if(led_pwm_count > 10)
        {
          led_pwm_count -= 10;
        }
        else
        {
          led_pwm_count = 0;
          led_change_flag = 0;
          g_ctr++;
          if (g_ctr == 3) {
              g_ctr = 0;
          }
        }
      }
        }
        else if (g_ctr == 1)
        {
        //25
      ret = csi_pwm_out_config(&r, 2 / 2, 300, led_pwm_count, PWM_POLARITY_HIGH);
      if (ret != CSI_OK) {
          printf("===%s, %d\n", __FUNCTION__, __LINE__);
          return ;
      }
      if(led_change_flag == 0)
      {
        if(led_pwm_count == 0)
        {
          csi_pwm_out_start(&r, 2 / 2);
          csi_pwm_out_stop(&r, 7 / 2);
          csi_pwm_out_stop(&r, 4 / 2);
        }
        led_pwm_count += 10;
        if(led_pwm_count >= 300)
        {
          led_change_flag = 1;
        }
      }
      else
      {
        if(led_pwm_count > 10)
        {
          led_pwm_count -= 10;
        }
        else
        {
          led_pwm_count = 0;
          led_change_flag = 0;
          g_ctr++;
          if (g_ctr == 3) {
              g_ctr = 0;
          }
        }
      }
        }
        else //2
        {
        //4
      ret = csi_pwm_out_config(&r, 4 / 2, 300, led_pwm_count, PWM_POLARITY_HIGH);
      if (ret != CSI_OK) {
          printf("===%s, %d\n", __FUNCTION__, __LINE__);
          return ;
      }
      if(led_change_flag == 0)
      {
        if(led_pwm_count == 0)
        {
          csi_pwm_out_start(&r, 4 / 2);
          csi_pwm_out_stop(&r, 7 / 2);
          csi_pwm_out_stop(&r, 2 / 2);
        }
        led_pwm_count += 10;
        if(led_pwm_count >= 300)
        {
          led_change_flag = 1;
        }
      }
      else
      {
        if(led_pwm_count > 10)
        {
          led_pwm_count -= 10;
        }
        else
        {
          led_pwm_count = 0;
          led_change_flag = 0;
          g_ctr++;
          if (g_ctr == 3) {
              g_ctr = 0;
          }
        }
      }
        }
    }
}


5 演示视频

>>>点击此处观看演示视频


本文源自:平头哥芯片开放社区(OCC)

相关文章
|
程序员
宝塔海外版aapanel中文语言包
这篇文章介绍了宝塔海外版aapanel中文语言包的安装方法。由于宝塔国内版强制登录账号,很多用户开始使用宝塔海外版aapanel,但是该版本是全英文的。该汉化包是基于6.8.26版本制作的,适用于一些不习惯英文界面的用户。安装步骤包括下载、解压、上传和覆盖文件,并重新启动宝塔面板。
3036 0
|
传感器 Rust 安全
为什么物联网领域使用Rust的项目越来越多?
2021年2月8日,Rust基金会成立,Rust商标及所有权移交给基金会。
为什么物联网领域使用Rust的项目越来越多?
|
6月前
|
运维 Linux API
OpenClaw Docker容器化部署、生命周期管理指南|阿里云+本地部署+千问API配置+运维实战+故障排查
2026年,Docker容器化已成为OpenClaw(Clawdbot)部署的首选方案——通过容器封装,可实现环境一致性、安全隔离、快速迁移的核心优势,彻底解决“本地能跑、云端崩”的环境兼容问题。无论是阿里云服务器的长期稳定运行,还是本地MacOS/Linux/Windows11的开发调试,Docker都能提供标准化的部署与管理流程。
892 0
|
固态存储 Windows
Win10 回收站删除的文件还能恢复吗?
本文介绍了Win10清空回收站后误删文件的恢复方法。回收站清空后文件仍有机会恢复,关键在于及时停止磁盘写入并选择合适工具。文章提供三种方法:使用系统“文件历史记录”、借助专业恢复软件(如DiskGenius)、或联系数据恢复服务,帮助不同情况下的用户找回丢失文件。
|
8月前
|
域名解析 弹性计算 安全
2026年阿里云服务器使用全教程:从配置选型到 WordPress 网站搭建
阿里云服务器(含 ECS 与轻量应用服务器)的使用需遵循 “选型 - 环境配置 - 应用部署 - 上线验证” 的核心流程,不同用户可根据技术基础与业务需求选择适配方案。本文以搭建 WordPress 博客为例,结合官方标准操作与实操细节,详解从服务器配置选择到网站上线的完整步骤,同时补充轻量与 ECS 的差异及远程连接、安全配置等关键要点,帮助用户高效上手。
|
C++
CMake教程8:在Vscode中使用CMake
CMake教程8:在Vscode中使用CMake
1229 0
|
Kubernetes 网络协议 安全
[kubernetes]二进制方式部署单机k8s-v1.30.5
[kubernetes]二进制方式部署单机k8s-v1.30.5
|
存储 开发者 Python
六种方法实现Python文件之间的互动
六种方法实现Python文件之间的互动
960 0
|
Android开发 iOS开发
了解iOS消息推送一文就够:史上最全iOS Push技术详解
本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表。 1、引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ、微信等IM界面处于前台时,聊天消息和指令都会通过IM自建的网络长连接通道推送过来,这种Pu...
4256 0
|
调度 芯片
【玩转RT-Thread】 时钟管理(原理+实战)
【玩转RT-Thread】 时钟管理(原理+实战)
1310 0