基于STM32的物联网环境监测与远程控制系统实训套件-淘宝网

任务4 开启风扇

一、任务描述

本任务基于STM32F103C8T6 最小系统板,使用L9110 电机驱动模块驱动直流风扇。通过高级定时器 TIM1 输出 PWM 波形实现风扇转速调节,配合 GPIO 电平控制风扇转向。在 Keil 中编写、编译、下载程序,实现风扇启动、PWM 调速功能,掌握 STM32 高级定时器、PWM 输出、电机驱动的基本开发方法。

二、任务目标

1. 知识目标

1)理解L9110 电机驱动模块工作原理、控制逻辑。

2)掌握高级定时器 TIM1结构、PWM 输出原理、占空比与频率计算。

3)熟悉 PWM 频率、周期、自动重装值、预分频值的配置方法。

4)掌握 GPIO 控制方向、TIM1_CH1 输出 PWM 调速的配合逻辑。

2. 能力目标

1)能够完成 L9110 硬件接线:INA→PA8,INB→PA5,VCC→5V,GND→GND。

2)能够在STM32CubeMX 中正确配置 TIM1 高级定时器,输出 1kHz PWM。

3)能够实现PWM 占空比 0~100 可调,控制风扇转速。

4)能够通过 GPIO 电平控制风扇方向,实现风扇稳定启动运行。

3. 素质目标

1)培养定时器时序严谨、PWM 参数计算准确的工程习惯。

2)提升硬件驱动、软件配置、转速调试的综合能力。

3)养成先配置定时器 → 再启动 PWM → 最后控制电机的开发流程。

三、任务重难点

1. 任务重点

1)TIM1 高级定时器配置:时钟源、预分频、自动重装值、PWM 模式 1。

2)PA8 配置为 TIM1_CH1 复用推挽输出,输出 1kHz PWM。

3)PA5 配置为通用推挽输出,控制风扇方向。

4)PWM 占空比设置:0~100 对应 0%~100%,实现无级调速。

5)L9110 驱动逻辑:INA=PWM,INB = 低电平,风扇正向转动。

2. 任务难点

1)TIM1 时钟计算与PWM 频率精确配置(1kHz)。

2)高级定时器死区、对齐方式、通道使能正确设置。

3)占空比与转速对应关系调整,避免抖动或不启动。

4)解决 L9110 发热、电机抖动、转速不稳等问题。

四、知识准备

1. L9110 风扇电机驱动模块介绍

风扇电机控制模块如图1所示采用L9110电机控制芯片。该芯片具有两个TTL/CMOS兼容输入端子,并具有抗干扰特性:具有高电流驱动能力,两个输出端子可直接驱动直流电机,每个输出端口可提供750-800mA动态电流,其峰值电流可达1.5-2.0A,Vcc=5VL9110广泛应用于各种电机驱动器,如玩具车,步进电机和电源开关等。

图1风扇电机控制模块

  • 驱动类型:直流电机 / 风扇驱动
  • 工作电压:5V~12V
  • 控制逻辑:
  • INA = PWM,INB = 低电平 → 正转
  • INB = PWM,INA = 低电平 → 反转
  • 特点:无需使能脚,PWM 直接调速

电机所需电流较大,无法用三极管驱动更无法直接用IO口驱动,让电机转动起来很简单,给电机两端电压即可,不同电压方向电机转向也不相同,额度电压内,电压越大,电机转动得越快;反之电压越低,电机转动得越慢,甚至无法转动。控制方式有两种:种是高低电平控制(控制转动和停止),一种是PWM控制(控制转速)。

2.高级定时器 TIM1 基础知识

  • 类型:高级控制定时器,带死区、互补输出、刹车功能
  • 时钟:挂载在 APB2,最高72MHz
  • 本任务配置:
  • PWM 频率:1kHz
  • 计数模式:向上计数
  • PWM 模式:模式 1
  • 通道:通道 1(PA8)

3.PWM 关键参数计算

  • PWM 频率:1000Hz
  • 预分频器:71
  • 自动重装值(ARR):999
  • 占空比:CCR1 = 0~100 → 0%~100%

4.GPIO 功能分配

  • PA8(TIM1_CH1):PWM 输出(调速)
  • PA5(GPIO 输出):方向控制(置低)
五、硬件连接

L9110风扇驱动模块与主控STM32F103C8T6的引脚连接如表1所示。

      表1 L9110风扇驱动模块与主控STM32F103C8T6的引脚连接

编号

L9110风扇驱动模块

主控STM32F103C8T6

1

VCC

5V

2

GND

GND

3

INA

PA8

4

INB

PA5

硬件连接电路图如图2所示。

图2 硬件连接电路图

六、任务实现
任务4.1 STM32CubeMX配置

1.在工程根目录下打开TEST.ioc文件,在“Pinout&Configuration”选项卡中,点击左侧“Timers”下的“TIM1”,在“Mode”下的“Clock Source”后选“Internal Clock”;在“Combined Channels”后选“PWM Input on CH1”,如图3所示。

图3 STM32CubeMX 配置TIM1

2.点击“GENERATE CODE”按钮,生成代码,并在keil软件中打开。

任务 4.2 添加GY-302驱动

1.pwm.c文件放到hardware/src目录下 

2.pwm.h文件放到hardware/inc 目录下 

3.在项目中添加 pwm.c文件

任务 4.3 修改main.c 代码

1.添加L9110风扇驱动头文件

/* USER CODE BEGIN Includes */

//风扇传感器驱动

#include "pwm.h"

/* USER CODE END Includes */

2.风扇驱动初始化

/* USER CODE BEGIN 2 */

PWM_Init();  // 风扇驱动初始化

  printf("任务4 开启风扇\r\n");

/* USER CODE END 2 */

3.风扇转动和停止

uint32_t dht_timer = 0;

uint32_t gy30_timer = 0;

uint32_t fan_timer = 0;

uint8_t fan_step = 0; // 风扇状态机

uint16_t light = 0;  

  while (1)

  {

/* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

 // ===================== 1. 温湿度(2秒一次)=====================

  if(HAL_GetTick() - dht_timer >= 2000)

  {

      dht_timer = HAL_GetTick();

      if(DHT11_Read_Data(&temp, &humi) == 0) // 0=成功

      {

        printf("读取成功: 湿度=%d%%, 温度=%d℃\r\n", humi, temp);

      }

      else

      {

        printf("DHT11 读取失败\r\n");

      }

  }

  // ===================== 2. 光照(1秒一次)=====================

  if(HAL_GetTick() - gy30_timer >= 1000)

  {

      gy30_timer = HAL_GetTick();

      light= Value_GY30();

      printf("光照强度:%d lx\r\n",light);

  }

  // ===================== 3. 风扇非阻塞控制 =====================

  if(HAL_GetTick() - fan_timer >= 2000)

  {

      fan_timer = HAL_GetTick();

      fan_step++;

      switch(fan_step)

      {

        case 1:

          PWM_SetCompare1(30);      // 正转30%

          HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);

          printf("风扇:正转30%%\r\n");

          break;

        case 2:

          PWM_SetCompare1(70);      // 正转70%

          printf("风扇:正转70%%\r\n");

          break;

        case 3:

          PWM_SetCompare1(100);     // 正转100%

          printf("风扇:正转100%%\r\n");

          break;

        case 4:

          PWM_SetCompare1(0);       // 停止

          printf("风扇:停止\r\n");

          break;

        case 5:

          PWM_SetCompare1(100);     // 反转100%

          HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);

          printf("风扇:反转100%%\r\n");

          break;

        case 6:

          PWM_SetCompare1(0);       // 停止

          HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);

          printf("风扇:停止\r\n");

          fan_step = 0; // 循环

          break;

      }

  }

}

  /* USER CODE END 3 */

任务 4.4 编译、下载、查看结果

1.点击编译按钮,编译程序。

2.点击下载按钮,下载程序。

3.打开串口调试助手,按stm32f103c8t6主控板上的复位键,在串口调试助手中输出打印信息,如图4所示。同时可以看到,风扇先顺时针转动,速度30%转2秒 、速度70%转2秒速度、100%转2秒、停止2S秒。

图4输出打印信息

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐