基于STM32的人群定位与调速智能风扇设计方案

一、系统总体设计

1. 系统架构

┌─────────────────────────────────────────────┐
│            智能风扇控制系统              │
├─────────────────────────────────────────────┤
│ 感知层:                                     │
│  • PIR热释电(人体检测)                │
│  • 超声波/微波雷达(距离检测)           │
│  • 温湿度传感器(环境温度)              │
│  • 红外测温(目标体温)                │
├─────────────────────────────────────────────┤
│ 控制层:STM32F407(主控制器)           │
│  • 人群定位算法                       │
│  • 智能调速策略                       │
│  • 电机驱动控制                       │
├─────────────────────────────────────────────┤
│ 执行层:                                     │
│  • 无刷直流电机(BLDC)               │
│  • 舵机云台(自动转向)               │
│  • OLED显示模块                       │
├─────────────────────────────────────────────┤
│ 交互层:                                     │
│  • WiFi/蓝牙(手机APP控制)             │
│  • 红外遥控                           │
│  • 触摸按键                           │
└─────────────────────────────────────────────┘

2. 核心功能指标

参数 指标 说明
人体检测距离 0.5-8m PIR+超声波双重检测
定位精度 ±15° 水平方向角度定位
调速档位 0-100%无级调速 PWM控制
响应时间 <2秒 检测到人体到调速完成
工作模式 自动/手动/睡眠/自然风 多种智能模式
通信方式 WiFi+蓝牙双模 ESP8266/HC-05

二、硬件设计

1. 主控芯片选型

STM32F407VGT6(高性能系列):

  • 内核:ARM Cortex-M4,168MHz主频
  • Flash:1MB,SRAM:192KB
  • 外设:17×定时器(含高级定时器)、3×ADC、2×DAC
  • 通信:以太网MAC、USB OTG、CAN、I2C、SPI、USART
  • 优势:硬件浮点运算,适合传感器数据融合算法

2. 人群定位传感器模块

(1)PIR热释电传感器(HC-SR501)

PIR传感器 → 比较器 → STM32外部中断
  • 检测距离:3-7米可调
  • 检测角度:120°
  • 输出信号:数字电平(有人=高电平)

(2)超声波测距模块(HC-SR04)

  • 测距范围:2cm-4m
  • 精度:±3mm
  • 接口:Trig(触发)+ Echo(回波)

(3)微波雷达模块(RCWL-0516)

  • 检测距离:5-9米
  • 穿透能力:可穿透玻璃、薄木板
  • 抗干扰:不受温度、湿度影响

3. 电机驱动设计

(1)BLDC无刷电机驱动

STM32 TIM1(高级定时器)→ IR2104 → MOSFET → BLDC电机
  • 电机参数:12V/24V,1000-3000RPM
  • 驱动芯片:IR2104(半桥驱动)
  • MOSFET:IRF540N(N沟道)

(2)舵机云台控制

STM32 TIM3_CH1 → 舵机(水平旋转)
STM32 TIM3_CH2 → 舵机(俯仰调节)
  • 舵机型号:SG90/MG996R
  • 控制角度:0-180°(水平),0-90°(俯仰)

4. 环境感知模块

(1)温湿度传感器(DHT22)

  • 温度范围:-40~80℃,精度±0.5℃
  • 湿度范围:0-100%RH,精度±2%

(2)红外测温(MLX90614)

  • 测温范围:-70~380℃
  • 精度:±0.5℃(室温)
  • 接口:I2C

5. 电源管理系统

AC220V → 整流滤波 → DC12V/5A → 降压模块
                        ├── DC12V → 电机驱动
                        ├── DC5V → STM32/传感器
                        └── DC3.3V → 逻辑电路

三、软件设计

1. 系统软件架构

/* 主程序流程图 */
int main(void)
{
    /* 硬件初始化 */
    SystemClock_Init();      // 系统时钟168MHz
    GPIO_Init();           // GPIO初始化
    TIM_PWM_Init();       // PWM初始化(电机控制)
    ADC_Init();           // ADC初始化(电流检测)
    USART_Init();         // 串口初始化(WiFi通信)
    I2C_Init();          // I2C初始化(传感器)
    EXTI_Init();         // 外部中断(PIR检测)
    
    /* 传感器校准 */
    Sensor_Calibration();
    
    /* 创建FreeRTOS任务 */
    xTaskCreate(Sensor_Task, "Sensor", 512, NULL, 3, NULL);
    xTaskCreate(Motor_Task, "Motor", 512, NULL, 2, NULL);
    xTaskCreate(Control_Task, "Control", 1024, NULL, 4, NULL);
    xTaskCreate(Comm_Task, "Comm", 512, NULL, 1, NULL);
    
    vTaskStartScheduler();
}

2. 人群定位算法

(1)多传感器数据融合

typedef struct {
    uint8_t pir_detected;     // PIR检测结果
    float ultrasonic_distance;   // 超声波距离
    uint8_t radar_detected;    // 雷达检测结果
    float target_angle;         // 目标角度
    uint8_t confidence;         // 置信度
} HumanDetection_t;

HumanDetection_t Detect_Human(void)
{
    HumanDetection_t result;
    
    // PIR检测
    result.pir_detected = HAL_GPIO_ReadPin(PIR_GPIO_Port, PIR_PIN);
    
    // 超声波测距
    result.ultrasonic_distance = HC_SR04_GetDistance();
    
    // 雷达检测
    result.radar_detected = HAL_GPIO_ReadPin(RADAR_GPIO_Port, RADAR_PIN);
    
    // 数据融合算法(加权投票)
    if(result.pir_detected && result.radar_detected) {
        result.confidence = 95;  // 双传感器确认,高置信度
    } else if(result.pir_detected || result.radar_detected) {
        result.confidence = 70;  // 单传感器检测,中等置信度
    } else {
        result.confidence = 0;   // 无人检测
    }
    
    return result;
}

(2)角度定位算法

/* 基于舵机云台的角度扫描定位 */
float Locate_TargetAngle(void)
{
    float min_distance = 400.0f;  // 最小距离(cm)
    float target_angle = 90.0f;    // 目标角度
    
    // 扫描0-180度范围
    for(int angle = 0; angle <= 180; angle += 10) {
        Servo_SetAngle(angle);      // 设置舵机角度
        HAL_Delay(100);            // 等待稳定
        
        float distance = HC_SR04_GetDistance();
        if(distance < min_distance) {
            min_distance = distance;
            target_angle = angle;
        }
    }
    
    return target_angle;
}

3. 智能调速策略

(1)基于距离的调速算法

typedef enum {
    MODE_AUTO = 0,      // 自动模式
    MODE_MANUAL,        // 手动模式
    MODE_SLEEP,         // 睡眠模式
    MODE_NATURE        // 自然风模式
} FanMode_t;

/* 自动调速算法 */
uint8_t Calculate_FanSpeed(float distance, float temperature, FanMode_t mode)
{
    uint8_t speed = 0;
    
    switch(mode) {
        case MODE_AUTO:
            // 基于距离和温度的PID调速
            if(distance < 100.0f) {  // 1米内
                speed = 30;  // 低速
            } else if(distance < 300.0f) {  // 1-3米
                speed = 60;  // 中速
            } else {  // 3米以上
                speed = 90;  // 高速
            }
            
            // 温度补偿
            if(temperature > 30.0f) {
                speed += 20;  // 高温加档
            } else if(temperature < 25.0f) {
                speed -= 10;  // 低温减档
            }
            break;
            
        case MODE_SLEEP:
            speed = 20;  // 睡眠模式固定低速
            break;
            
        case MODE_NATURE:
            // 自然风模式(正弦波变化)
            static uint32_t tick = 0;
            speed = 50 + 30 * sin(2 * 3.14159 * tick / 1000.0f);
            tick++;
            break;
    }
    
    // 限幅保护
    if(speed > 100) speed = 100;
    if(speed < 0) speed = 0;
    
    return speed;
}

(2)电机PID控制

typedef struct {
    float Kp, Ki, Kd;
    float integral;
    float prev_error;
    float output;
} PID_Controller_t;

/* PID速度控制 */
float PID_Calculate(PID_Controller_t *pid, float target, float feedback)
{
    float error = target - feedback;
    
    // 比例项
    float P = pid->Kp * error;
    
    // 积分项(抗饱和)
    pid->integral += error;
    if(pid->integral > 1000) pid->integral = 1000;
    if(pid->integral < -1000) pid->integral = -1000;
    float I = pid->Ki * pid->integral;
    
    // 微分项
    float D = pid->Kd * (error - pid->prev_error);
    pid->prev_error = error;
    
    pid->output = P + I + D;
    
    // 输出限幅
    if(pid->output > 1000) pid->output = 1000;
    if(pid->output < 0) pid->output = 0;
    
    return pid->output;
}

4. FreeRTOS任务设计

/* 传感器数据采集任务 */
void Sensor_Task(void *arg)
{
    while(1) {
        human_detection = Detect_Human();
        temperature = DHT22_ReadTemp();
        humidity = DHT22_ReadHumidity();
        
        // 发送数据到消息队列
        xQueueSend(sensor_queue, &sensor_data, portMAX_DELAY);
        
        vTaskDelay(pdMS_TO_TICKS(100));  // 100ms周期
    }
}

/* 电机控制任务 */
void Motor_Task(void *arg)
{
    uint8_t fan_speed = 0;
    
    while(1) {
        // 从队列接收控制命令
        if(xQueueReceive(motor_queue, &fan_speed, portMAX_DELAY)) {
            // PWM输出控制电机速度
            __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, fan_speed * 10);
        }
        vTaskDelay(pdMS_TO_TICKS(50));
    }
}

/* 智能控制任务 */
void Control_Task(void *arg)
{
    while(1) {
        // 获取传感器数据
        HumanDetection_t human = Detect_Human();
        float temp = Get_Temperature();
        
        if(human.confidence > 70) {
            // 检测到人,计算目标角度并转向
            float angle = Locate_TargetAngle();
            Servo_SetAngle(angle);
            
            // 计算风扇速度
            uint8_t speed = Calculate_FanSpeed(
                human.ultrasonic_distance, 
                temp, 
                current_mode
            );
            
            // 发送速度命令到电机任务
            xQueueSend(motor_queue, &speed, portMAX_DELAY);
        } else {
            // 无人,停止风扇
            uint8_t speed = 0;
            xQueueSend(motor_queue, &speed, portMAX_DELAY);
        }
        
        vTaskDelay(pdMS_TO_TICKS(500));
    }
}

四、关键技术创新点

1. 自适应人群定位算法

  • 多传感器融合:PIR+超声波+雷达三重检测
  • 置信度评估:加权平均算法提高检测准确率
  • 动态校准:自动适应环境变化

2. 智能节能策略

/* 节能算法 */
void Energy_Saving_Strategy(void)
{
    static uint32_t no_human_time = 0;
    
    if(human_detection.confidence < 30) {
        no_human_time += 500;  // 累计无人时间
        
        if(no_human_time > 300000) {  // 5分钟无人
            Enter_LowPower_Mode();    // 进入低功耗模式
        }
    } else {
        no_human_time = 0;  // 重置计时器
        Exit_LowPower_Mode();
    }
}

3. 学习记忆功能

  • 用户习惯学习:记录用户常用风速和时间
  • 环境自适应:根据季节自动调整参数
  • 远程控制:手机APP实时监控和控制

参考代码 基于STM32 人群定位、调速智能风扇设计(程序、设计报告、视频演示) www.youwenfan.com/contentcnt/123348.html

五、测试验证方案

1. 功能测试项目

测试项 测试方法 合格标准
人体检测 不同距离、角度测试 检测率>95%
距离测量 标准尺对比测量 误差<±5cm
调速响应 示波器观察PWM 响应时间<2s
长时间运行 连续工作24小时 无故障、无过热

2. 性能指标验证

/* 自动化测试程序 */
void Auto_Test(void)
{
    printf("=== 智能风扇系统测试 ===\n");
    
    // 传感器测试
    Test_Sensors();
    
    // 电机控制测试
    for(int speed = 0; speed <= 100; speed += 20) {
        Set_FanSpeed(speed);
        HAL_Delay(2000);
        Check_MotorCurrent();
    }
    
    // 定位精度测试
    Test_LocationAccuracy();
    
    printf("=== 测试完成 ===\n");
}

六、物料清单(BOM)

元件 型号 数量 单价 备注
MCU STM32F407VGT6 1 ¥45 LQFP100
PIR传感器 HC-SR501 1 ¥8 人体检测
超声波 HC-SR04 1 ¥12 测距
微波雷达 RCWL-0516 1 ¥15 穿墙检测
BLDC电机 12V 1000RPM 1 ¥35 无刷电机
驱动芯片 IR2104 2 ¥6 半桥驱动
舵机 MG996R 2 ¥25 云台控制
温湿度 DHT22 1 ¥18 环境监测
总计 ¥164

七、扩展功能设计

1. 物联网功能

  • 阿里云IoT接入:远程监控和控制
  • 天猫精灵/小爱同学:语音控制
  • IFTTT联动:与其他智能设备联动

2. 健康关怀功能

  • 空气质量检测:PM2.5+CO2传感器
  • 负离子净化:集成空气净化功能
  • UV杀菌:定时紫外线消毒

3. 安全保护功能

  • 过热保护:温度传感器监控电机温度
  • 堵转保护:电流检测防止电机堵转
  • 倾倒断电:倾角传感器检测倾倒

八、开发工具与环境

1. 软件开发环境

  • IDE:STM32CubeIDE 1.13.0
  • 固件库:STM32CubeF4 HAL库
  • RTOS:FreeRTOS V10.4.6
  • 调试工具:ST-Link V2

2. 硬件开发工具

  • PCB设计:Altium Designer 22
  • 3D建模:SolidWorks(风扇外壳)
  • 仿真软件:Proteus(电路仿真)

九、注意事项与优化建议

1. 硬件设计注意事项

  • 电源隔离:数字地和模拟地分开,单点接地
  • EMC设计:电机驱动部分加磁珠和滤波电容
  • 散热设计:功率器件预留散热片安装孔

2. 软件开发注意事项

  • 中断优先级:传感器中断优先级高于任务
  • 内存管理:合理使用DMA,减少CPU负载
  • 看门狗:启用独立看门狗,防止程序跑飞

十、总结

本方案基于STM32F407设计了完整的智能风扇系统,具有以下创新特点:

  1. 精准定位:多传感器融合算法,定位精度±15°
  2. 智能调速:基于距离、温度的PID自适应控制
  3. 节能环保:无人自动停机,支持多种节能模式
  4. 物联网集成:支持WiFi/蓝牙远程控制
  5. 安全可靠:多重安全保护机制
posted @ 2026-04-18 13:10  w199899899  阅读(58)  评论(0)    收藏  举报