基于STM32F103C8T6的温控散热器实践,软硬件开源!!!

这篇具有很好参考价值的文章主要介绍了基于STM32F103C8T6的温控散热器实践,软硬件开源!!!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

大家好!今天我要给大家分享一款基于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单排弯针

原理图

stm32 温控,# STM32,# 嵌入式硬件,嵌入式项目实践,stm32,单片机,嵌入式硬件

五、元器件清单

数量 说明 主要类别 次要类别
2 22pF 22pF 电容 贴片电容(MLCC)
8 100nF 100nF 电容 贴片电容(MLCC)
2 22uF 22uF 电容 贴片型铝电解电容
1 2.2uF 2.2uF 电容 贴片电容(MLCC)
1 10nF 10nF 电容 贴片电容(MLCC)
1 HX25003-2WAP / 连接器 线对板/线对线连接器
1 A1251WR-2P / 连接器 线对板/线对线连接器
1 PZ254V-11-04P / 连接器 排针
1 NCD0805R1 / 光耦/LED/数码管/光电器件 发光二极管/LED
1 1MΩ 1MΩ 电阻 贴片电阻
2 10kΩ 10kΩ 电阻 贴片电阻
1 510Ω 510Ω 电阻 贴片电阻
1 TS-1101-C-W / 按键/开关 轻触开关
1 STM32F103C8T6 / 单片机/微控制器 单片机(MCU/MPU/SOC)
1 DS18B20U / 传感器 温度传感器
1 AMS1117-3.3 / 电源芯片 线性稳压器(LDO)
1 DRV8833PWP / 电源芯片 电机驱动芯片
1 U262-161N-4BVC11 连接器 USB连接器
1 8MHz 8MHz 晶振/振荡器/谐振器 无源晶振
1 AFC10-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正面

stm32 温控,# STM32,# 嵌入式硬件,嵌入式项目实践,stm32,单片机,嵌入式硬件

PCB反面

stm32 温控,# STM32,# 嵌入式硬件,嵌入式项目实践,stm32,单片机,嵌入式硬件

连接实物

stm32 温控,# STM32,# 嵌入式硬件,嵌入式项目实践,stm32,单片机,嵌入式硬件

总结

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

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

程序、原理图及PCB资料包链接文章来源地址https://www.toymoban.com/news/detail-744810.html

到了这里,关于基于STM32F103C8T6的温控散热器实践,软硬件开源!!!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于stm32f103c8t6的fft频率计

    之前项目中需要用到正弦信号的频率测量,也参考了几个大佬的博客(链接如下),但可能是由于stm32的型号不匹配,虽然也在网上查了一些需要修改的地方,但结果一直不太对,后来经过自己摸索结果终于对了,在这里给大家分享下,具体原理不在赘述。 参考的部分大佬博

    2024年02月14日
    浏览(16)
  • 基于STM32F103C8T6的HC-06蓝牙通信

    如果朋友们 遇到了如下问题 ,可以仔细借鉴本文章和另一篇专门讲解 蓝牙通信问题 的文章,一定能够解决你在蓝牙通信时遇到的诸多困难 1.在调试蓝牙模块AT指令时无返回值 2.身边 无USB转TTL模块 可以直接调试蓝牙模块(本人就是由于无模块花了了整整一天才调试成功)

    2024年02月03日
    浏览(29)
  • 基于STM32F103C8T6ADC检测交流电压

    上篇文章写了硬件部分的实现思路,通过采样电阻的到小电压后经过二级放大电路得到单片机可处理的交流电压,此文介绍了如何采用单片机采集交流电压以及stm32ADC外设的使用。首先是硬件电路部分。  电路没有采用核心板,而是直接将芯片焊接到主板上,采用type-c接口供

    2024年02月12日
    浏览(21)
  • STM32f103c8t6模板的搭建-基于正点例程

           笔者认为正点编写的官方例程结构较为整洁,可以便于后期的例程开发,如果开发者对于项目开发中芯片要求较高的话,有很多人会选择正点的开发板,但是通常大多数是stm32初学者会选择用价格更为便宜的c8t6来进行学习,而正点选用的教程开发板大多都是些RC、ZE、

    2024年02月06日
    浏览(33)
  • 基于stm32f103c8t6的定时器详解(持续更新)

    先声明:stm32f103c8t6中没有基本定时器、只有TIM1-TIM4:分别是高级定时器和通用定时器(对照下图请自行阅读stm32f103x的datasheet) 1、定时器功能:定时、输出比较、输入捕获、互补输出,其中基本定时器只有定时功能、通用定时器只没有互补输出功能、高级定时器具有所有功能

    2023年04月24日
    浏览(21)
  • HX711压力传感器(基于STM32F103C8T6)

    HX711模块是我们目前比较常见的压力传感器模块,主要的作用是用来做压力检测,重量监测等等。博主的这篇博文主要实现功能为,在对重量或者压力进行监测的同时,可以累加或者清零数值,在此基础上就可以对比如饮水量进行统计等等。 HX711模块是市面上比较常见的模块

    2024年02月11日
    浏览(20)
  • [STM32F103C8T6]基于stm32的循迹,跟随,避障智能小车

    目录 1.小车驱动主要是通过L9110S模块来驱动电机 motor.c 2.我们可以加入串口控制电机驱动(重写串口接收回调函数,和重定向printf) Uart.c main.c  3.点动功能 uart.c main.c 为什么使用的是HAL_Delay()要设置滴答定时器的中断优先级呢? 4.小车PWM调速,  6.跟随功能 7.避障功能 超声波测距

    2024年02月13日
    浏览(28)
  • 基于STM32F103C8T6的UAV飞控板硬件设计

    一、主控单元:         主控单元基于意法半导体公司的STM32F103C8T6单片机进行设计。STM32F103C8T6DE 内核为ARM Cortex-M3;最大主频:72MHz ;工作电压范围:2V~3.6V ;程序存储容量:64KB; 程序存储器类型:FLASH ;RAM总容量:20KB; GPIO端口数量:37 ;封装为LQFP-48;串行单线调试(

    2024年02月08日
    浏览(21)
  • 基于stm32f103c8t6及AS608-----指纹锁项目

              博主纯小白, 本文适合于初学者,大佬还请勿喷,欢迎提出意见,有纰漏之处将及时纠正。 在浅学了stmf103c8t6后,想着依据现在所拥有的知识和能力做一个小项目。 注:工程代码在文章末尾。 掌握C语言基础....这个最基础啦... 接触过类似单片机,稍微看得懂芯片

    2023年04月09日
    浏览(32)
  • 舵机控制(STM32F103C8T6)

            本文是以 STM32F103C8T6 作为主控芯片,通过PB6端口输出PWM,实现控制180°舵机。 (一)概述         舵机是一种位置伺服驱动器器,是一种带有输出轴的小装置。当我们向伺服器发送一个控制信号时,输出轴就可以转到特定的位置。只在控制信号持续不变,伺服机构就

    2023年04月09日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包