前言

大家好!今天我要给大家分享一款基于STM32F103C8T6的温控散热器。在炎热的夏天,我们经常会遇到电子设备因高温而过热的问题。为了解决这一问题,我设计了这款温控散热器,它能根据环境温度智能控制风扇的开关,确保设备的稳定运行。让我们一起来看看它的构成和工作原理吧!🔬

一、实现功能

1️⃣ 根据环境温度控制5V 0.2A的直流电机。

当环境温度高于35℃时,风扇开启;当环境温度低于或等于35℃时,风扇关闭。

2️⃣电源管理:

  1. 通过Type-C接口和MX1.25针座接口进行充电。
  2. 使用XH2.54接口连接板子,为板子供电。

二、 工作原理

温控散热器的工作原理很简单。首先,我们使用GX18B20温度传感器来感知环境温度。传感器将环境温度转化为电压信号,并通过STM32F103C8T6主控芯片进行采样和处理。

接下来,主控芯片将采集到的温度值与设定的阈值进行比较。如果环境温度高于35℃,主控芯片将通过DRV8833电机驱动芯片控制风扇开启,以便散热。反之,当环境温度低于或等于35℃时,主控芯片会关闭风扇。

此外,为了确保电路的稳定工作,我们使用了AMS1117-3.3芯片将5V电源转换为3.3V供主控芯片使用。通过Type-C接口和MX1.25针座接口,我们可以方便地为电路板进行充电,而XH2.54接口则用于连接电路板和其他设备。

三、 适用场景

  1. 家用电子设备
  2. 办公室电子设备

四、 硬件设计

设计组成

1️⃣ PCB板子
2️⃣ 5V锂电池
3️⃣ 5V 0.2A直流风扇

构成主要芯片

1️⃣ 主控芯片:STM32F103C8T6
2️⃣ 电机驱动芯片:DRV8833
3️⃣ 温度传感器:GX18B20
4️⃣ 5V转3.3V稳压芯片:AMS1117-3.3

连接接口

1️⃣ 用户充电接口:Type-C
2️⃣ 充电连接口:MX1.25mm针座接口
3️⃣ 放电接口:XH2.54mm2P接口
4️⃣ 风扇接口:SH1.0mm4P母座
5️⃣ 下载程序接口:2.54mm单排弯针

原理图

在这里插入图片描述

五、元器件清单

数量说明主要类别次要类别
222pF22pF电容贴片电容(MLCC)
8100nF100nF电容贴片电容(MLCC)
222uF22uF电容贴片型铝电解电容
12.2uF2.2uF电容贴片电容(MLCC)
110nF10nF电容贴片电容(MLCC)
1HX25003-2WAP/连接器线对板/线对线连接器
1A1251WR-2P/连接器线对板/线对线连接器
1PZ254V-11-04P/连接器排针
1NCD0805R1/光耦/LED/数码管/光电器件发光二极管/LED
11MΩ1MΩ电阻贴片电阻
210kΩ10kΩ电阻贴片电阻
1510Ω510Ω电阻贴片电阻
1TS-1101-C-W/按键/开关轻触开关
1STM32F103C8T6/单片机/微控制器单片机(MCU/MPU/SOC)
1DS18B20U/传感器温度传感器
1AMS1117-3.3/电源芯片线性稳压器(LDO)
1DRV8833PWP/电源芯片电机驱动芯片
1U262-161N-4BVC11连接器USB连接器
18MHz8MHz晶振/振荡器/谐振器无源晶振
1AFC10-S04QCA-00连接器线对板/线对线连接器

六、 软件设计

main.c

#include "delay.h"
#include "sys.h"
#include "led.h"
#include "GX18B20.h"
#include "usart.h"	
//#include "DS18B20.h"


int main(void)
{
	float temperature = 0;
	delay_init();
	uart_init(9600);
	LED_Init();
	DS18B20_Init();
	IN1 = 0;
	IN2 = 0;
	MOTOR = 0;
	while(1)
	{	
    temperature = DS18B20_GetTemperature();			
	//在此处处理温度值,例如打印到串口或显示屏
#if 1
	  	IN1 = 1;
	 	IN2 = 0;
		if(temperature > 35.00)
		{
				BEEP =0;			//PC13
				MOTOR = 1;

		}
		else
		{
				BEEP =1;			//PC13
				MOTOR = 0;

		}
#else
		MOTOR = 1;
#endif

		printf("温度=%.2f\r\n",temperature);
		delay_ms(500);
		delay_ms(500);
	}
}

GX18B20.c

#include "GX18B20.h"
#include "delay.h"

// 初始化函数
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 配置引脚为推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIO_PORT, &GPIO_InitStructure);

    // 默认拉低总线
    GPIO_ResetBits(GPIO_PORT, GPIO_PIN);
}



// 发送复位脉冲
void OW_Reset(void)
{
    // 拉低总线至少480us
    GPIO_ResetBits(GPIO_PORT, GPIO_PIN);
    delay_us(500);

    // 释放总线
    GPIO_SetBits(GPIO_PORT, GPIO_PIN);
    delay_us(60);

    // 等待设备拉低总线
    while (GPIO_ReadInputDataBit(GPIO_PORT, GPIO_PIN) == Bit_RESET);
}

// 发送一个字节
void OW_WriteByte(uint8_t byte)
{
	uint8_t i;  	
    for (i = 0; i < 8; i++)
    {
        // 拉低总线至少1us
        GPIO_ResetBits(GPIO_PORT, GPIO_PIN);
        delay_us(2);

        // 发送数据位
        if (byte & 0x01)
        {
            GPIO_SetBits(GPIO_PORT, GPIO_PIN);
        }
        else
        {
            GPIO_ResetBits(GPIO_PORT, GPIO_PIN);
        }

        // 拉高总线,释放总线
        delay_us(60);
        GPIO_SetBits(GPIO_PORT, GPIO_PIN);
        delay_us(2);

        // 移位
        byte >>= 1;
    }
}

// 读取一个字节
uint8_t OW_ReadByte(void)
{
    uint8_t byte = 0;
		uint8_t i;
    for ( i = 0; i < 8; i++)
    {
        // 拉低总线至少1us
        GPIO_ResetBits(GPIO_PORT, GPIO_PIN);
        delay_us(2);

        // 拉高总线,释放总线
        GPIO_SetBits(GPIO_PORT, GPIO_PIN);
        delay_us(2);

        // 读取数据位
        if (GPIO_ReadInputDataBit(GPIO_PORT, GPIO_PIN))
        {
            byte |= (1 << i);
        }

        // 等待余下的时隙结束
        delay_us(60);
    }

    return byte;
}

// 初始化函数
void DS18B20_Init(void)
{
    // 配置GPIO
    GPIO_Configuration();
}

// 获取温度
float DS18B20_GetTemperature(void)
{
    uint8_t temp_LSB, temp_MSB;
    int16_t temp;

    // 发送复位脉冲
    OW_Reset();

    // 发送跳过ROM指令
    OW_WriteByte(0xCC);

    // 发送温度转换指令
    OW_WriteByte(0x44);

    // 等待转换完成
    while (!GPIO_ReadInputDataBit(GPIO_PORT, GPIO_PIN));

    // 发送复位脉冲
    OW_Reset();

    // 发送跳过ROM指令
    OW_WriteByte(0xCC);

    // 发送读取温度指令
    OW_WriteByte(0xBE);

    // 读取温度数据
    temp_LSB = OW_ReadByte();
    temp_MSB = OW_ReadByte();

    // 计算温度值
    temp = (temp_MSB << 8) | temp_LSB;

    return (float)temp / 16.0f;
}

GX18B20.h

#ifndef __GX18B20_H
#define __GX18B20_H 

#include "sys.h"
#include "stdlib.h"	
#include "stm32f10x.h"
#include "delay.h"

// 定义引脚号
#define GPIO_PORT GPIOA
#define GPIO_PIN GPIO_Pin_0

extern void DS18B20_Init(void);
extern float DS18B20_GetTemperature(void);

#endif

led.c

#include "led.h"

void LED_Init(void)
{
	//LED
	GPIO_InitTypeDef  GPIO_InitStructure;
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);	 //使能3端口时钟
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
	//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;	 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
 	GPIO_Init(GPIOC, &GPIO_InitStructure);	  //初始化GPIOC
 	GPIO_SetBits(GPIOC,GPIO_Pin_14);
	
	//蜂鸣器
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);	 //使能3端口时钟
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;	 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
 	GPIO_Init(GPIOC, &GPIO_InitStructure);	  //初始化GPIOC
 	GPIO_SetBits(GPIOC,GPIO_Pin_13);
	
	//电机驱动芯片使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能3端口时钟
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;	 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
 	GPIO_Init(GPIOA, &GPIO_InitStructure);	  //初始化GPIOC
 	GPIO_ResetBits(GPIOA,GPIO_Pin_1);
	
	//电机VCC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能3端口时钟
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;	 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
 	GPIO_Init(GPIOA, &GPIO_InitStructure);	  //初始化GPIOC
 	GPIO_SetBits(GPIOA,GPIO_Pin_2);
	
	//电机GND
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能3端口时钟
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;	 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
 	GPIO_Init(GPIOA, &GPIO_InitStructure);	  //初始化GPIOC
 	GPIO_SetBits(GPIOA,GPIO_Pin_3);
}

led.h

	#ifndef __LED_H
#define __LED_H

#include "sys.h"


#define BEEP PCout(13)	
#define LED2 PCout(14)		
#define MOTOR PAout(1)	 //使能
#define IN1 PAout(2)		 //VCC
#define IN2 PAout(3)		 GND
Void LED_Init (void)


# endif

七、 提示

1. 制作之前请确保对电路设计和焊接有一定的了解,并注意安全使用电源和元器件。
2. 尽量靠近主控芯片或数据采集器件放置GX18B20传感器,以减少线路长度和干扰。
3. 使用合适的电源滤波电容和去耦电容来保持电源的稳定性和噪声抑制。

八、实物图

PCB正面

PCB正面

PCB反面

PCB反面

连接实物

![连接实物](https://img-blog.csdnimg.cn/ecdb5807771842aa984ed7ff1f5d5fe8.jpeg

总结

通过基于STM32F103C8T6的温控散热器实践,我们可以有效解决电子设备因高温而引起的过热问题。它利用温度传感器感知环境温度,智能控制风扇的开关,为设备提供可靠的散热保护。

这款温控散热器的设计简洁实用,组成部件也容易获取。无论是在家庭电子设备中还是在办公场所,它都能为我们的设备提供稳定的温度环境,延长设备的使用寿命。

程序、原理图及PCB资料包链接

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐