基于单片机的多模式档位调节与过热保护风扇设计

1 基于单片机的多模式档位调节与过热保护风扇设计

点击链接下载prrotues仿真设计资料:https://download.csdn.net/download/m0_51061483/92081467

1.1 系统概述

家用与办公环境中的小型电风扇产品,除了基本的转速调节外,越来越强调"使用体验"和"安全保护"。例如自然风强调拟自然的强弱变化与间歇感,睡眠风强调低噪、柔和与规律性,常风则强调稳定连续输出。此外,电机驱动装置在高温或散热不良时存在过热风险,若不进行保护,可能导致电机烧毁、塑料部件变形甚至更严重的安全隐患。

本设计以单片机为控制核心,完成一个具备多模式切换、四档风力调节、数码管档位显示、室内温度检测显示、以及过热保护(仿真通过按键模拟)功能的智能风扇控制系统。系统通过三个独立按键分别进入"自然风""睡眠风""常风"三种风类,每种风类对应一个LED指示灯。风力强弱分为1~4档,通过按下相应按键次数实现档位递增循环,并在数码管上显示当前档位。三种风类的差异通过"直流电机不同的停歇时间"来体现,即在电机PWM占空比(风力档位)一致的基础上,通过运行/停歇节奏改变体感。系统还具备过热保护:通过按键模拟过热信号输入,高电平时强制停止风扇,信号解除后自动恢复到原先模式与档位;同时通过温度传感器检测室内温度并显示,为用户提供环境信息,也可为后续扩展"温控自动调档"提供基础。

为了获得稳定可靠的效果,系统必须重点解决:

  1. 三种风类的节奏控制(运行/停歇策略)
  2. 档位调节与显示一致性(按键计数与循环)
  3. 过热保护的优先级与恢复策略(锁存与自动恢复)
  4. 温度采集、滤波与显示(避免跳变与抖动)
  5. 直流电机驱动的稳定性与抗干扰(续流、PWM频率选择)

2 系统功能设计

2.1 功能需求拆解

根据题目功能要求,系统可拆分为四个核心功能群:

2.1.1 风类模式选择与LED指示

  1. 设定三个独立按键:

    • KEY_N:自然风按键
    • KEY_S:睡眠风按键
    • KEY_C:常风按键
  2. 每次按下对应按键,系统进入该风类模式,并点亮对应LED:

    • LED_N点亮表示自然风
    • LED_S点亮表示睡眠风
    • LED_C点亮表示常风
  3. 进入某风类模式后,该模式按键再次按下用于档位调整(见2.1.2),并保持该模式LED常亮以提示当前风类。

2.1.2 四档风力调节与数码管显示

  1. 每个风类均支持四档风力(1~4)。

  2. "按下相应按键次数进行4档调节"可实现为:

    • 在当前风类下,每按一次该模式按键,档位+1
    • 档位达到4后再按回到1(循环)
  3. 数码管实时显示当前档位数字(1、2、3、4),并在模式切换时保持显示与档位逻辑一致。

  4. 为避免误触导致连续跳档,需要按键消抖与"按下沿触发"逻辑。

2.1.3 过热保护与自动恢复

  1. 设置过热保护输入信号(仿真通过按键模拟):

    • 过热信号为高电平表示过热
  2. 当检测到过热高电平时:

    • 立即停止直流电机(关PWM或关驱动)
    • 可选择闪烁某指示灯或数码管显示特殊符号提示(题目未要求,但可作为丰富说明)
  3. 当过热信号恢复为低电平时:

    • 系统自动恢复风扇运转
    • 恢复到过热前的模式与档位,不需要用户再次设置

2.1.4 室内温度检测与显示

  1. 通过温度传感器实时检测室内温度。
  2. 将温度以数字形式显示(可用数码管轮流显示温度与档位,或额外显示模块;题目只说明"具备检测与显示",可采用数码管动态复用显示)。
  3. 温度数值应具备滤波或限速更新,避免快速跳变造成读数不稳定。

2.2 三种风类的"停歇时间"定义与体验设计

题目强调"三个风类通过直流电机不同的停歇时间区分模式",这意味着三种风不是单纯PWM占空比不同,而是运行节奏不同。可以给出一套合理的节奏参数(可根据需要微调):

  1. 常风(Continuous)

    • 电机持续运行,不停歇
    • 体感稳定,适用于普通降温
  2. 睡眠风(Sleep)

    • 运行时间较长、停歇时间较短或按节奏逐渐减弱
    • 重点在于"柔和+不突兀",可定义:运行6秒,停2秒,循环
    • 或运行4秒,停3秒(更柔和)
  3. 自然风(Natural)

    • 更明显的间歇与变化,模拟阵风感
    • 可定义:运行3秒,停1秒,运行2秒,停1秒,运行4秒,停2秒......循环
    • 为简化实现,可采用"周期内占空比变化":例如在一个20秒周期内,运行/停歇节奏按数组执行

由于题目限定"通过停歇时间区分",设计上可以采用"节奏表驱动":每个风类有一组运行/停歇段落(单位ms),系统按段落循环执行,既能实现自然风的随机感,也能实现睡眠风的规律柔和。


2.3 人机交互逻辑说明

为了避免用户操作混乱,建议定义清晰的交互规则:

  1. 任何时候按下某风类按键:立刻切换到该风类(LED切换)。

  2. 若按下的是当前风类按键:视为"调档操作",档位+1循环。

  3. 模式切换时,档位可以:

    • 方案A:各模式独立记忆档位(自然风、睡眠风、常风分别有自己的档位)
    • 方案B:所有模式共用同一档位
      为了"体验更像真实风扇",推荐方案A:切换模式时保持各自档位记忆,用户体验更好且逻辑更丰富。

过热保护触发时:

  • 立即停机优先于一切模式与档位逻辑
  • 解除过热后恢复到触发前的"模式+档位+节奏进度(可选)"

3 系统电路设计

3.1 硬件总体结构

本系统硬件模块划分如下:

  1. 单片机最小系统模块
  2. 按键输入模块(3个模式键 + 1个过热模拟键/信号)
  3. LED指示模块(3个LED对应三种风类)
  4. 直流电机驱动模块(PWM调速 + 使能控制)
  5. 数码管显示模块(档位显示 + 温度显示/复用显示)
  6. 温度检测模块(传感器 + 采样接口)
  7. 电源与稳压模块(5V/3.3V供电与去耦)
  8. 抗干扰与保护模块(续流二极管、滤波、电源隔离)

3.2 单片机最小系统模块

3.2.1 模块功能

单片机作为控制核心,负责:

  1. 扫描按键并完成消抖
  2. 控制LED指示风类模式
  3. 输出PWM信号控制电机转速
  4. 根据风类节奏表决定电机"运行/停歇"
  5. 检测过热信号并执行保护
  6. 采集温度并驱动数码管显示

3.2.2 电路要点

  1. 时钟:选用稳定晶振,便于定时器产生PWM与节拍。

  2. 复位:上电复位保证系统进入默认状态。

  3. 去耦:MCU电源端0.1uF+10uF,降低电机干扰导致复位风险。

  4. IO规划:

    • 3个按键输入
    • 1个过热信号输入
    • 3个LED输出
    • 1路PWM输出(可另加1路使能输出)
    • 数码管段选与位选IO(可用74HC595扩展减少IO)
    • 温度采集接口(ADC或单总线)

3.3 按键输入模块(模式键与过热模拟键)

3.3.1 模块功能

  1. 三个模式键用于模式选择与档位调节。
  2. 过热模拟键用于产生过热信号输入,高电平表示过热。

3.3.2 电路设计要点

  1. 按键建议使用上拉输入:

    • 未按下为高电平
    • 按下接地为低电平
  2. 若过热信号需要"高电平触发",则可采用:

    • 过热键按下输出高电平(下拉默认低)
    • 或用按键翻转一个软件变量模拟外部高电平信号
  3. 必须进行消抖处理,避免一次按键触发多次。


3.4 LED指示模块(三风类指示)

3.4.1 模块功能

通过三只LED直观显示当前风类:自然风、睡眠风、常风。

3.4.2 设计要点

  1. 每个LED串联限流电阻(典型220Ω~1kΩ)。

  2. 软件上确保互斥点亮:

    • 切换模式时先清除全部LED,再点亮目标LED
  3. 过热保护时可让当前LED闪烁(可选增强),用于提示"故障导致停机"。


3.5 直流电机驱动模块(PWM调速与停歇控制)

3.5.1 模块功能

该模块实现:

  1. 电机启停(通过使能控制或PWM=0)
  2. 电机转速调节(四档PWM占空比)
  3. 对电机的过流、反电动势保护(硬件层面)

3.5.2 驱动方案选择

单片机IO不能直接驱动直流电机,必须使用功率器件:

  1. NPN三极管/MOSFET低端开关驱动(常用)

    • MCU PWM输出→栅极/基极驱动→MOSFET导通→电机转动
    • 电机并联续流二极管吸收反电动势
  2. 电机驱动芯片(如L9110、L298N等)

    • 更适合需要正反转的电机,本题只需要停歇与不同速度,一般不需正反转

3.5.3 PWM频率与档位映射

PWM频率选择要避免明显啸叫并兼顾驱动损耗:

  • 2kHz20kHz均可,家用风扇电机通常可选8kHz16kHz。

四档占空比可设置为(示例):

  • 1档:30%
  • 2档:45%
  • 3档:65%
  • 4档:85%
    档位越高风力越大,且在自然风/睡眠风模式下停歇节奏不变,只改变运行段的PWM占空比。

3.5.4 续流与抗干扰设计

电机属于感性负载,必须:

  1. 并联续流二极管(如1N5819/FR107等)
  2. 可增加RC吸收或TVS抑制尖峰
  3. 电源端加电解电容(如470uF)缓冲瞬态电流
  4. PWM地线回路尽量短粗,避免干扰单片机地参考

3.6 数码管显示模块(档位显示与温度显示)

3.6.1 模块功能

数码管用于显示风力档位(1~4)以及室内温度。由于题目要求档位显示,同时还要温度显示,常见实现有两种:

  1. 两位或四位数码管动态显示

    • 常显示温度(例如"26"),同时用一个角标或短暂切换显示档位
  2. 两位显示温度 + 单独一位显示档位

    • 若硬件允许使用三位数码管,则更直观
  3. 时间复用显示(推荐用于资源有限)

    • 每隔1~2秒切换一次显示内容:

      • 显示温度800ms
      • 显示档位200ms
        既满足"显示档位",又能展示温度。

3.6.2 动态扫描与驱动

数码管通常采用动态扫描:

  • 段选输出a~g、dp
  • 位选轮流使能每一位
    需要定时器中断周期刷新(例如1ms~2ms切换一位),保证无闪烁。
    若IO不足,可用74HC595扩展段选/位选,减少占用并增强驱动。

3.7 温度检测模块

3.7.1 模块功能

检测室内温度并显示。常用传感器方案:

  1. DS18B20:数字输出,单总线,测温精度高,软件实现相对固定。
  2. NTC热敏电阻:模拟量采样,成本低,需要ADC与查表/拟合。
  3. LM35:模拟线性输出,需要ADC。

若单片机不带ADC,DS18B20是更常见的课程设计选择;若有外置ADC也可用NTC实现。

3.7.2 温度数据稳定性

温度显示建议:

  1. 每500ms~1000ms更新一次温度读数
  2. 进行简单滤波:例如4次平均
  3. 对显示值做限速变化:每次最多变化1℃,避免抖动(可选增强)

3.8 电源与稳压模块

3.8.1 模块功能

提供稳定直流电源:

  • 单片机与传感器:5V或3.3V
  • 电机:可使用独立电源或同源但需充分滤波

3.8.2 设计要点

  1. 单片机供电建议与电机供电分开或通过滤波隔离,避免电机启动电流导致MCU掉电复位。
  2. 在电机电源端增加大电容。
  3. 在MCU电源端增加去耦电容。

4 程序设计

4.1 软件总体结构

软件采用"定时任务 + 状态机"的架构,核心模块包括:

  1. 系统初始化模块
  2. 按键扫描与消抖模块
  3. 风类模式管理模块(自然/睡眠/常风)
  4. 档位管理模块(每模式四档,按键循环)
  5. PWM输出模块(生成占空比并驱动电机)
  6. 风类节奏控制模块(运行/停歇时序)
  7. 过热保护模块(最高优先级停机与恢复)
  8. 温度采集模块
  9. 数码管动态显示模块(档位与温度复用显示)
  10. 系统时基模块(1ms节拍)

其中关键是将"高速显示刷新"和"低速控制逻辑"分离:

  • 数码管扫描:1ms~2ms周期
  • PWM输出:硬件定时器自动输出或软件PWM(不推荐软件PWM)
  • 按键扫描:10ms周期
  • 风类节奏:以100ms或更大粒度计时
  • 温度更新:500ms~1000ms

4.2 关键数据结构与变量设计

4.2.1 模式与档位变量

  • mode:当前风类模式

    • 0:常风
    • 1:自然风
    • 2:睡眠风
  • gear[3]:每个模式的档位(1~4),实现独立记忆

  • cur_gear:当前模式档位引用

4.2.2 过热保护变量

  • overheat:过热信号标志(高电平为1)
  • saved_modesaved_gear:过热触发前保存,用于恢复
  • motor_enable:电机允许输出标志(过热时为0)

4.2.3 节奏控制变量

  • run_phase:当前节奏段(运行/停歇段索引)
  • phase_ms:当前节奏段已运行时间
  • phase_target_ms:该段持续时间
  • phase_is_run:该段是否为运行段(1运行0停歇)

4.2.4 显示变量

  • disp_mode:当前显示内容(温度/档位)
  • disp_timer:用于周期切换显示内容
  • temp_c:温度值(整数或带一位小数)

4.3 系统初始化模块

4.3.1 初始化内容

  1. 初始化IO:LED、按键、数码管段位、过热输入

  2. 初始化定时器:

    • 定时器A:数码管扫描(1ms)
    • 定时器B:系统节拍(1ms)或复用同一定时器
    • PWM定时器:产生PWM输出
  3. 初始化温度传感器接口

  4. 初始化默认模式与档位:可默认常风1档

  5. 初始化节奏参数与显示策略

4.3.2 初始化示例代码

c 复制代码
typedef enum { MODE_CONSTANT=0, MODE_NATURAL=1, MODE_SLEEP=2 } FAN_MODE;

volatile unsigned long ms_tick = 0;

FAN_MODE mode = MODE_CONSTANT;
unsigned char gear[3] = {1,1,1}; // 三模式独立记忆
unsigned char cur_gear = 1;

bit motor_enable = 1;
bit overheat = 0;

void System_Init(void)
{
    IO_Init();
    Timer_Init();
    PWM_Init();
    Seg_Init();
    TempSensor_Init();

    mode = MODE_CONSTANT;
    gear[0] = gear[1] = gear[2] = 1;
    cur_gear = 1;

    motor_enable = 1;
    overheat = 0;

    LED_Update(mode);
    PWM_SetByGear(cur_gear);
}

4.4 按键扫描与档位调节模块

4.4.1 按键消抖与触发方式

采用10ms扫描周期,使用"按下沿触发"识别一次按键动作。每个按键触发后:

  1. 若按键对应的模式不是当前模式:切换模式
  2. 若按键对应的模式就是当前模式:档位+1循环(1→2→3→4→1)

4.4.2 逻辑示例代码

c 复制代码
bit Key_Click(bit key_now, bit *key_last)
{
    bit click = (*key_last == 1 && key_now == 0) ? 1 : 0;
    *key_last = key_now;
    return click;
}

void Gear_Inc(unsigned char *g)
{
    (*g)++;
    if(*g > 4) *g = 1;
}

void Key_Task_10ms(void)
{
    static bit lastN=1, lastS=1, lastC=1;

    bit kn = READ_KEY_N(); // 1未按 0按下
    bit ks = READ_KEY_S();
    bit kc = READ_KEY_C();

    if(Key_Click(kn, &lastN))
    {
        if(mode != MODE_NATURAL)
        {
            mode = MODE_NATURAL;
            cur_gear = gear[MODE_NATURAL];
        }
        else
        {
            Gear_Inc(&gear[MODE_NATURAL]);
            cur_gear = gear[MODE_NATURAL];
        }
        LED_Update(mode);
        PWM_SetByGear(cur_gear);
        Rhythm_Reset(mode);
    }

    if(Key_Click(ks, &lastS))
    {
        if(mode != MODE_SLEEP)
        {
            mode = MODE_SLEEP;
            cur_gear = gear[MODE_SLEEP];
        }
        else
        {
            Gear_Inc(&gear[MODE_SLEEP]);
            cur_gear = gear[MODE_SLEEP];
        }
        LED_Update(mode);
        PWM_SetByGear(cur_gear);
        Rhythm_Reset(mode);
    }

    if(Key_Click(kc, &lastC))
    {
        if(mode != MODE_CONSTANT)
        {
            mode = MODE_CONSTANT;
            cur_gear = gear[MODE_CONSTANT];
        }
        else
        {
            Gear_Inc(&gear[MODE_CONSTANT]);
            cur_gear = gear[MODE_CONSTANT];
        }
        LED_Update(mode);
        PWM_SetByGear(cur_gear);
        Rhythm_Reset(mode);
    }
}

Rhythm_Reset(mode)用于在切换模式时重置节奏段索引,使体验更一致。


4.5 PWM输出模块(四档风力)

4.5.1 档位到占空比映射

将档位映射为PWM占空比。示例:

  • 档1:30%
  • 档2:45%
  • 档3:65%
  • 档4:85%

4.5.2 PWM设置示例

c 复制代码
void PWM_SetByGear(unsigned char g)
{
    switch(g)
    {
        case 1: PWM_SetDuty(30); break;
        case 2: PWM_SetDuty(45); break;
        case 3: PWM_SetDuty(65); break;
        case 4: PWM_SetDuty(85); break;
        default: PWM_SetDuty(30); break;
    }
}

在停歇段需要停机时,可以:

  • PWM_SetDuty(0)
  • 关闭电机使能脚 MOTOR_EN = 0(更彻底)

4.6 风类节奏控制模块(运行/停歇)

4.6.1 节奏表驱动思想

将每种风类的"运行/停歇"定义为一个节奏表:

  • 每个节奏段包含:持续时间ms、是否运行
    系统按段执行,到末尾循环回开头。

4.6.2 三种风类节奏示例

  1. 常风:始终运行

    • 段0:运行 100000ms(可视为无限)
  2. 睡眠风:规律柔和

    • 段0:运行 6000ms
    • 段1:停歇 2000ms
  3. 自然风:更拟自然、变化多

    • 段0:运行 3000ms
    • 段1:停歇 1000ms
    • 段2:运行 2000ms
    • 段3:停歇 800ms
    • 段4:运行 4000ms
    • 段5:停歇 1500ms

这样自然风会有不均匀的阵风感,而睡眠风更规律柔和。

4.6.3 节奏控制实现示例

c 复制代码
typedef struct {
    unsigned int dur_ms;
    bit is_run;
} RH_SEG;

#define NAT_SEG_N 6
#define SLP_SEG_N 2
#define CST_SEG_N 1

code RH_SEG rh_nat[NAT_SEG_N] = {
    {3000,1},{1000,0},{2000,1},{800,0},{4000,1},{1500,0}
};
code RH_SEG rh_slp[SLP_SEG_N] = {
    {6000,1},{2000,0}
};
code RH_SEG rh_cst[CST_SEG_N] = {
    {60000,1}
};

unsigned char seg_idx = 0;
unsigned long seg_enter_ms = 0;

void Rhythm_Reset(FAN_MODE m)
{
    seg_idx = 0;
    seg_enter_ms = ms_tick;
}

void Rhythm_Task(void)
{
    if(!motor_enable) return; // 过热停机时不推进节奏也可,按需求决定

    const RH_SEG *tbl = 0;
    unsigned char n = 0;

    if(mode == MODE_NATURAL) { tbl = rh_nat; n = NAT_SEG_N; }
    else if(mode == MODE_SLEEP){ tbl = rh_slp; n = SLP_SEG_N; }
    else { tbl = rh_cst; n = CST_SEG_N; }

    unsigned long elapsed = ms_tick - seg_enter_ms;

    if(elapsed >= tbl[seg_idx].dur_ms)
    {
        seg_idx++;
        if(seg_idx >= n) seg_idx = 0;
        seg_enter_ms = ms_tick;
    }

    // 按当前段决定运行/停歇
    if(tbl[seg_idx].is_run)
    {
        Motor_Enable(1);
        PWM_SetByGear(cur_gear);
    }
    else
    {
        Motor_Enable(0); // 停歇段停机
    }
}

说明:如果希望自然风更"随机",可在自然风模式下在段切换时用伪随机数改变下一段时长,但题目只要求"通过停歇时间区分",表驱动已满足。


4.7 过热保护模块(模拟过热信号)

4.7.1 保护优先级与恢复策略

过热保护优先级最高:

  1. 检测到过热高电平:立即停机(无论当前处于运行段还是停歇段)
  2. 进入"保护状态"但不丢失用户设置:保留模式与档位
  3. 过热解除:自动恢复电机运行,并继续当前模式与档位
  4. 可选:恢复后将节奏重新从段0开始,让体验更可预期;也可以继续原来的节奏进度。

4.7.2 示例代码

c 复制代码
bit Read_Overheat(void) // 高电平为过热
{
    return OVERHEAT_PIN ? 1 : 0;
}

bit last_overheat = 0;

void Overheat_Task(void)
{
    overheat = Read_Overheat();

    if(overheat && !last_overheat)
    {
        // 刚进入过热
        motor_enable = 0;
        Motor_Enable(0);
    }
    else if(!overheat && last_overheat)
    {
        // 过热解除
        motor_enable = 1;
        Rhythm_Reset(mode); // 可选:重置节奏
    }

    last_overheat = overheat;
}

过热期间可让LED闪烁或数码管显示"---",这里可在显示模块中根据overheat状态显示提示,提高系统可用性。


4.8 温度采集模块

4.8.1 温度更新周期

建议每500ms更新一次温度值,并进行简单滤波,避免跳动。

4.8.2 DS18B20读取示例框架(简化)

c 复制代码
int temp_c = 25;

int Temp_ReadC(void)
{
    // 示例框架:实际需实现单总线时序
    return DS18B20_ReadIntegerC();
}

void Temp_Task_500ms(void)
{
    static unsigned long last = 0;
    if(ms_tick - last >= 500)
    {
        last = ms_tick;
        temp_c = Temp_ReadC();
    }
}

若使用NTC+ADC,则可通过外置ADC读取后查表换算温度,同样在500ms周期进行更新。


4.9 数码管显示模块(档位与温度复用显示)

4.9.1 显示策略设计

为了同时显示温度与档位,可采用"时间复用":

  • 80%时间显示温度(两位数)
  • 20%时间显示档位(1~4)
    这样用户既能看温度,也能随时看到当前档位。

也可采用"温度常显,档位短闪提示":当用户调档时,数码管短暂显示档位1秒后回到温度显示,更符合实际产品交互。

4.9.2 动态扫描与显示内容生成

假设使用两位数码管:

  • 温度显示:temp_c的十位与个位
  • 档位显示:左位显示G(无法显示则空),右位显示档位数字;或直接两位都显示档位(如"01""02""03""04")

示例:采用两位显示档位为"01~04",更直观且不需要字母段码。

4.9.3 显示内容生成示例

c 复制代码
unsigned char seg_buf[2] = {0,0}; // 两位段码缓存

unsigned char SEG_CODE_NUM[10] = {
    /*0~9段码表,具体取决于共阳/共阴,此处略*/
};

void Build_DisplayBuffer(void)
{
    static unsigned long disp_sw_ms = 0;
    static bit show_gear = 0;

    // 过热时优先显示提示:例如"--"
    if(overheat)
    {
        seg_buf[0] = SEG_CODE_DASH;
        seg_buf[1] = SEG_CODE_DASH;
        return;
    }

    // 每2秒切换一次显示内容(示例)
    if(ms_tick - disp_sw_ms >= 2000)
    {
        disp_sw_ms = ms_tick;
        show_gear = !show_gear;
    }

    if(show_gear)
    {
        // 显示档位:01~04
        seg_buf[0] = SEG_CODE_NUM[0];
        seg_buf[1] = SEG_CODE_NUM[cur_gear];
    }
    else
    {
        // 显示温度:两位整数
        int t = temp_c;
        if(t < 0) t = 0;
        if(t > 99) t = 99;

        seg_buf[0] = SEG_CODE_NUM[t/10];
        seg_buf[1] = SEG_CODE_NUM[t%10];
    }
}

4.9.4 数码管扫描中断示例

c 复制代码
void Seg_Scan_ISR(void) interrupt 1
{
    static unsigned char pos = 0;

    Seg_AllOff();
    Seg_SetSegments(seg_buf[pos]);
    Seg_EnablePos(pos);

    pos ^= 1; // 两位切换
}

4.10 LED指示更新模块

4.10.1 正常指示

切换模式时点亮对应LED,其他熄灭。

4.10.2 过热指示(可选增强)

过热时让当前模式LED闪烁,提示"因保护停机"。

示例:

c 复制代码
void LED_Update(FAN_MODE m)
{
    LED_N = 0; LED_S = 0; LED_C = 0;
    if(m == MODE_NATURAL) LED_N = 1;
    else if(m == MODE_SLEEP) LED_S = 1;
    else LED_C = 1;
}

void LED_FaultBlink_Task(void)
{
    static unsigned long last = 0;
    static bit on = 0;

    if(!overheat) return;

    if(ms_tick - last >= 200)
    {
        last = ms_tick;
        on = !on;
        // 闪烁当前模式LED
        LED_N = (mode==MODE_NATURAL) ? on : 0;
        LED_S = (mode==MODE_SLEEP) ? on : 0;
        LED_C = (mode==MODE_CONSTANT) ? on : 0;
    }
}

4.11 主程序框架与任务调度

4.11.1 调度周期建议

  • 1ms:数码管扫描中断、系统tick累加
  • 10ms:按键扫描
  • 50ms~100ms:节奏控制刷新
  • 500ms:温度更新
  • 20ms~200ms:LED闪烁与显示内容构建

4.11.2 主程序示例

c 复制代码
int main(void)
{
    System_Init();

    while(1)
    {
        // 过热优先处理
        Overheat_Task();

        // 传感器更新
        Temp_Task_500ms();

        // 按键处理
        if(Time_Elapsed_10ms())
            Key_Task_10ms();

        // 节奏控制(自然风/睡眠风/常风)
        Rhythm_Task();

        // 显示内容构建
        Build_DisplayBuffer();

        // 过热时LED闪烁提示(可选)
        LED_FaultBlink_Task();
    }
}

5 可靠性与工程化设计要点

5.1 电机干扰与系统稳定性

直流电机启动与PWM调速会带来电源波动与电磁干扰,可能导致单片机复位、数码管闪烁或按键误触发。建议:

  1. 电机电源与逻辑电源尽量分开,或通过电感/电阻+电容形成滤波。
  2. 电机端并联续流二极管与电容(如0.1uF)降低火花干扰。
  3. 单片机电源端做充分去耦。
  4. 关键输入(按键、过热信号)做硬件RC滤波或软件去抖。

5.2 模式节奏参数的人体体验优化

不同环境用户对"自然风"和"睡眠风"的体感偏好不同:

  1. 自然风建议停歇更短、变化更随机,避免过于机械。
  2. 睡眠风建议停歇更长或整体偏低档,避免夜间风感过强。
  3. 可通过调节节奏表参数优化体验,而不改变硬件。

5.3 过热保护的安全性

过热保护应始终优先于模式与档位:

  1. 过热触发立即停机,不进行任何延时。
  2. 解除后自动恢复,但建议增加"恢复延时"(如1秒)避免过热信号抖动导致频繁启停。
  3. 若后续扩展真实温度过热保护,可在温度传感器基础上直接实现阈值保护,按键模拟仅用于仿真验证。

5.4 温度显示的可用性

温度显示建议:

  1. 采用整数显示足够直观,必要时可扩展一位小数。
  2. 限制显示刷新速度,避免抖动。
  3. 若温度与档位共用数码管,应保证档位显示在用户调档后能立即可见(例如调档后强制显示档位1秒)。

6 总结

基于单片机的多模式档位调节与过热保护风扇设计通过三独立按键实现自然风、睡眠风、常风三种风类的快速选择与LED指示,并在每种风类下通过按键次数实现1~4档风力循环调节,数码管实时显示档位信息。系统利用直流电机PWM调速结合运行/停歇节奏表,实现三种风类在体感上的差异化:常风连续稳定,自然风强弱与间歇变化更明显,睡眠风节奏更柔和适合夜间使用。系统同时加入过热保护功能,通过按键模拟过热信号输入,高电平触发立即停机,信号解除后自动恢复原模式与档位,体现安全保护优先级与自动恢复能力。

在电路设计方面,系统以单片机最小系统为核心,按键输入模块负责模式与保护信号采集,LED模块直观指示当前风类,电机驱动模块通过MOSFET/驱动器实现PWM调速并配合续流与滤波保证可靠性,数码管动态扫描显示档位与温度信息,温度检测模块提供室内温度采集基础,电源与抗干扰设计确保系统在电机负载干扰下稳定运行。

在程序设计方面,系统采用定时任务与状态/节奏控制相结合的结构,将按键消抖、档位管理、PWM输出、节奏表驱动、过热保护、温度采集与数码管显示等功能模块化实现,逻辑清晰、可维护性强,并可进一步扩展为真实过热温控保护、自动温控调档、遥控/蓝牙控制等更高级的智能风扇功能。

相关推荐
星源~2 小时前
Zephyr - MCU 开发快速入门指南
单片机·嵌入式硬件·物联网·嵌入式开发·zephyr
星源~2 小时前
zephyr-开发环境配置疑难问题解决
单片机·嵌入式硬件·物联网·项目开发
BMS小旭2 小时前
CubeMx-DMA
单片机·学习·cubemx·dma
电子小白12312 小时前
第13期PCB layout工程师初级培训-1-EDA软件的通用设置
笔记·嵌入式硬件·学习·pcb·layout
清风66666612 小时前
基于单片机的多传感器智能云梯逃生控制器设计
单片机·嵌入式硬件·毕业设计·智能家居·课程设计
小何code12 小时前
STM32入门教程,第10课(上),OLED显示屏
stm32·单片机·嵌入式硬件
来自晴朗的明天12 小时前
高速画板-USB模块的PCB设计5-USB2.0/3.0布局布线要求
单片机·嵌入式硬件·硬件工程
早日退休!!!15 小时前
ARM Cortex-M核 【保存上下文&恢复上下文】
arm开发·单片机·嵌入式硬件
源码获取_wx:Fegn089515 小时前
基于 vue智慧养老院系统
开发语言·前端·javascript·vue.js·spring boot·后端·课程设计