单片机模拟风扇控制系统的实现与源码详解
单片机:实现模拟风扇控制系统
1. 项目背景与目标
风扇控制系统广泛应用于温控、通风等场景。在现代嵌入式系统中,我们可以利用单片机来实现一个智能的风扇控制系统。系统通过采集环境温度或湿度数据,根据不同的条件调节风扇的转速或开启/关闭状态。常见的实现方式是通过PWM(脉冲宽度调制)信号控制风扇的电机转速,达到调节风速的效果。
在本项目中,我们将实现一个基于STM32单片机的模拟风扇控制系统,主要包括:
2. 硬件设计
2.1 硬件组件
2.2 硬件连接
3. PWM控制原理
PWM(脉冲宽度调制)信号是一种控制信号,其占空比(即高电平的时间比率)决定了其输出的平均电压。通过调节PWM信号的占空比,可以有效控制风扇电机的转速。占空比越大,电机转速越高;占空比越小,电机转速越低。
4. 软件设计
4.1 设计思路
- 配置ADC读取温度传感器的数据。
- 根据读取到的温度值,计算需要的风扇转速(通过PWM占空比调整)。
- 配置PWM输出控制风扇转速。
- 显示当前温度和风扇状态。
4.2 代码实现
以下代码示例基于STM32 HAL库实现了风扇控制系统,使用LM35温度传感器采集温度,并通过PWM控制风扇转速。
#include "stm32f4xx_hal.h"
#include <stdio.h>
#define ADC_CHANNEL ADC_CHANNEL_0 // 选择通道0(PA0)
#define PWM_FREQUENCY 1000 // PWM频率,1kHz
#define MAX_FAN_SPEED 100 // 最大风扇转速
// ADC句柄
ADC_HandleTypeDef hadc1;
// PWM句柄
TIM_HandleTypeDef htim1;
TIM_OC_InitTypeDef sConfigOC;
// 初始化ADC
void ADC_Init(void) {
__HAL_RCC_ADC1_CLK_ENABLE(); // 启用ADC1的时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 配置PA0为模拟输入模式
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置ADC参数
hadc1.Instance = ADC1;
hadc1.Init.Resolution = ADC_RESOLUTION_12B; // 12位分辨率
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; // 单通道模式
hadc1.Init.ContinuousConvMode = DISABLE; // 非连续转换模式
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1; // 外部触发模式
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据对齐方式:右对齐
hadc1.Init.NbrOfConversion = 1; // 进行单次转换
hadc1.Init.DMAContinuousRequests = DISABLE; // 不使用DMA
HAL_ADC_Init(&hadc1);
ADC_ChannelConfig();
}
// 配置ADC通道
void ADC_ChannelConfig(void) {
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL; // 设置通道
sConfig.Rank = ADC_REGULAR_RANK_1; // 第1通道
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; // 设置采样时间
sConfig.Offset = 0;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
// 获取ADC值
uint32_t ADC_Read(void) {
HAL_ADC_Start(&hadc1); // 启动ADC转换
if (HAL_ADC_PollForConversion(&hadc1, 1000) == HAL_OK) {
return HAL_ADC_GetValue(&hadc1); // 获取ADC值
}
return 0; // 如果转换失败,返回0
}
// 初始化PWM
void PWM_Init(void) {
__HAL_RCC_TIM1_CLK_ENABLE(); // 启用TIM1时钟
// 配置PWM引脚(假设使用PA8)
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟
GPIO_InitStruct.Pin = GPIO_PIN_8; // 配置PA8为PWM输出
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置TIM1为PWM模式
htim1.Instance = TIM1;
htim1.Init.Prescaler = 84 - 1; // 设置预分频器,PWM频率为1kHz
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 1000 - 1; // 设置PWM周期
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_PWM_Init(&htim1);
// 配置PWM输出通道
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0; // 初始占空比为0%
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
// 启动PWM输出
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
}
// 设置PWM占空比
void Set_Fan_Speed(uint32_t speed) {
if (speed > 100) {
speed = 100; // 限制最大占空比为100%
}
// 设置PWM占空比
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, speed * 10); // 0-1000的占空比范围
}
// 主函数
int main(void) {
HAL_Init(); // 初始化HAL库
ADC_Init(); // 初始化ADC
PWM_Init(); // 初始化PWM
// 主循环
while (1) {
uint32_t adc_value = ADC_Read(); // 获取温度传感器值
// 计算温度(假设ADC为12位,0-3.3V对应0-4095的ADC值)
float voltage = (float)adc_value * 3.3f / 4095.0f;
float temperature = voltage * 100.0f; // LM35温度传感器,1V=10°C
// 根据温度调整风扇速度
uint32_t fan_speed = 0;
if (temperature < 25.0f) {
fan_speed = 0; // 温度低于25°C,关闭风扇
} else if (temperature < 30.0f) {
fan_speed = 30; // 温度在25°C到30°C之间,设置30%的风速
} else if (temperature < 35.0f) {
fan_speed = 60; // 温度在30°C到35°C之间,设置60%的风速
} else {
fan_speed = 100; // 温度大于35°C,设置100%的风速
}
Set_Fan_Speed(fan_speed); // 设置风扇转速
HAL_Delay(1000); // 每秒读取一次温度
}
}
5. 代码解释
-
ADC初始化与读取:
ADC_Init()
初始化了ADC模块,配置了温度传感器(LM35)所连接的引脚为模拟输入模式。ADC_Read()
函数启动ADC转换并获取转换结果。-
PWM初始化与设置:
PWM_Init()
函数配置了TIM1定时器为PWM模式,并设置PWM频率为1kHz,输出通道为PA8。Set_Fan_Speed()
函数根据给定的占空比来调整风扇的转速。PWM的占空比是根据温度变化动态调整的。-
温度控制与风扇调节:
main()
函数中,读取温度传感器的值并计算温度值。- 根据温度范围,选择相应的风扇转速:
- 低于25°C:关闭风扇。
- 25°C到30°C:风扇以30%转速运行。
- 30°C到35°C:风扇以60%转速运行。
- 高于35°C:风扇以100%转速运行。
6. 优化与扩展
7. 总结
本项目通过STM32单片机实现了一个模拟风扇控制系统,基于温度传感器(LM35)读取环境温度,并使用PWM信号控制风扇的转速。系统根据温度自动调节风扇速度,以实现节能和温控功能。通过此项目,掌握了如何使用PWM控制直流电机转速以及如何结合传感器数据进行自动化控制。
作者:Katie。