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

本文作者:我爱下载

 

1 概述

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


2 硬件接口描述

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


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

序号

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 ;
    }
}

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

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);

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

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

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

  • 亮度调节控制
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)

上一篇:Better late than never~ Oxygen Forensic Detective supports APK Downgrade Extraction now~


下一篇:PAT 乙级 1095.解码PAT准考证 C++/Java