[国民技术N32WB452测评] 四、蓝牙控制RGB全彩氛围灯的实现
[复制链接]
国民技术的评测板,当初申请的目的,其实是想用它的5MADC的,只是后面由于工作方面的原因,一直没空做PCB板,不过,当初申请的时候也没有用这个。
申请评测的最后一个项目是全彩氛围灯的实现,通过蓝牙进行控制。
1、硬件实现
由于氛围灯带一般大多是12V的RGB灯带,所以就找了个车用方面的小灯来实现了
在MOS管的G极引出线,就可以控制RGB全彩灯的显示了。
2、软件控制
通过蓝牙发送信息至开发板,开发板接收后进行解析,然后通过PWM输出RGB三个通道的亮度分量,实现全彩氛围灯的显示。
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数值。
RGB后面分别是R、G、B三色颜色分量。
串口中提到的信息如下
下面是具体演示的视频
蓝牙控制RGB灯带
5、心得体会
总体来说,本次的国民技术WB452评测开发板还是非常不错的,遗憾的是自己这边的时间不够用。总算是完成了当初申请时候计划的评测用例。
在此,再次感谢EEWorld提供的评测机会。
|