基于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设计了完整的智能风扇系统,具有以下创新特点:
- 精准定位:多传感器融合算法,定位精度±15°
- 智能调速:基于距离、温度的PID自适应控制
- 节能环保:无人自动停机,支持多种节能模式
- 物联网集成:支持WiFi/蓝牙远程控制
- 安全可靠:多重安全保护机制
浙公网安备 33010602011771号