终于到了写成果贴的时候了。按照活动的初衷,用这款STM32WBA55CG开发板实现一个无线应用。现实情况是,该开发板可以实现的无线应用可以由多种形式,比如蓝牙应用、Wifi应用等。于是我抽时间看了看蓝牙和WiFi方面的知识,感觉完全吃透这些知识,并在STM32WBA55CG这块开发板上实现相关应用,以及在手机等终端上开发出相关的安卓应用、苹果应用或者鸿蒙应用,显然是不现实的。光是那些知识的量,没几个月,很难吃透的。于是只能投机取巧,先搞懂STM32WBA55CG开发板的例程,并在例程的基础上进行拓展,尽量把知识控制在自己能把握的地方。花了点时间,还好得到了自己想到的结果。在P2PServer例程的基础上,成功实现了利用手机,通过蓝牙连接,控制LED亮度的装置。
整个装置很简单,如下图所示:
手机端使用的是BLE调试助手APP(从头开发安卓应用,感觉时间上未必来得及哈,虽然能做,但需要花费太多时间学习,希望自己后面能补上)。在手机端通过发送不同的亮度指令0/1/2/3,控制PWM输出的占空比,在通过MOS功率控制模块,完成LED亮度的控制。
控制效果如下图所示:
第一档的亮度:
第二档的亮度:
第三档的亮度:
发送1、2、3以外的数字时,灭掉LED:
整个程序的改造相对简单,但是在摸索之前,可着实下了不少时间去学习,并通过加断点来检查开发板和手机APP之间进行数据通讯中,触发的时间处理。进而在对应的程序上加以改造。
当然第一步是追加定时器以及PWM方面的处理。在过程贴中,用到的第一个通道,使用PB12口输出PWM已经不可能。通过查看P2PServer例程,发现PB12,PA8,PA6均已被占用,幸好PA7没有被使用。PA7输出PWM时,使用的是Timer2的第三通道。把和PWM有关的处理代码改造一番后,拷贝到蓝牙的P2PServer例程中,
1、在main.c中加入Timer2 的初始化设置处理,还有几个必要的函数需要在stm32wbaxx_hal_msp.c中追加。
static void MX_TIM2_Init(void) { TIM_MasterConfigTypeDef sMasterConfig = { 0 }; TIM_OC_InitTypeDef sConfigOC = { 0 }; htim2.Instance = TIM2; htim2.Init.Prescaler = PRESCALER_VALUE;// 预定标器 htim2.Init.CounterMode = TIM_COUNTERMODE_UP;// 计数方式:加1 htim2.Init.Period = PERIOD_VALUE;// 周期 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;// 分频系数 htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;// 不自动重载 if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;// sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { //LOG_INFO_APP("Init failure : Timer2-0 \r\n"); } sConfigOC.OCMode = TIM_OCMODE_PWM1;// PWM模式1 sConfigOC.Pulse = ratio;// 根据占空比设置比较值给通道3用 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; // 配置通道3 if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) { Error_Handler(); } // 开放通道3使用的GPIO口(PA7) HAL_TIM_MspPostInit(&htim2); }
stm32wbaxx_hal_msp.c中追加的函数:
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm) { if(htim_pwm->Instance==TIM2) { /* Peripheral clock enable */ __HAL_RCC_TIM2_CLK_ENABLE(); } } void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(htim->Instance==TIM2) { __HAL_RCC_GPIOA_CLK_ENABLE(); /**TIM2 GPIO Configuration PB12 ------> TIM2_CH1 PA8 ------> TIM2_CH2 PA7 ------> TIM2_CH3 PA6 ------> TIM2_CH4 */ GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } }
2、在蓝牙的处理程序中,在数据接收事件中,加入数据的分析处理
函数名:P2P_SERVER_EventHandler
在ACI_GATT_ATTRIBUTE_MODIFIED_VSEVT_CODE对应的case分支中,追加如下代码:
// Add by whj begin // 为了捕获来自手机端ST BLE ToolBox的信息(GeneralAccess发送) if(p_attribute_modified->Attr_Handle == 7) { driveWS2812(notification.DataTransfered.Length, notification.DataTransfered.p_Payload); } // Add by whj end
driveWS2812这个函数越是我后追加的,本来是想用来驱动WS2812,以期实现对WS2812的显示颜色和亮度的双控制,目前还没有着手。
/** * 根据手机端发送的指令,驱动WB2812发出点亮指定颜色的灯光 * datLen ; 手机端发送数据的长度(字节个数) * recvData : 收到的数据 */ void driveWS2812(uint8_t datLen, uint8_t *recvData) { int ratio = 0; // 根据收到的字符,分析,进行相应的处理 switch (recvData[0]) { // 获得颜色 case 'r': case 'R': // 红色 break; case 'g': case 'G': // 绿色 break; case 'b': case 'B': // 蓝色 break; case 'w': case 'W': // 白色 break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (datLen == 1) { // 改变占空比 //ratio = ((recvData[0] - 48))%101; // 1位数字,对应可以使用的亮度数据 if (recvData[0] == '0') { ratio=100;// 灭(灯的接法:使用MOS管模块,模式管PWM输入控制端:正极接电源3.3V, 负极接开发板PWM输出) } else if (recvData[0] == '1') { ratio = 90; } else if (recvData[0] == '2') { ratio = 87; } else if (recvData[0] == '3') { ratio = 70; } else { ratio=100; } } else if (datLen == 2) { // 改变占空比(反发向计算,否则,数字越大,亮度越低) ratio = 100 - (((recvData[0] - 48)%10) * 10 + (recvData[1] - 48)%10)%101; // 为了获取合适的亮度,测试时必须输入2位数字,OK后,改成1位数字,对应可以使用的亮度数据 } LOG_INFO_APP("Ratio = %d\% \r\n", ratio); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, (uint32_t)(40 * ratio / 100)); break; } }
driveWS2812函数加在P2P_SERVER_EventHandler之前,可以被EventHandler识别即可。在亮度控制中,因为使用了反相方式的接法,MOS管控制端正极接VDD,MOS管控制端负极接PEM输出口,因此PWM输出的占空比越大,则LED导通的时间越短。经过多次试验,最后保留以下亮度设置:
0 - 占空比=100%,LED灭
1 - 占空比=90%,LED稍亮
2 - 占空比=87%,LED比较亮
3 - 占空比=70%,LED很亮
实际上,从87以下,亮度的变化已经不怎么明显了。这一实验现象,是我觉得有必花时间,利用前此活动中的BH1750光传感器测试LED在不同占空比下亮度的表现了。
电路图与过程贴中的基本一致,没什么大变动,区别就是这里使用的12V的电源。后面还要花点时间,利用电池组装这套装置,把锂电池、充电模块、升压模块整合进来形成完整的一个小电子产品的模样。