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)

相关文章
|
4月前
|
异构计算
FPGA新起点V1开发板(十)——按键控制LED
FPGA新起点V1开发板(十)——按键控制LED
FPGA新起点V1开发板(十)——按键控制LED
|
4月前
stm32f407探索者开发板(十五)——NVIC中断优先级管理
stm32f407探索者开发板(十五)——NVIC中断优先级管理
143 0
|
4月前
stm32f407探索者开发板(十)——时钟系统精讲
stm32f407探索者开发板(十)——时钟系统精讲
|
Ubuntu Linux 芯片
史上最全的LED点灯程序—使用STM32、FPGA、Linux点亮你的LED灯
不知道小伙伴们点亮过多少板子的LED灯,有很多小伙伴留言说讲一下stm32、fpga、liunx他们之间有什么不同,不同点很多,口说无凭,今天就来点亮一下stm32、fpga和liunx板子的led灯,大家大致看一下点灯流程和点灯环境以及点灯流程,就能大概的了解一下三者的区别,可以有选择的去学习!
384 0
史上最全的LED点灯程序—使用STM32、FPGA、Linux点亮你的LED灯
|
Ubuntu Linux Shell
如何让系统在板子上跑起来(基于阿尔法开发板-imx6ull)
如何让系统在板子上跑起来(基于阿尔法开发板-imx6ull)
200 0
|
开发者
野火F1开发板STM32案例-外部中断(按键)使用
野火F1开发板STM32案例-外部中断(按键)使用
121 0
|
存储 Linux API
ZYNQ裸板:串口篇
使用 PS 的时候,通常会添加 UART 控制器,用于打印信息和调试代码。除此之外, PS 在和外部设备通信时,也会经常使用串口进行通信。先从UART控制器开始讲起吧,从简单的测试再到工程实例。
868 0
ZYNQ裸板:串口篇
stm32f407探索者开发板(七)——蜂鸣器实验
stm32f407探索者开发板(七)——蜂鸣器实验
242 0
stm32f407探索者开发板(七)——蜂鸣器实验
stm32f407探索者开发板(五)——跑马灯实验(寄存器版本)
stm32f407探索者开发板(五)——跑马灯实验(寄存器版本)
322 0
stm32f407探索者开发板(五)——跑马灯实验(寄存器版本)
|
异构计算
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(上)
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(上)
269 0
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(上)