完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 MMCU5721167 于 2020-1-15 13:25 编辑 在前面一章中我们已经详细介绍过MM32W系列MCU的自定义AT指令,在接下来的章节我们将着重介绍基于BLE开发的应用方案,在本章节我们将介绍智能灯控方案。 基于蓝牙技术的智能灯控方案是智能家居应用重要组成部分,通过连接手机APP可以控制灯的开关、亮度、设定开关时间、统计耗电量等功能。该方案具有控制方便,功能多样,操作迅速,设计开发简单等优势。 硬件资源: LED的驱动分别使用PA9/10/11输出PWM波形控制三极管来驱动RGB灯。通过控制灰度来实现视觉上的亮度和颜色变化,红、绿、蓝三个颜色通道每种颜色各分为255阶亮度,在0时"灯"最弱--是关掉的,而在255时"灯"最亮。当三色数值相同时为无色彩的灰度色,而三色都为255时为最亮的白色,都为0时为黑色控制频率。可以使用几百赫兹到几十K赫兹来进行调节不同色彩的灯光。驱动控制原理部分详见下图: 图1 RGB灯驱动原理图 软件资源: 1、PA9/10/11为tiM1的CH2、3、4的捕获比较输出通道,需要将三个IO工作模式的配置为复用推挽输出,同时配置AF寄存器为TIM1的CH2、3、4功能,TIM1需要配置CH2、3、4为脉冲宽度调制模式。配置方式实现代码如下: 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、我们在UpdateLEDValueAll函数中调用Led_getInfo(data)来获取RGB的配置信息,data是一个数组指针,数组成员包含RGB三个LED的灰度值(0-255),而Led_getInfo(data)最终通过调用server_rd_rsp(u8 attOpcode, u16 attHandle, u8 pdu_type)函数来获取手机APP发送给我们的信息。根据data信息修改TIM1的CCR2、3、4的大小来调节CH2、3、4三路PWM输出的占空比,进而调节REB的三个LED的亮度,来实现我们对于不同色彩、亮度的需求。详细实现代码如下: 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. 手机打开App,会自动开始搜索蓝牙设备名(如MindMotionLED)并连接。 2. 连接成功以后app出现RGB控制界面,可以在APP界面中点选不同区域来改变LED灯的颜色。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
2245个成员聚集在这个小组
加入小组灵动微电子MM32全系列MCU产品应用手册,库函数和例程和选型表
11525 浏览 3 评论
【MM32 eMiniBoard试用连载】+基于OLED12864的GUI---U8G2
5902 浏览 1 评论
【MM32 eMiniBoard试用连载】移植RT-Thread至MM32L373PS
10823 浏览 0 评论
【MM32 eMiniBoard测评报告】+ 开箱 + 初探
4554 浏览 1 评论
灵动微课堂(第106讲) | MM32 USB功能学习笔记 —— WinUSB设备
4280 浏览 1 评论
[MM32软件] MM32F002使用内部flash存储数据怎么操作?
944浏览 1评论
768浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-7 16:37 , Processed in 0.627086 second(s), Total 55, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号