本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本文介绍了一个基于可控硅、单片机和电扇的智能控制系统。可控硅用于调节电机电压实现调速,单片机负责接收用户指令并控制可控硅导通角。系统通过脉宽调制(PWM)技术实现高效调速,并可集成湿度传感器,实现根据环境湿度自动调节风速的功能。文章涵盖硬件连接、程序设计、PID控制算法及安全保护措施,适用于智能家电和自动化控制领域的学习与实践。
可控硅+单片机+电扇

1. 可控硅基本结构与工作原理

可控硅(Silicon Controlled Rectifier,SCR)是一种四层三端的半导体器件,结构上由四个交替的P型与N型半导体层组成,形成PNPN结构。其三个引脚分别为阳极(A)、阴极(K)和控制极(G)。在正向电压作用下,控制极施加触发信号可使器件导通,从而实现对电流的可控调节。

其核心特性在于正向导通与反向阻断:当阳极电压高于阴极且控制极有触发信号时,SCR导通;而在反向电压下则始终处于截止状态。导通后,维持电流(IH)必须保持一定值以上才能维持导通状态,否则将自动关断。

该特性使其广泛应用于交流调压、电机调速等领域,尤其适合电扇等负载的无级调速控制系统。

2. 单片机在电扇控制中的核心作用

在现代智能家电中,单片机(Microcontroller Unit, MCU)扮演着“大脑”的角色。特别是在电扇控制系统中,单片机不仅负责数据采集、逻辑判断,还承担着驱动执行机构、调节输出信号的关键任务。本章将深入探讨单片机在电扇控制中的系统架构、任务分配、与外围电路的协同机制,以及程序开发流程。

2.1 单片机系统架构概述

2.1.1 常见单片机类型与选型标准

在电扇控制应用中,常用的单片机类型包括:

单片机系列 厂商 特点 适用场景
AVR系列(如ATmega328P) Microchip 低功耗、集成ADC、PWM模块 低成本风扇控制
STM32系列(如STM32F103C8T6) STMicroelectronics 高性能、多种外设接口、实时性强 中高端智能电扇
PIC系列(如PIC16F877A) Microchip 易于编程、稳定性高 工业风扇控制系统
ESP8266/ESP32 Espressif 集成Wi-Fi、蓝牙、适合物联网 智能风扇远程控制

选型标准

  • 性能需求 :是否需要多通道PWM、ADC、定时器等。
  • 功耗要求 :适用于低功耗待机模式的MCU更佳。
  • 开发资源 :是否有成熟的开发环境和社区支持。
  • 成本控制 :根据产品定位选择性价比高的MCU。
  • 可扩展性 :是否支持未来功能升级,如增加Wi-Fi模块。

2.1.2 单片机最小系统构成

一个单片机最小系统是使其正常运行所必须的基本电路模块。典型的最小系统包括:

graph TD
    A[MCU核心] --> B[电源供电]
    A --> C[时钟电路]
    A --> D[复位电路]
    A --> E[调试接口]
  • 电源供电 :通常使用3.3V或5V稳压电路,如AMS1117或LM1117。
  • 时钟电路 :使用外部晶振(如8MHz或16MHz)或内部RC振荡器。
  • 复位电路 :RC电路与复位按键组成,用于系统复位。
  • 调试接口 :如SWD、JTAG或UART,用于程序烧录与调试。

2.2 单片机在电扇控制系统中的任务分配

2.2.1 信号采集与数据处理

单片机通过ADC(模数转换器)接口采集来自传感器的数据,例如:

  • 温度传感器 (如DS18B20):获取环境温度。
  • 湿度传感器 (如DHT11、DHT22):检测空气湿度。
  • 红外遥控接收头 (如VS1838B):接收遥控指令。
  • 按键输入 :手动控制风速与模式。

示例代码:使用STM32读取ADC电压(模拟湿度信号):

#include "stm32f10x.h"

void ADC_Init(void) {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStructure);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);
    ADC_Cmd(ADC1, ENABLE);

    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

uint16_t Read_ADC(void) {
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
    return ADC_GetConversionValue(ADC1);
}

代码逻辑分析

  • ADC_Init() :初始化ADC模块,设置为连续转换模式。
  • ADC_RegularChannelConfig() :配置通道0为采集通道。
  • ADC_ResetCalibration() ADC_StartCalibration() :进行ADC校准,确保精度。
  • Read_ADC() :读取当前ADC转换值。

2.2.2 控制策略执行与输出调节

单片机根据采集到的数据(如湿度、温度),结合预设的控制策略,输出PWM信号控制电机转速或控制可控硅导通角。例如:

  • 若湿度高于设定值,启动高风速。
  • 若接收到“低速”遥控指令,调整PWM占空比为30%。
  • 若检测到过热,自动降速或停机。

典型控制逻辑伪代码如下:

if (humidity > 60) {
    set_pwm_duty(80); // 高速运行
} else if (humidity > 40) {
    set_pwm_duty(50); // 中速运行
} else {
    set_pwm_duty(20); // 低速运行
}

逻辑说明

  • set_pwm_duty() :设置PWM输出的占空比,控制电机功率。
  • 系统可根据传感器数据动态调整输出,实现智能控制。

2.3 单片机与外围电路的协同控制

2.3.1 输入信号接口设计

输入信号包括传感器数据、遥控信号、按钮输入等。接口设计需考虑:

  • 电平匹配 :确保输入信号与MCU电平兼容(如3.3V或5V)。
  • 防抖动处理 :机械按键需加RC滤波或软件延时去抖。
  • 信号隔离 :高压信号需使用光耦或继电器隔离,防止损坏MCU。

示例:红外遥控信号接收电路

graph LR
    A[红外遥控器] --> B[VS1838B接收头]
    B --> C[MCU的GPIO引脚]
    C --> D[解码程序处理]

2.3.2 输出驱动与隔离电路配置

单片机输出信号通常不足以直接驱动电机或可控硅,因此需要驱动电路:

  • MOSFET/晶体管驱动电路 :用于控制直流电机。
  • 光耦+可控硅驱动电路 :用于交流调压控制。
  • 继电器控制电路 :用于大功率开关控制。

示例:使用光耦MOC3021驱动可控硅:

graph LR
    A[MCU GPIO] --> B[MOC3021输入]
    B --> C[可控硅MT1/MT2]
    C --> D[交流电机]

2.4 单片机程序开发流程

2.4.1 程序开发环境搭建

开发环境通常包括:

  • IDE :Keil uVision、STM32CubeIDE、Arduino IDE、PlatformIO等。
  • 编译器 :GCC、Keil C、IAR等。
  • 调试工具 :J-Link、ST-Link、USB转TTL等。
  • 版本控制 :Git + GitHub/Gitee托管平台。

开发流程步骤

  1. 创建工程并配置MCU型号。
  2. 配置系统时钟、GPIO、ADC、PWM等外设。
  3. 编写主程序逻辑与中断服务函数。
  4. 编译、下载并调试程序。
  5. 测试功能并优化代码。

2.4.2 调试与烧录技术要点

  • 串口调试 :通过UART打印调试信息,观察变量状态。
  • 断点调试 :使用调试器设置断点,逐行执行代码。
  • 烧录方式 :支持ISP、SWD、OTA等方式。
  • 烧录工具 :ST-Link V2、USBasp、Arduino Bootloader等。

示例:使用STM32CubeIDE进行调试配置

graph LR
    A[编写代码] --> B[配置调试器]
    B --> C[连接ST-Link]
    C --> D[下载程序]
    D --> E[开始调试]

调试技巧

  • 使用 printf() 重定向到串口输出变量值。
  • 利用定时器中断模拟传感器数据输入。
  • 在关键位置添加LED闪烁提示程序运行状态。

本章全面分析了单片机在电扇控制系统中的核心作用,从硬件选型、最小系统构建,到信号采集、控制策略执行,再到外围电路协同与程序开发流程。通过具体代码示例与电路图解析,为后续章节中实现完整的电扇智能控制系统奠定了坚实基础。

3. 可控硅导通角与PWM调速技术

3.1 可控硅导通角调节原理

3.1.1 导通角与输出电压关系分析

可控硅(SCR)作为电力电子器件,广泛应用于交流调压和电机调速系统中。其核心原理是通过控制导通角(firing angle)来调节输出电压,从而实现对负载功率的控制。

导通角是指在交流电压的每个半周期中,从电压波形过零点开始到可控硅被触发导通的时间所对应的角度。例如,在标准50Hz交流电中,一个完整周期为360°,每个半波为180°。若在90°时触发可控硅导通,则导通角α = 90°。

导通角与输出电压的关系 可通过如下公式进行分析:

V_{out} = \frac{V_m}{\pi} (1 + \cos\alpha)

其中:

  • $ V_{out} $:输出电压有效值
  • $ V_m $:输入交流电压的峰值
  • $ \alpha $:导通角(单位为弧度)

这个公式表明,导通角越大,输出电压越低。通过调节α的大小,可以实现对输出电压的连续调节。

导通角调节的实际意义 在于:

  • 能够实现无级调速,适用于风机、电机等需要精细控制的设备。
  • 通过改变触发角,可避免对电网造成突变冲击,实现软启动。
  • 适用于对功率因数要求不高的场合,如家用电器中的电扇控制。

3.1.2 触发脉冲的生成与同步控制

为了实现导通角的精确控制,必须确保可控硅的触发脉冲与交流电源保持同步。这一过程包括:

  1. 过零检测电路 :用于检测交流电压的过零点,作为触发脉冲的基准时间点。
  2. 延时计时器 :根据所需的导通角α,计算出对应的延时时间,并在该时间点输出触发脉冲。
  3. 触发信号驱动电路 :将单片机生成的触发信号放大并隔离,确保能可靠触发可控硅导通。

下面是一个基于单片机的可控硅触发脉冲生成流程图:

graph TD
    A[电源输入] --> B{过零检测}
    B --> C[检测到过零信号]
    C --> D[启动延时定时器]
    D --> E[延时时间到]
    E --> F[输出触发脉冲]
    F --> G[可控硅导通]

代码示例:
使用STM32单片机实现可控硅触发控制的代码片段如下:

// 假设使用TIM2定时器,中断频率为1kHz,用于延时计算
volatile uint16_t trigger_delay = 0; // 导通角对应的延时值(单位为ms)

void TIM2_IRQHandler(void) {
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
        static uint16_t counter = 0;
        counter++;
        if (counter >= trigger_delay) {
            GPIO_SetBits(GPIOB, GPIO_Pin_0); // 输出高电平触发可控硅
            counter = 0;
        }
    }
}

// 在检测到过零信号后调用此函数设置延时
void set_trigger_angle(uint16_t angle) {
    // 假设每个周期为20ms(50Hz),将角度转换为延时时间(ms)
    trigger_delay = (angle * 20) / 360;
    GPIO_ResetBits(GPIOB, GPIO_Pin_0); // 清除触发信号
}

代码逻辑分析:

  • TIM2_IRQHandler 是定时器中断服务函数,每毫秒执行一次。
  • trigger_delay 表示从过零点到触发可控硅导通所需的时间。
  • set_trigger_angle 函数将导通角转换为对应的延时时间(单位为毫秒),并通过定时器控制触发脉冲的输出时机。

参数说明:

  • angle :传入的导通角值,范围为0°~180°。
  • trigger_delay :实际延时时间,决定触发时刻。
  • GPIOB_PIN0 :用于输出触发信号,连接到可控硅的控制极。

通过上述机制,可实现对可控硅导通角的精确控制,从而调节输出电压和电机转速。

3.2 脉宽调制(PWM)调速机制

3.2.1 PWM波形生成方式

PWM(Pulse Width Modulation)是一种通过调节脉冲宽度来控制输出功率的技术,广泛应用于直流电机调速和开关电源中。其基本原理是通过改变脉冲的占空比来调节输出平均电压,从而控制负载功率。

PWM波形的生成方式主要有以下几种:

  1. 软件延时法 :通过单片机GPIO口手动控制高低电平切换,适用于低频PWM波。
  2. 定时器PWM模式 :利用单片机内置定时器模块生成高精度PWM信号。
  3. 专用PWM芯片 :如LMC555、TL494等,适用于需要高精度和高频的场合。

代码示例:
以STM32F103为例,使用TIM3定时器生成1kHz、占空比50%的PWM波:

void PWM_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct;
    TIM_OCInitTypeDef TIM_OCStruct;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    // 配置PB5为复用推挽输出
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    // 定时器基本配置:1kHz
    TIM_TimeBaseStruct.TIM_Prescaler = 72 - 1;       // 72MHz / 72 = 1MHz
    TIM_TimeBaseStruct.TIM_Period = 1000 - 1;         // 1MHz / 1000 = 1kHz
    TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStruct);

    // PWM输出配置:占空比50%
    TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCStruct.TIM_Pulse = 500;  // 占空比 = 500 / 1000 = 50%
    TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM3, &TIM_OCStruct);
    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

    TIM_Cmd(TIM3, ENABLE);
    TIM_CtrlPWMOutputs(TIM3, ENABLE);
}

代码逻辑分析:

  • 使用TIM3定时器产生1kHz的PWM波形。
  • 配置预分频器为72,使得定时器计数频率为1MHz。
  • 设置周期为1000,即1kHz频率。
  • TIM_OCStruct.TIM_Pulse = 500 表示高电平持续时间为周期的一半,实现50%占空比。

参数说明:

  • TIM_Prescaler :预分频器值,用于降低定时器输入频率。
  • TIM_Period :定时器周期值,决定PWM频率。
  • TIM_Pulse :脉冲宽度值,决定占空比。

3.2.2 占空比对电机转速的影响

在直流电机控制中,PWM占空比与电机转速成近似线性关系。当占空比为0%时,电机不转;占空比为100%时,电机全速运行。

占空比与转速的关系可用如下公式表示:

N = N_{max} \times \frac{D}{100}

其中:

  • $ N $:实际转速(RPM)
  • $ N_{max} $:最大转速(额定电压下的转速)
  • $ D $:占空比(单位为百分比)

下表展示了不同占空比对应的电机转速示例(假设最大转速为1200 RPM):

占空比 (%) 转速 (RPM)
0 0
20 240
40 480
60 720
80 960
100 1200

PWM调速优势:

  • 控制精度高,响应速度快。
  • 适用于直流电机,效率高。
  • 易于实现闭环控制(如PID控制)。

3.3 导通角与PWM调速的对比分析

3.3.1 两种调速方式的优缺点

项目 可控硅导通角调速 PWM调速
适用电源类型 交流 直流
控制方式 改变导通角 改变占空比
效率 一般
控制精度
电磁干扰(EMI)
实现复杂度 较复杂(需同步控制) 简单(可通过单片机直接生成)
成本
应用场景 大功率交流电机、风扇 小功率直流电机、电子设备

导通角调速的优势 在于可以直接用于交流电源控制,适用于传统电扇等设备。而 PWM调速 在现代控制系统中更常见,因其易于实现高精度、高效率的调速控制。

3.3.2 实际应用中的选择依据

选择调速方式应考虑以下因素:

  • 电源类型 :交流电源优先考虑可控硅导通角控制,直流电源优先考虑PWM。
  • 功率等级 :大功率设备可使用可控硅,小功率则用MOSFET+PWM更合适。
  • 控制精度 :PWM具有更高的控制精度,适用于闭环控制。
  • 成本与实现难度 :PWM实现更简单,适合嵌入式系统快速开发。
  • 电磁干扰 :PWM频率高时需考虑滤波和屏蔽设计。

3.4 数字控制下的调速系统实现

3.4.1 单片机生成调速信号流程

在现代电扇控制系统中,通常采用单片机作为主控单元,通过数字方式生成调速信号。其流程如下:

graph TD
    A[设定转速] --> B[映射为控制参数]
    B --> C[计算导通角或占空比]
    C --> D[生成触发信号或PWM]
    D --> E[输出至驱动电路]
    E --> F[电机转速变化]

关键步骤说明:

  1. 设定转速 :用户通过按键或传感器设定目标转速。
  2. 映射为控制参数 :根据预设的转速-控制参数映射表,将转速转换为导通角或占空比。
  3. 生成信号 :单片机根据计算结果生成触发脉冲(导通角控制)或PWM波形。
  4. 驱动输出 :通过驱动电路(如光耦、MOSFET、可控硅)将信号输出至电机。
  5. 反馈调节 :结合转速传感器或电流反馈,实现闭环控制。

3.4.2 调速响应速度与稳定性优化

在数字调速系统中,响应速度和稳定性是两个关键指标。优化方法包括:

  1. 提高PWM频率 :高频PWM可减少电机转矩脉动,提升响应速度。
  2. 引入PID控制 :通过比例、积分、微分控制,提升系统的动态响应和稳态精度。
  3. 滤波与抗干扰设计 :加入RC滤波电路或软件滤波算法,抑制噪声干扰。
  4. 动态调整控制参数 :根据负载变化实时调整PWM占空比或导通角,提升稳定性。
  5. 优化中断响应机制 :减少中断延迟,提升系统实时性。

优化效果对比示例:

优化方式 响应时间(ms) 稳定误差(RPM)
无优化 200 ±50
引入PID控制 80 ±10
提高PWM频率至20kHz 50 ±5
综合优化 30 ±2

综上所述,可控硅导通角调速与PWM调速各有适用场景。在现代智能电扇系统中,往往结合使用,如使用可控硅控制交流电机,或使用PWM控制直流无刷电机,同时借助单片机实现高精度、高稳定性的调速控制。

4. 湿度感知与数据采集系统

湿度感知与数据采集系统是智能电扇控制系统中实现环境自适应调节的核心模块之一。该系统通过传感器感知环境湿度,将物理量转化为电信号,并通过单片机的ADC模块进行数据采集、处理与分析,最终用于驱动风扇转速调节。本章将从湿度传感器选型、ADC数据采集、滤波算法应用以及湿度-转速映射关系设计四个方面,系统性地阐述整个湿度感知系统的构建过程。

4.1 湿度传感器的选择与特性

在构建湿度感知系统时,传感器的选型直接影响系统的精度、稳定性与成本。现代湿度传感器种类繁多,根据输出信号类型可划分为模拟输出型与数字输出型两大类。

4.1.1 常见湿度传感器类型

目前主流的湿度传感器主要包括以下几种:

传感器类型 输出形式 代表型号 特点
模拟式湿度传感器 模拟电压输出 HIH-3610 成本低,需外部ADC采集,适合中低端应用
数字式温湿度传感器 数字信号(I²C/SPI) SHT30、DHT22 高精度、集成温湿度检测,通信协议复杂
电容式湿度传感器 电容变化 HM1500 线性度较好,需配合信号调理电路使用
电阻式湿度传感器 电阻变化 HS1101 成本低廉,线性度较差,需软件补偿

在智能电扇控制中,推荐采用数字式温湿度传感器(如SHT30),因其具有以下优势:

  • 高精度 :典型精度±2%RH;
  • 集成性好 :内置温度补偿;
  • 数字接口 :便于与单片机通信,减少外部电路复杂度;
  • 低功耗 :适合嵌入式系统长期运行。

4.1.2 输出信号类型与线性度分析

以SHT30为例,其输出为数字信号,通过I²C总线与单片机通信,返回的是经过内部校准和补偿的湿度数据。这种数字输出方式避免了模拟信号采集中的误差累积问题。

对于模拟式传感器(如HIH-3610),其输出为0~1V的模拟电压,对应0%~100%RH的湿度范围,具有良好的线性度,但在实际应用中仍需考虑以下因素:

  • ADC采样精度 :若使用10位ADC,最小分辨率为约0.39%RH;
  • 温度漂移 :需配合温度传感器进行补偿;
  • 信号调理电路 :如放大器、滤波器等,以提升信噪比。

4.2 ADC模块实现湿度数据采集

对于使用模拟式湿度传感器的系统,ADC模块是实现数据采集的关键部件。其性能直接影响湿度测量的准确性和稳定性。

4.2.1 ADC模块的配置与校准

以STM32系列单片机为例,其内置的12位ADC具有较高的分辨率,适合高精度湿度采集。配置步骤如下:

// ADC初始化配置示例
void ADC_Init(void) {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

    ADC_InitTypeDef ADC_InitStruct;
    ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStruct.ADC_ScanConvMode = DISABLE;
    ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStruct.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStruct);

    ADC_Cmd(ADC1, ENABLE);
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
}

代码逻辑分析:

  • RCC_APB2PeriphClockCmd :使能ADC1的时钟;
  • ADC_InitStruct :设置ADC为独立模式、连续转换模式;
  • ADC_Cmd :启用ADC;
  • ADC_ResetCalibration / ADC_StartCalibration :进行ADC校准,确保采样精度。

4.2.2 数据采集精度与采样率优化

ADC的精度与采样率需根据系统需求进行权衡:

  • 采样精度 :12位ADC的分辨率为3.3V / 4096 ≈ 0.806mV/LSB;
  • 采样率优化 :可通过DMA方式实现高速采样,减少CPU负担;
  • 多通道采集 :若同时采集温度与湿度信号,需配置多通道模式;
  • 参考电压稳定 :建议使用高精度外部参考电压源(如REF3033)。

优化建议:

  • 每次采集进行多次平均,提高稳定性;
  • 设置采样保持时间,保证信号稳定;
  • 使用硬件滤波或软件滤波结合提高信噪比。

4.3 湿度数据的预处理与滤波算法

采集到的湿度数据通常包含噪声与异常值,需进行预处理以提高数据可信度。

4.3.1 滑动平均滤波法

滑动平均滤波法通过维护一个固定长度的队列,每次采集新数据后移除最早数据并计算平均值,适用于周期性干扰较小的场景。

#define FILTER_SIZE 10
int humidity_buffer[FILTER_SIZE];
int filter_index = 0;

int sliding_average(int new_value) {
    humidity_buffer[filter_index] = new_value;
    filter_index = (filter_index + 1) % FILTER_SIZE;

    int sum = 0;
    for (int i = 0; i < FILTER_SIZE; i++) {
        sum += humidity_buffer[i];
    }

    return sum / FILTER_SIZE;
}

逻辑分析:

  • humidity_buffer :保存最近的10个湿度采样值;
  • 每次更新后计算平均值作为最终输出;
  • 可有效平滑短期波动,但对突变响应较慢。

4.3.2 异常值剔除与补偿机制

为应对突发干扰或传感器故障,可引入异常值剔除机制:

graph TD
    A[获取新湿度值] --> B{是否在合理范围?}
    B -->|是| C[加入滤波队列]
    B -->|否| D[丢弃异常值]
    C --> E[计算滑动平均]
    D --> F[使用上一次有效值替代]

实现要点:

  • 设置合理范围(如20%RH ~ 90%RH);
  • 若超出范围则使用上一有效值替代;
  • 可结合滑动窗口机制实现更智能的异常处理。

4.4 湿度数据与转速控制的映射关系

将湿度数据转化为风扇转速控制信号,是实现智能调节的核心逻辑。

4.4.1 湿度-转速控制曲线设计

通常采用线性或非线性映射方式建立湿度与转速之间的关系。以线性映射为例:

def humidity_to_speed(humidity):
    min_hum = 30
    max_hum = 80
    min_speed = 20  # 占空比%
    max_speed = 100 # 占空比%

    if humidity < min_hum:
        return min_speed
    elif humidity > max_hum:
        return max_speed
    else:
        return ((humidity - min_hum) / (max_hum - min_hum)) * (max_speed - min_speed) + min_speed

逻辑说明:

  • 湿度低于30%时,风扇维持最低转速;
  • 湿度高于80%时,风扇全速运行;
  • 中间区域线性增长,实现平滑过渡。

4.4.2 多级阈值判断与分级调速

为简化控制逻辑并减少频繁调节,可设定多个阈值进行分级控制:

湿度范围 风扇转速(占空比)
< 40% 20%
40% ~ 50% 40%
50% ~ 65% 60%
65% ~ 75% 80%
> 75% 100%
uint8_t get_fan_speed(uint8_t humidity) {
    if (humidity < 40) return 20;
    else if (humidity < 50) return 40;
    else if (humidity < 65) return 60;
    else if (humidity < 75) return 80;
    else return 100;
}

优势分析:

  • 减少PWM调节频率,延长风扇寿命;
  • 降低系统负载,提高响应效率;
  • 易于调试与参数调整。

总结:

本章从湿度传感器的选型入手,介绍了模拟与数字传感器的特性与适用场景,随后详细阐述了ADC模块的配置与优化方法,并通过滑动平均滤波和异常值剔除机制提升数据质量。最后,通过建立湿度与转速之间的映射关系,实现了从感知到控制的闭环系统。这些内容为后续章节中PID控制算法的引入与系统整合奠定了坚实基础。

5. PID控制算法在电扇调速中的应用

在现代智能控制系统中,PID(Proportional-Integral-Derivative)控制算法因其结构简单、鲁棒性强、调节效果好,广泛应用于工业控制领域。在电扇的调速系统中,尤其在需要根据环境参数(如温度、湿度)动态调整转速的场景下,PID控制算法可以实现对转速的高精度闭环控制,提升系统的响应速度和稳定性。本章将深入探讨PID控制算法的原理、在电扇调速系统中的实现步骤、参数整定方法以及如何在节能与舒适性之间取得平衡。

5.1 PID控制原理与参数意义

5.1.1 比例、积分、微分三部分作用分析

PID控制由三部分组成:比例(P)、积分(I)、微分(D),每一部分在系统控制中起着不同的作用,协同工作以实现最优控制性能。

  • 比例(P) :根据当前误差(设定值与反馈值的差值)进行控制,误差越大,输出越大。比例控制能快速响应误差变化,但容易产生稳态误差。
  • 积分(I) :根据误差的累积值进行控制,用于消除稳态误差,提高系统的精度。但积分作用过强可能导致系统超调甚至震荡。
  • 微分(D) :根据误差变化率进行控制,具有预测作用,可抑制系统的超调,提高响应的稳定性。

下表总结了PID三部分的作用特点:

控制部分 作用特点 优点 缺点
P 快速响应误差 响应快 有稳态误差
I 消除稳态误差 提高精度 易震荡
D 抑制超调 提高稳定性 对噪声敏感

5.1.2 PID控制在闭环系统中的优势

PID控制广泛应用于闭环控制系统中,其核心优势在于:

  • 自动调节 :通过不断检测输出与设定值之间的误差,自动调整控制输出,实现精准控制。
  • 适应性强 :PID控制适用于多种系统,尤其在动态特性变化不大的系统中表现优异。
  • 结构简单 :算法易于理解和实现,适合嵌入式系统中应用。
  • 实时性强 :计算量小,适合实时控制场景,如电扇的转速控制。

下图展示了PID控制在闭环系统中的基本结构:

graph TD
    A[设定值] --> B[比较器]
    B --> C[PID控制器]
    C --> D[执行器]
    D --> E[被控对象]
    E --> F[传感器]
    F --> G[反馈值]
    G --> B

5.2 PID算法在电扇系统中的实现步骤

5.2.1 设定目标值与反馈值的获取

在电扇调速系统中,设定值可以是用户指定的目标转速或根据环境湿度、温度等传感器数据动态计算的期望转速。反馈值则来自编码器、霍尔传感器或电流检测电路等转速检测装置。

例如,假设我们使用一个霍尔传感器检测风扇的转速,每转一圈输出一个脉冲信号。通过测量单位时间内脉冲数,可以换算为当前转速(RPM)。这部分代码如下:

// 读取霍尔传感器脉冲数并计算转速
int readFanSpeed() {
    int pulses = 0;
    unsigned long startTime = millis();
    while (millis() - startTime < 1000) { // 1秒采样周期
        if (digitalRead(HALL_SENSOR_PIN) == HIGH) {
            pulses++;
        }
    }
    int rpm = pulses * 60 / 2; // 假设每转输出2个脉冲
    return rpm;
}

逻辑分析与参数说明:

  • HALL_SENSOR_PIN 是霍尔传感器连接的GPIO引脚。
  • millis() 用于获取系统运行时间,实现1秒采样周期。
  • pulses * 60 / 2 :将每秒脉冲数转换为每分钟转数(RPM),假设每转输出2个脉冲。

5.2.2 控制输出的计算与调整

在获取当前转速后,通过PID算法计算出控制输出,用于调节风扇的驱动信号(如PWM波形的占空比)。

以下是一个简单的PID控制器实现示例:

typedef struct {
    float Kp;
    float Ki;
    float Kd;
    float prev_error;
    float integral;
} PIDController;

void PID_Init(PIDController *pid, float Kp, float Ki, float Kd) {
    pid->Kp = Kp;
    pid->Ki = Ki;
    pid->Kd = Kd;
    pid->prev_error = 0;
    pid->integral = 0;
}

float PID_Compute(PIDController *pid, float setpoint, float feedback, float dt) {
    float error = setpoint - feedback;
    pid->integral += error * dt;
    float derivative = (error - pid->prev_error) / dt;

    float output = pid->Kp * error + pid->Ki * pid->integral + pid->Kd * derivative;

    pid->prev_error = error;
    return output;
}

逻辑分析与参数说明:

  • Kp , Ki , Kd :PID控制的三个参数,需根据系统响应进行整定。
  • error :设定值与反馈值的差值。
  • integral :误差的积分项,用于消除稳态误差。
  • derivative :误差的变化率,用于预测误差趋势。
  • dt :采样周期时间,单位为秒。

在电扇系统中,将 output 作为PWM占空比的调节依据,控制风扇的转速:

// 控制风扇转速
void controlFanSpeed(float setpoint, float currentSpeed) {
    static PIDController pid;
    static int initialized = 0;
    if (!initialized) {
        PID_Init(&pid, 2.0, 0.5, 1.0); // 初始PID参数
        initialized = 1;
    }

    float dt = 0.1; // 采样周期为0.1秒
    float controlSignal = PID_Compute(&pid, setpoint, currentSpeed, dt);

    // 限制控制信号范围
    if (controlSignal > 100) controlSignal = 100;
    if (controlSignal < 0) controlSignal = 0;

    analogWrite(FAN_PWM_PIN, (int)controlSignal);
}

5.3 PID参数整定与系统响应优化

5.3.1 Ziegler-Nichols整定法

Ziegler-Nichols整定法是一种经典的PID参数整定方法,适用于一阶或二阶线性系统。其基本步骤如下:

  1. 关闭积分与微分作用 (设置Ki=0,Kd=0)。
  2. 逐步增加比例增益Kp ,直到系统开始出现等幅振荡。
  3. 记录临界增益Ku与振荡周期Tu
  4. 根据Ku和Tu设置PID参数 ,如下表所示:
控制类型 Kp Ki Kd
P 0.5Ku 0 0
PI 0.45Ku 1.2Ku/Tu 0
PID 0.6Ku 2Ku/Tu Ku*Tu/8

5.3.2 实际调试中的参数调整技巧

在实际调试过程中,Ziegler-Nichols法提供的参数往往只是一个起点,还需根据系统响应进行微调:

  • 观察响应曲线 :使用示波器或调试工具观察系统的响应曲线,判断是否存在超调、震荡或响应过慢。
  • 逐步调整参数
  • 若系统响应慢,可适当增加Kp;
  • 若存在稳态误差,可增加Ki;
  • 若系统震荡剧烈,可增加Kd或减少Kp。
  • 使用自动调参工具 :现代开发平台(如Arduino PID库、MATLAB Simulink)提供自动调参功能,可辅助优化参数。

以下是一个使用Arduino PID库进行参数自动整定的示例流程:

#include <PID_v1.h>

double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint, 2, 5, 1, DIRECT);

void setup() {
  Setpoint = 1200; // 设定转速为1200 RPM
  myPID.SetMode(AUTOMATIC);
}

void loop() {
  Input = readFanSpeed(); // 获取当前转速
  myPID.Compute();        // PID计算
  analogWrite(FAN_PWM_PIN, Output); // 控制风扇
}

逻辑分析与参数说明:

  • 使用Arduino PID库简化了PID控制的实现。
  • Setpoint 是目标转速。
  • Input 是当前检测到的转速。
  • Output 是控制信号,用于调节PWM占空比。
  • myPID.Compute() 自动进行PID计算。

5.4 PID控制与节能、舒适性平衡

5.4.1 高效节能模式下的PID调优

在节能模式下,PID控制需要兼顾电扇的功耗与用户舒适度。可以通过以下方式优化:

  • 动态调整PID参数 :在低转速时降低Kp、Ki,减小系统响应幅度,降低能耗。
  • 引入死区控制 :当误差在一定范围内时,不进行控制输出调整,避免频繁调节造成的能量浪费。
  • 结合PWM频率优化 :选择合适的PWM频率,减少开关损耗。

例如,在节能模式下调用不同的PID参数:

void setPIDForMode(char *mode) {
    if (strcmp(mode, "节能") == 0) {
        myPID.SetTunings(1.0, 0.2, 0.5); // 低增益参数
    } else if (strcmp(mode, "标准") == 0) {
        myPID.SetTunings(2.0, 0.5, 1.0); // 标准参数
    }
}

5.4.2 用户舒适度与系统响应的协调

用户舒适度主要体现在风扇转速变化的平滑性与响应速度之间。PID控制可以通过以下策略实现协调:

  • 软启动控制 :避免风扇从静止直接进入高速运转,采用逐步增加PWM的方式。
  • 引入前馈控制 :在PID控制基础上,加入环境变量(如温度、湿度)的前馈项,提升响应速度。
  • 模糊PID控制 :结合模糊控制理论,动态调整PID参数,使系统更符合人的感知。

例如,使用模糊逻辑调整PID参数:

float adjustKpBasedOnComfort(float humidity) {
    if (humidity < 40) {
        return 1.5; // 干燥环境,较低增益
    } else if (humidity >= 40 && humidity < 70) {
        return 2.0; // 正常环境,标准增益
    } else {
        return 2.5; // 潮湿环境,较高增益
    }
}

通过将湿度感知与PID控制结合,可以实现更人性化的风扇调速控制,提升用户体验。

6. 智能电扇控制系统的整体实现

本章将围绕智能电扇控制系统的整体实现展开,从硬件设计、软件开发、系统测试到安全机制四个方面,系统化地介绍整个控制系统的集成与运行流程。

6.1 系统硬件设计与电路整合

智能电扇控制系统由主控单元(单片机)、传感器模块(湿度传感器、温度传感器)、驱动模块(可控硅驱动电路)、电源管理模块等组成。

6.1.1 主控单元与驱动电路的连接

主控单元通常采用如STM32、ATmega328P等中低端单片机,其GPIO引脚用于输出控制信号至可控硅驱动电路。以下为典型的连接示意图:

graph TD
    A[单片机] -->|PWM信号| B(可控硅驱动电路)
    B --> C[可控硅]
    C --> D[风扇电机]
  • 单片机通过定时器输出PWM信号控制可控硅导通角。
  • 驱动电路中加入光耦隔离,防止高压干扰单片机系统。

6.1.2 传感器与电源模块的布局

  • 湿度传感器(如DHT22、SHT30)通过ADC模块或I2C接口接入单片机。
  • 电源模块采用稳压芯片(如AMS1117)将外部电源(如5V USB)转换为3.3V供单片机和传感器使用。

6.2 软件系统开发与功能集成

软件系统是整个智能电扇控制系统的核心,负责协调硬件资源,实现传感器数据采集、PID控制、调速逻辑与用户交互等功能。

6.2.1 主程序结构与中断服务设计

主程序采用前后台结构,主循环中处理状态判断与控制逻辑,中断服务程序负责定时采集与PWM波形生成。

int main(void) {
    init_system();      // 初始化系统时钟、IO、ADC、PWM等
    while (1) {
        read_sensors(); // 读取湿度、温度数据
        control_logic(); // 执行PID控制逻辑
        update_display(); // 更新LCD或LED状态
    }
}

// 定时器中断服务程序
void TIM2_IRQHandler(void) {
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
        generate_pwm(); // 生成PWM控制信号
    }
}
  • init_system() :初始化单片机外设。
  • read_sensors() :通过ADC或I2C读取传感器数据。
  • control_logic() :执行PID算法计算控制输出。
  • 中断服务程序用于精确控制PWM频率,提高调速精度。

6.2.2 多任务调度与状态机管理

采用状态机机制管理电扇的运行状态,如“自动模式”、“手动模式”、“待机模式”等。

typedef enum {
    MODE_AUTO,
    MODE_MANUAL,
    MODE_SLEEP
} fan_mode_t;

fan_mode_t current_mode = MODE_AUTO;

void state_machine() {
    switch(current_mode) {
        case MODE_AUTO:
            auto_control(); // 根据湿度自动调速
            break;
        case MODE_MANUAL:
            manual_control(); // 用户设定固定转速
            break;
        case MODE_SLEEP:
            sleep_mode(); // 低速运行
            break;
    }
}
  • 状态切换通过按键或远程信号触发。
  • 不同模式下执行不同的控制策略,提升用户体验。

6.3 系统测试与性能评估

6.3.1 功能测试用例设计

测试项 测试内容 预期结果
湿度采集 输入不同湿度环境 显示值与实际值误差 < 5%
PWM调速 设置不同占空比 风扇转速线性变化
PID控制 改变设定湿度 转速自动调节至设定值
模式切换 切换自动/手动/睡眠模式 模式切换流畅,功能正常

6.3.2 调速响应与稳定性指标分析

  • 响应时间 :从设定值变化到风扇转速稳定所需时间,理想值应小于2秒。
  • 超调量 :PID控制过程中最大转速超过设定值的比例,应控制在10%以内。
  • 稳定性 :长时间运行下,风扇转速波动应小于±5%。

6.4 安全防护与故障处理机制

6.4.1 短路保护与过热断电策略

  • 短路保护 :在驱动电路中加入保险丝或PTC热敏电阻,防止负载短路导致损坏。
  • 过热保护 :通过温度传感器监测可控硅与电机温度,当超过设定阈值时自动切断电源。
void check_temperature() {
    uint16_t temp = read_adc(TEMP_SENSOR_CHANNEL);
    if (temp > TEMP_THRESHOLD) {
        fan_stop(); // 停止风扇
        trigger_alarm(); // 触发报警
    }
}

6.4.2 故障报警与系统自检流程

  • 系统启动自检 :每次上电时检测传感器连接、ADC校准、PWM输出是否正常。
  • 故障报警 :通过LED闪烁或蜂鸣器发出报警信号,提示用户检查系统状态。
graph LR
    A[系统启动] --> B[自检流程]
    B --> C{传感器是否正常?}
    C -- 是 --> D[进入正常运行]
    C -- 否 --> E[触发报警]
    D --> F{是否发生故障?}
    F -- 是 --> G[执行保护动作]
    F -- 否 --> H[继续运行]

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本文介绍了一个基于可控硅、单片机和电扇的智能控制系统。可控硅用于调节电机电压实现调速,单片机负责接收用户指令并控制可控硅导通角。系统通过脉宽调制(PWM)技术实现高效调速,并可集成湿度传感器,实现根据环境湿度自动调节风速的功能。文章涵盖硬件连接、程序设计、PID控制算法及安全保护措施,适用于智能家电和自动化控制领域的学习与实践。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

Logo

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

更多推荐