RVB2601评估板试用 2 PWM的使用,既三色小灯驱动
[复制链接]
本帖最后由 我爱下载 于 2021-7-27 15:25 编辑
PWM信号的使用,既三色LED驱动显示
1 概述
RVB2601评估板包含RGB三基色LED一个,为了学习PWM信号的驱动,我们可以通过驱动三基色LED来完成。
2 硬件接口描述
通过如上两个原理图对照可知。
序号
|
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_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 *
|
设备私有变量
|
void csi_pwm_uninit(csi_pwm_t *pwm)
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_error_t csi_pwm_out_start(csi_pwm_t *pwm, uint32_t channel)
void csi_pwm_out_stop(csi_pwm_t *pwm, uint32_t channel)
3.2 PIN的CSI接口
测试中用到的PIN的CSI接口说明如下所示:
函数
|
说明
|
csi_pin_set_mux
|
设置PIN的复用功能
|
接口详细说明
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 ;
}
}
4.2 三色led亮度PWM控制
csi_pwm_out_stop(&r, 2 / 2);
csi_pwm_out_stop(&r, 7 / 2);
csi_pwm_out_stop(&r, 4 / 2);
csi_pwm_out_start(&r, 7 / 2);
csi_pwm_out_start(&r, 2 / 2);
csi_pwm_out_start(&r, 4 / 2);
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 演示视频
|