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)

相关文章
|
存储 SQL 数据库连接
MPPDB分布式结构化数据库
1.MPPDB简介 MPP,它是一款 Shared Nothing 架构的分布式并行数据库集群,具备高性能、高可用、高扩展特性,可以为超大规模数据管理提供高性价比的通用计算平台,并广泛地用于支撑各类数据仓库系统、BI 系统和决策支持系统。
6976 0
|
人工智能 小程序 Java
【评测】玩转阿里云《10 分钟构建 AI 客服并应用到网站、钉钉或微信中》
本文介绍了使用阿里云百炼大模型在10分钟内构建AI客服,并应用于网站、钉钉或微信中的体验。作者“JavaDog程序狗”详细描述了从搭建到完成的全过程,包括快速上手、遇到的问题及解决方法、定制化需求以及云产品的整体体验。文档清晰易懂,集成过程顺畅,客服支持响应迅速,定制功能满足特定业务需求,总体体验极佳,适合开发者尝试。
505 5
【评测】玩转阿里云《10 分钟构建 AI 客服并应用到网站、钉钉或微信中》
|
算法 调度 UED
深入理解操作系统的调度算法
【9月更文挑战第22天】本文通过深入浅出的方式,介绍了操作系统中的核心概念——调度算法。文章首先解释了调度算法的基本定义和重要性,然后详细分析了先来先服务(FCFS)、短作业优先(SJF)以及时间片轮转(RR)三种常见的调度算法。每种算法都配有简单的代码示例,帮助读者更好地理解其工作原理。最后,文章探讨了这些调度算法在现代操作系统中的应用及其优缺点,旨在为读者提供对操作系统调度机制的全面认识。
|
机器学习/深度学习 PyTorch TensorFlow
TensorFlow和PyTorch的实际应用比较
TensorFlow和PyTorch的实际应用比较
254 2
|
消息中间件 Java 数据库连接
理解java的springboot+mybatisplus+dubbo+nacos+kafka这一套技术栈
理解java的springboot+mybatisplus+dubbo+nacos+kafka这一套技术栈
317 0
在Linux中,如何把系统中不用服务关掉?
在Linux中,如何把系统中不用服务关掉?
|
机器学习/深度学习 人工智能 自然语言处理
【人工智能】TensorFlow简介,应用场景,使用方法以及项目实践及案例分析,附带源代码
TensorFlow是由Google Brain团队开发的开源机器学习库,广泛用于各种复杂的数学计算,特别是涉及深度学习的计算。它提供了丰富的工具和资源,用于构建和训练机器学习模型。TensorFlow的核心是计算图(Computation Graph),这是一种用于表示计算流程的图结构,由节点(代表操作)和边(代表数据流)组成。
448 0
Rust安装、更新、卸载
Rust安装、更新、卸载
1157 0
|
人工智能 安全 物联网
未来安卓系统的发展趋势与挑战分析
随着移动技术的飞速发展,安卓系统在智能手机和智能设备领域占据着重要地位。本文探讨了未来安卓系统的发展趋势及其面临的挑战,包括人工智能集成、安全性提升和生态系统扩展等方面。通过分析当前技术进展和市场需求,展望了安卓系统可能的发展方向,为技术研究和产业发展提供了新的视角。 【7月更文挑战第7天】
500 0
|
编译器 C++
【C++11保姆级教程】delete和default关键字
【C++11保姆级教程】delete和default关键字
688 0