这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【STM32WBA55CG开发板】成果帖---建立蓝牙服务器,用手机控制LED亮

共1条 1/1 1 跳转至

【STM32WBA55CG开发板】成果帖---建立蓝牙服务器,用手机控制LED亮度

专家
2024-12-15 16:04:21     打赏

终于到了写成果贴的时候了。按照活动的初衷,用这款STM32WBA55CG开发板实现一个无线应用。现实情况是,该开发板可以实现的无线应用可以由多种形式,比如蓝牙应用、Wifi应用等。于是我抽时间看了看蓝牙和WiFi方面的知识,感觉完全吃透这些知识,并在STM32WBA55CG这块开发板上实现相关应用,以及在手机等终端上开发出相关的安卓应用、苹果应用或者鸿蒙应用,显然是不现实的。光是那些知识的量,没几个月,很难吃透的。于是只能投机取巧,先搞懂STM32WBA55CG开发板的例程,并在例程的基础上进行拓展,尽量把知识控制在自己能把握的地方。花了点时间,还好得到了自己想到的结果。在P2PServer例程的基础上,成功实现了利用手机,通过蓝牙连接,控制LED亮度的装置。

整个装置很简单,如下图所示:


手机端使用的是BLE调试助手APP(从头开发安卓应用,感觉时间上未必来得及哈,虽然能做,但需要花费太多时间学习,希望自己后面能补上)。在手机端通过发送不同的亮度指令0/1/2/3,控制PWM输出的占空比,在通过MOS功率控制模块,完成LED亮度的控制。

控制效果如下图所示:

第一档的亮度:

图片3.png

第二档的亮度:

图片4.png

第三档的亮度:

图片5.png

发送1、2、3以外的数字时,灭掉LED:

图片6.png

整个程序的改造相对简单,但是在摸索之前,可着实下了不少时间去学习,并通过加断点来检查开发板和手机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

图片7.png

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的电源。后面还要花点时间,利用电池组装这套装置,把锂电池、充电模块、升压模块整合进来形成完整的一个小电子产品的模样。



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]