回答

收藏

[评测分享] 【RISC-V 沁恒微-CH585M-R1开发板试用体验】+手机控制小台灯亮度与小风扇转速

#板卡评测 #板卡评测 554 人阅读 | 0 人回复 | 2025-07-15

本帖最后由 yinwuqing 于 2025-7-15 10:20 编辑


一、实验概况

   上期咱们实现了通过手机BLE远程控制板上LED0、LED1指示灯的开与关,这期咱们结合之前实现的呼吸灯显示功能,实现一个亮度可调的小台灯与一个转速可调的小风扇。
     同样基于上期的“Peripheral”例程,在“simpleProfileChangeCB()”回调函数中实现控制板上PWM4,PWM5占空比输出变化。在“0xFFE1”服务特征值下进行PWM4的占空比更改逻辑处理,在“0xFFE3”服务特征值下进行PWM5的占空比更改逻辑处理。当然在主函数中先对PA12初始化为PWM4、PA13初始化为PWM5。实验中,我们将PA12与MOS出关开关驱动模块相连接,PA13与L298N电机驱动模块的通道A使能接口相连接。为保证风扇顺时针方向旋转,因此需将PA0连接至L298N电机驱动模块的IN1,PA1连接至L298N电机驱动模块的IN2,并初始化PA0为高,PA1为低,用以实现正转。

二、硬件介绍
   
     (1)灯光驱动模块
此次实验采用市面上常见的MOS开关触发驱动模块,配上一个带保护的充电模组TP4056,方便连上18650电池后便携移动使用。日光灯选择5V/2W的即可。其硬件连接示意图如下:


     (2)电机驱动模块
         此次实验用到L298N电机驱动模块,该模块应用比较广泛,不仅可以驱动直流电机,而且支持驱动42步进电机,下面介绍一下该驱动模块的使用。L298N电机驱动模块的实物图及管脚分布如下图所示:


      由此可知,该模块支持驱动两路直流电机,当然也可以用来驱动42步进电机。L298N的供电可选择12V或5V,根据电机的供电需求来选择。由于此次DIY用来驱动一个直流电机,因此只需要着重关注通道A使能管脚,即ENA;以及逻辑IN1与IN2逻辑输入管脚。另外我们要对直流电机进行PWM调速控制,则需要设置IN1和IN2高低电平,确定电机的转动方向,然后对使能端输出PWM脉冲,即可实现调速。注意当使能信号为0时,电机处于自动停止状态;当使能信号为1,且IN1和IN2为00或11时,电机处于制动状态,阻止电机转动。各管脚的逻辑关系列表如下图:

      实验中的硬件连接示意图如下:


三、硬件实物连接

       实物连接详情如下:


四、逻辑代码

       同样的在simpleProfileChangeCB()函数中添加相应的逻辑处理代码,PWM占空比步进长为2%
  1. /*********************************************************************
  2. * @fn      simpleProfileChangeCB
  3. *
  4. * @brief   Callback from SimpleBLEProfile indicating a value change
  5. *
  6. * @param   paramID - parameter ID of the value that was changed.
  7. *          pValue - pointer to data that was changed
  8. *          len - length of data
  9. *
  10. * @return  none
  11. */
  12. static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len)
  13. {
  14.     switch(paramID)
  15.     {
  16.         case SIMPLEPROFILE_CHAR1:
  17.         {
  18.             uint8_t pwm4cycle = atoi(pValue);
  19.             if(pwm4cycle >= 0 && pwm4cycle <= 50)
  20.             {
  21.                 PWMX_ACTOUT(CH_PWM4, (64 * pwm4cycle)/ 50, High_Level, ENABLE);  //PWM4占空比平均50等份更改
  22.                 PRINT("profile ChangeCB CHAR1.. \n");
  23.             }
  24.             else {
  25.                PRINT("set pwm4cycle overflow..\n");
  26.             }
  27.             break;
  28.         }

  29.         case SIMPLEPROFILE_CHAR3:
  30.         {
  31.             uint8_t pwm5cycle = atoi(pValue);

  32.             if(pwm5cycle >= 0 && pwm5cycle <= 50)
  33.             {
  34.                PWMX_ACTOUT(CH_PWM5, (64 * pwm5cycle)/ 50, High_Level, ENABLE);  //PWM5占空比平均50等份更改
  35.                PRINT("profile ChangeCB CHAR3..\n");
  36.             }
  37.             else {
  38.                PRINT("set pwm5cycle overflow..\n");
  39.             }
  40.             break;
  41.         }

  42.         default:
  43.             // should not reach here!
  44.             break;
  45.     }
  46. }
复制代码
   当然由于代码中用到atoi函数,因此需要在“peripheral.c”源码中添加#include <stdlib.h>头文件。注意:由于设置外设的GPIO口为高电平时为正向逻辑,因此调用PWMX_ACTOUT()函数时采用High_Level逻辑。再者需要将数据长度宏定义更改为2,因为需要发送“0”~“50”间的任意字符,如果还是默认的1个字符,则发送两个字符会报发送失败。
#define SIMPLEPROFILE_CHAR1_LEN     2
#define SIMPLEPROFILE_CHAR3_LEN     2
      “peripheral_main.c”源文件中的main函数部分,需增加相应的GPIO口初始化处理,默认初始状态为关闭小台灯、小风扇。
  1. /*********************************************************************
  2. * @fn      main
  3. *
  4. * @brief   主函数
  5. *
  6. * @return  none
  7. */
  8. int main(void)
  9. {
  10. #if(defined(DCDC_ENABLE)) && (DCDC_ENABLE == TRUE)
  11.     PWR_DCDCCfg(ENABLE);
  12. #endif
  13.     HSECFG_Capacitance(HSECap_18p);
  14.     SetSysClock(CLK_SOURCE_HSE_PLL_62_4MHz);
  15.     GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeOut_PP_5mA);    // PA12 - PWM4
  16.     GPIOA_ModeCfg(GPIO_Pin_13, GPIO_ModeOut_PP_5mA);    // PA13 - PWM5
  17.     PWMX_CLKCfg(4);                                     // cycle = 4/Fsys
  18.     PWMX_CycleCfg(PWMX_Cycle_64);                       // 周期 = 64*cycle
  19.     PWMX_ACTOUT(CH_PWM4, 64 / 100, Low_Level, ENABLE);  // 1% 占空比
  20.     PWMX_ACTOUT(CH_PWM5, 64 / 100, Low_Level, ENABLE);  // 1% 占空比
  21. #if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)
  22.     GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
  23.     GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
  24. #endif
  25. #ifdef DEBUG
  26.     GPIOA_SetBits(GPIO_Pin_14);
  27.     GPIOPinRemap(ENABLE, RB_PIN_UART0);
  28.     GPIOA_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP_5mA);
  29.     UART0_DefInit();
  30. #endif
  31.     PRINT("%s\n", VER_LIB);

  32.     //IN1
  33.     GPIOA_ModeCfg( GPIO_Pin_0, GPIO_ModeOut_PP_5mA );
  34.     //IN2
  35.     GPIOA_ModeCfg( GPIO_Pin_1, GPIO_ModeOut_PP_5mA );
  36.     GPIOA_SetBits(GPIO_Pin_0);
  37.     GPIOA_ResetBits(GPIO_Pin_1);  //使L298N驱动电机顺时针方向转动
  38.     PWMX_ACTOUT(CH_PWM4, 64 / 100, Low_Level, DISABLE);  // 关闭PWM4
  39.     PWMX_ACTOUT(CH_PWM5, 64 / 100, Low_Level, DISABLE);  // 关闭PWM5
  40.     CH58x_BLEInit();
  41.     HAL_Init();
  42.     GAPRole_PeripheralInit();
  43.     Peripheral_Init();
  44.     Main_Circulation();
  45. }
复制代码

五、效果演示

     使用手机蓝牙调试助手App,方便快捷得控制小台灯亮度与风扇转速。通过0xFFE1服务特征下的发送接口,输入“0”~“50”任意字符,控制pwm4的占空比输出,即控制小台灯的亮度;通过0xFFE3服务特征下的发送接口,输入“0”~“50”任意字符,控制pwm5的占空比输出,即控制风机的转速。见B站视频:https://www.bilibili.com/video/BV1S5u6zqETD/


分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

软件工程师
40453 积分
34 主题
+ 关注
热门推荐
关闭

站长推荐上一条 /3 下一条