1885|3

288

帖子

0

TA的资源

纯净的硅(初级)

[国民技术N32WB452测评] 四、蓝牙控制RGB全彩氛围灯的实现 [复制链接]

国民技术的评测板,当初申请的目的,其实是想用它的5MADC的,只是后面由于工作方面的原因,一直没空做PCB板,不过,当初申请的时候也没有用这个。

申请评测的最后一个项目是全彩氛围灯的实现,通过蓝牙进行控制。

1、硬件实现

由于氛围灯带一般大多是12V的RGB灯带,所以就找了个车用方面的小灯来实现了

 在MOS管的G极引出线,就可以控制RGB全彩灯的显示了。

1661608229079.png  

2、软件控制

通过蓝牙发送信息至开发板,开发板接收后进行解析,然后通过PWM输出RGB三个通道的亮度分量,实现全彩氛围灯的显示。

  9306cea6969a46586068aae7706c6c7.jpg  

PWM通道选择的是TIM5的2、3、4通道,对应管脚为PA1、PA2、PA3。前面用TIM3的4个通道怎么调试也出不来,后面发现例程中已经用到了TIM3,在蓝牙组件的Eif_timer.c中。

  3、软件代码

例程还是用的蓝牙例程devBoardDemo(具体例程可以参考本人上一篇的评测文章,https://bbs.eeworld.com.cn/thread-1212702-1-1.html),对蓝牙接收数据部分做了一些简单处理,即接收数据解析。

case BT_EVENT_RCV_DATA:
            LED2_BLINK();
            length = bt_rcv_data(bt_packet_buf, size, character_uuid);
            
            if (length)
            {
//				log_debug("\r\nrcv data:");
//				for(ii=0;ii<length;ii++) log_debug(" %02X",bt_packet_buf[ii]);
				if((bt_packet_buf[0]=='R')&&(bt_packet_buf[1]=='G')&&(bt_packet_buf[2]='B')){
					RGBColor((char*)bt_packet_buf, length);
				}
                if(bt_total_rxlen == 0)
                {
                    bt_data_rxlen = 0;    
                    bt_total_rxlen = bt_packet_buf[0] + (bt_packet_buf[1]<<8) + 2;
                }
                memcpy(bt_data_buf+bt_data_rxlen, bt_packet_buf, length);
                bt_data_rxlen += length;
                if(bt_data_rxlen >= bt_total_rxlen)
                {
                    bt_data_finish_flag = 1;
                }
                
            }
            else
            {
                log_debug("rcv data err,\r\n");
            }
            
            break;

RGB全彩颜色的实现比较简单,也没有做颜色方面的修正,仅仅把RGB分量作为各自的亮度值,赋给PWM对应的各通道。

void RGBColor(char * Buf, uint16_t len)
{
	uint8_t RPercnt=0, GPercnt=0, BPercnt=0;
	uint16_t ColorVal = 0;
	char * str;
	
	str = Buf + 4;

	while((*str >= '0') && (*str <='9'))
		RPercnt = RPercnt * 10 + *str++ - '0';
	str++;

	while((*str >= '0') && (*str <='9'))
		GPercnt = GPercnt * 10 + *str++ - '0';
	str++;

	while((*str >= '0') && (*str <='9'))
		BPercnt = BPercnt * 10 + *str++ - '0';
	log_debug("R:%d,  G=%d,  B=%d\r\n",RPercnt,GPercnt,BPercnt);
	TIM5->CCDAT2 = RPercnt << 1;	
	TIM5->CCDAT3 = GPercnt << 1;
	TIM5->CCDAT4 = BPercnt << 1;
}

更改的内容还有一部分就是初始化代码了,主要用到了TIM5的3个道道

void TIM5_Init(void)
{
	TIM_TimeBaseInitType TIM_TimeBaseStructure;
	OCInitType TIM_OCInitStructure;
	uint16_t PrescalerValue = 0;
	GPIO_InitType GPIO_InitStructure;
	
	RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_TIM5, ENABLE);

    /* GPIOA and GPIOB clock enable */
    RCC_EnableAPB2PeriphClk(
        RCC_APB2_PERIPH_GPIOA | RCC_APB2_PERIPH_AFIO, ENABLE);
	
    /* GPIOA Configuration:TIM3 Channel1, 2, 3 and 4 as alternate function push-pull */
    GPIO_InitStructure.Pin        = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);

//    GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1;
//    GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
	
	/* Compute the prescaler value */
    PrescalerValue = (uint16_t)(SystemCoreClock / 24000000) - 1;
    /* Time base configuration */
    TIM_TimeBaseStructure.Period    = 512;
    TIM_TimeBaseStructure.Prescaler = PrescalerValue;
    TIM_TimeBaseStructure.ClkDiv    = 0;
    TIM_TimeBaseStructure.CntMode   = TIM_CNT_MODE_UP;

    TIM_InitTimeBase(TIM5, &TIM_TimeBaseStructure);

    /* PWM1 Mode configuration: Channel1 */
    TIM_OCInitStructure.OcMode      = TIM_OCMODE_PWM1;
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
//    TIM_OCInitStructure.Pulse       = CCR1_Val;
    TIM_OCInitStructure.OcPolarity  = TIM_OC_POLARITY_HIGH;

//    TIM_InitOc1(TIM5, &TIM_OCInitStructure);

    TIM_ConfigOc1Preload(TIM5, TIM_OC_PRE_LOAD_ENABLE);

    /* PWM1 Mode configuration: Channel2 */
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR2_Val;

    TIM_InitOc2(TIM5, &TIM_OCInitStructure);

    TIM_ConfigOc2Preload(TIM5, TIM_OC_PRE_LOAD_ENABLE);

    /* PWM1 Mode configuration: Channel3 */
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR3_Val;

    TIM_InitOc3(TIM5, &TIM_OCInitStructure);

    TIM_ConfigOc3Preload(TIM5, TIM_OC_PRE_LOAD_ENABLE);

    /* PWM1 Mode configuration: Channel4 */
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR4_Val;

    TIM_InitOc4(TIM5, &TIM_OCInitStructure);

    TIM_ConfigOc4Preload(TIM5, TIM_OC_PRE_LOAD_ENABLE);

    TIM_ConfigArPreload(TIM5, ENABLE);

    /* TIM3 enable counter */
    TIM_Enable(TIM5, ENABLE);
}

4、实现效果

其实要完美实现,最好再写个APP控制端,直接在APP中给出颜色,然后通过蓝牙直接发送颜色值。本次评测就用的是现成的蓝牙实验APP,直接发送的RGB数值。

06a49ccb3f25288ff602f29a9cd82b3.jpg

RGB后面分别是R、G、B三色颜色分量。

串口中提到的信息如下

333e8bc2f59952a7ab45569b33d1c66.jpg  下面是具体演示的视频

蓝牙控制RGB灯带

5、心得体会

总体来说,本次的国民技术WB452评测开发板还是非常不错的,遗憾的是自己这边的时间不够用。总算是完成了当初申请时候计划的评测用例。

在此,再次感谢EEWorld提供的评测机会。

此帖出自RF/无线论坛

最新回复

你好,请问以下方便提供程序源码么,我学习的时候按照您这个改实现不了   详情 回复 发表于 2024-2-21 09:52

回复
举报

6376

帖子

0

TA的资源

五彩晶圆(高级)

看到楼主的效果了,

image.png  

此帖出自RF/无线论坛

回复

118

帖子

0

TA的资源

一粒金砂(中级)

不错 简单易懂

此帖出自RF/无线论坛
个人签名一块进步

回复

2

帖子

0

TA的资源

一粒金砂(初级)

你好,请问以下方便提供程序源码么,我学习的时候按照您这个改实现不了

此帖出自RF/无线论坛

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表