MM32W無線MCU系列產(chǎn)品應(yīng)用筆記 —— 智能炫彩遙控?zé)舴桨?/h1>
硬件資源:
LED的驅(qū)動(dòng)分別使用PA9/10/11輸出PWM波形控制三極管來驅(qū)動(dòng)RGB燈。通過控制灰度來實(shí)現(xiàn)視覺上的亮度和顏色變化,紅、綠、藍(lán)三個(gè)顏色通道每種顏色各分為255階亮度,在0時(shí)"燈"最弱--是關(guān)掉的,而在255時(shí)"燈"最亮。當(dāng)三色數(shù)值相同時(shí)為無色彩的灰度色,而三色都為255時(shí)為最亮的白色,都為0時(shí)為黑色控制頻率?梢允褂脦装俸掌澋綆资甂赫茲來進(jìn)行調(diào)節(jié)不同色彩的燈光。驅(qū)動(dòng)控制原理部分詳見下圖:
圖1 RGB燈驅(qū)動(dòng)原理圖
軟件資源:
1、PA9/10/11為TIM1的CH2、3、4的捕獲比較輸出通道,需要將三個(gè)IO工作模式的配置為復(fù)用推挽輸出,同時(shí)配置AF寄存器為TIM1的CH2、3、4功能,TIM1需要配置CH2、3、4為脈沖寬度調(diào)制模式。配置方式實(shí)現(xiàn)代碼如下:
void PWM_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA , ENABLE);
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,GPIO_AF_2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10,GPIO_AF_2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource11,GPIO_AF_2);
TIM_TimeBaseStructure.TIM_Period = 255*100;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
TIM_OC4Init(TIM1, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM1, ENABLE);
TIM_Cmd(TIM1, ENABLE);
TIM1->BDTR |= 0x8000;
//上電亮白光
SetLEDLum(0,0,0,100);
SetLEDLum(0,0,100,101);
}
2、我們?cè)赨pdateLEDValueAll函數(shù)中調(diào)用Led_getInfo(data)來獲取RGB的配置信息,data是一個(gè)數(shù)組指針,數(shù)組成員包含RGB三個(gè)LED的灰度值(0-255),而Led_getInfo(data)最終通過調(diào)用server_rd_rsp(u8 attOpcode, u16 attHandle, u8 pdu_type)函數(shù)來獲取手機(jī)APP發(fā)送給我們的信息。根據(jù)data信息修改TIM1的CCR2、3、4的大小來調(diào)節(jié)CH2、3、4三路PWM輸出的占空比,進(jìn)而調(diào)節(jié)REB的三個(gè)LED的亮度,來實(shí)現(xiàn)我們對(duì)于不同色彩、亮度的需求。詳細(xì)實(shí)現(xiàn)代碼如下:
void UpdateLEDValueAll(void) //porting function
{
int t;
unsigned char data[7];
unsigned char EnableLED_Flag = 0;
unsigned int Led_Lum_percent = 100;
Led_getInfo(data);
EnableLED_Flag = data[0];
if(EnableLED_Flag == 0) {
TIM_SetCompare2(TIM1,0); //G
TIM_SetCompare3(TIM1,0); //B
TIM_SetCompare4(TIM1,0); //R
} else {
Led_Lum_percent = data[6];
t = data[3] * Led_Lum_percent; TIM_SetCompare2(TIM1,t); //Rx100
t = data[2] * Led_Lum_percent; TIM_SetCompare3(TIM1,t); //Gx100
t = data[1] * Led_Lum_percent; TIM_SetCompare4(TIM1,t); //Bx100
}
}
我們選用一款通用APP做為控制端,操作流程如下:
1. 手機(jī)打開App,會(huì)自動(dòng)開始搜索藍(lán)牙設(shè)備名(如MindMotionLED)并連接。
基于藍(lán)牙技術(shù)的智能燈控方案是智能家居應(yīng)用重要組成部分,通過連接手機(jī)APP可以控制燈的開關(guān)、亮度、設(shè)定開關(guān)時(shí)間、統(tǒng)計(jì)耗電量等功能。該方案具有控制方便,功能多樣,操作迅速,設(shè)計(jì)開發(fā)簡(jiǎn)單等優(yōu)勢(shì)。2. 連接成功以后app出現(xiàn)RGB控制界面,可以在APP界面中點(diǎn)選不同區(qū)域來改變LED燈的顏色。
如需要了解更多靈動(dòng)微MCU產(chǎn)品,請(qǐng)聯(lián)系靈動(dòng)微核心代理商,穎特新科技
編輯:ls 最后修改時(shí)間:2022-06-16