STM32PWM控制智能风扇

2023-11-14

设计思路:

这个是一个STM32通过定时器产生PWM波控制小风扇的设计,首先STM32驱动ds18b20温度传感器采集环境温度,然后通过按键设置温度的阈值,不同的温度范围定时器产生的PWM波不同,相应的小风扇的转速也会不一样,温度越高,小风扇的转速越大。LCD1602显示屏显示当前温度,和设置的阈值,同时按键支持连按,也支持掉电数据保存。希望能够帮助到需要的朋友。需要参考的朋友可以在文章底部点击下载源码和原理图。

下面是main.c文件的代码

#include "stm32f10x.h"
#include "lcd.h"
#include <stdio.h>
#include "led.h"
#include "deputy.h"
#include "sys.h"
#include "delay.h"
#include "stmflash.h"
#include "ds18b20.h"
#include "LCD1602.h"

void KEY_Scan(void);
u8   KEY_scan(u8 mode);
void display_tem(void);
unsigned char Uart1_Buff[1024];   //串口1缓冲数组
unsigned char Uart1_Count=0;      //串口1累加变量
u8 right=0,Tim_ms=0,state=0,s0=0,sec1=0,sec2=0,memory_flag=0;
float result=0.0000;
float table = 0.70;
int pm25Value;
float High,Low;

u8 Tem_L[20]={0};
u8 Tem_H[20]={0};
u8 showBuffer[20] = {0};
uint8_t key1_flag=0,key2_flag=0,key3_flag=0;

int main(void)
{
	delay_init();	
	GPIO_init();
	LCD1602_Init();
	TIM2_Int_Init(350,7199);	//10Khz,计数到5000是500ms
	ds18b20_init_x();
	GPIO_ResetBits(GPIOB,GPIO_Pin_10);
	GPIO_SetBits(GPIOB,GPIO_Pin_11);
	LCD1602_ClearScreen();
//	Test_Write(0x08009100,(float)30.1);
//	Test_Write(0x08009104,(float)19.2);
	High=STMFLASH_ReadHalfWord(0x08009100)/16.;
	Low=STMFLASH_ReadHalfWord(0x08009104)/16.;		
	while(1)
	{	
		display_tem();
		if(memory_flag)
		{
			memory_flag=0;
			Test_Write(0x08009100,High*16.);//float类型扩大十倍,方便存储数据
			Test_Write(0x08009104,Low*16.);
		}
	}	
}

void display_tem(void)
{
	float tem;
	u16 z = 0;
	z	= ds18b20_read(); 	
	tem = z/16. ;
	LCD1602_Show_Str(0, 0, (unsigned char *)showBuffer);
	snprintf((char *)showBuffer, sizeof(showBuffer), "Cur_Tem:  %2.1f", tem);
	LCD1602_Write_Dat(0xDF);
	LCD1602_Write_Dat(0x43);
	 
	
	snprintf((char *)Tem_H, sizeof(Tem_H), "H:%2.1f   L:%2.1f", High,Low);
	LCD1602_Show_Str(0, 1, (unsigned char *)Tem_H);	
	LCD1602_Write_Dat(0xDF);
	LCD1602_Write_Dat(0x43);
	if(tem>High)
	{
		TIM3_PWM_Config(9999);
	}else if(tem>=Low&&tem<High)
	{
		TIM3_PWM_Config(4000);
	}
	else if(tem<Low)
	{
		TIM3_PWM_Config(2600);
	}	
}

void KEY_Scan(void)
{
	if(KEY1==0)
	{			
		state=(state+1)%3;
					
	}while(!KEY1);	
	if(KEY2==0)
	{
		if(key2_flag==1)
		{
			key2_flag=0;
			if(state==1)
			{
				if((High>0)&&(High>=Low)) 
					High+=0.1;
				else
					High=Low+0.1;
			}else if(state==2)
			{
				if((Low>0)&&(Low<=High))
				Low+=0.1;
				else 
					Low=High-0.1;
			}
		}
		if(sec1==0)
		{
			if(state==1)
			{
				 if((High>0)&&(High>=Low)) 
					High+=0.1;
				 else
					High=Low+0.1;
			}else if(state==2)
			{
				if((Low>0)&&(Low<=High))
				Low+=0.1;
				else 
					Low=High-0.1;
			}
		}
	}
	else
	{
		sec1=7;
		if(key2_flag==0)
		{
			key2_flag=1;
			memory_flag=1;			
		}			
	}
	if(KEY3==0)
	{
		if(key3_flag==1)
		{
			key3_flag=0;
			if(state==1)
			{
				if((High>0)&&(High>=Low)) 
					High-=0.1;
				else
					High=Low+0.1;
			}else if(state==2)
			{
				if((Low>0)&&(Low<=High))
				Low-=0.1;
				else 
					Low=High-0.1;
			}		
		}
		if(sec2==0)
		{
			if(state==1)
			{
				if((High>0)&&(High>=Low)) 
					High-=0.1;
				else
					High=Low+0.1;
			}else if(state==2)
			{
				if((Low>0)&&(Low<=High))
				Low-=0.1;
				else 
					Low=High-0.1;
			}
		}
	}
	else
	{
		sec2=7;
		if(key3_flag==0)
		{
			key3_flag=1;
			memory_flag=1;			
		}				
	}
}

void TIM2_IRQHandler(void)   //TIM2中断
{
	if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //检查TIM2更新中断发生与否
	{
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  //清除TIM2更新中断标志	
		Tim_ms++;
		if(Tim_ms%6==0)
		{
			if(s0==1) 
				s0=0;
			else 
				s0=1;
		}
		KEY_Scan();
		if(state==1&&s0)
		{
			snprintf((char *)Tem_H, sizeof(Tem_H), "H:      L:%2.1f", Low);
			LCD1602_Show_Str(0, 1, (unsigned char *)Tem_H);	
			LCD1602_Write_Dat(0xDF);
			LCD1602_Write_Dat(0x43);
		}else if(state==2&&s0)
		{
			snprintf((char *)Tem_H, sizeof(Tem_H), "H:%2.1f  L:    ",High);
			LCD1602_Show_Str(0, 1, (unsigned char *)Tem_H);	
			LCD1602_Write_Dat(0xDF);
			LCD1602_Write_Dat(0x43);
		}else
		{
			snprintf((char *)Tem_H, sizeof(Tem_H), "H:%2.1f  L:%2.1f", High,Low);
			LCD1602_Show_Str(0, 1, (unsigned char *)Tem_H);	
			LCD1602_Write_Dat(0xDF);
			LCD1602_Write_Dat(0x43);			
		}
		
	}
	if(sec1!=0) sec1--;
	if(sec2!=0) sec2--;
}

需要原理图和全部源码的朋友可以通过下面的链接下载:
源码和原理图

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32PWM控制智能风扇 的相关文章

  • Log4cpp:为中小型C++项目加上log支持

    对于一个上点规模的C 项目而言 Log的作用是毋庸置疑的 出问题的时候 看了Log 常见的问题处理起来自是方便不过 即使遇到麻烦的问题 也可以从 总发现不少蛛丝马迹 因此一个严肃的项目应该从一开始就好好考虑如何打Log 便于分析 维护 现实
  • Selenium3自动化测试【6】浏览器driver的安装(FireFox)

    Selenium支持各种浏览器 读者可以在不同的浏览器中开展自动化测试 它支持的浏览器包括IE FireFox Chrome Opera Safari等 本讲就围绕常用的FireFox Chrome与Selenium的结合进行讲解 由于Se

随机推荐

  • 遥测终端机RTU助力城市内涝监测系统

    一 背景概述 2023年第5号台风 杜苏芮 周末登陆福建晋江 一波未平一波又起 卡努台风也进入了48小时警戒线 台风侵袭给城市基础设施和居民生活带来了严重的影响 后面第11号台风 海葵 号随之带来了更多城市内涝问题 且难以一下子解决 为了有
  • iOS 开发之CocoaPods常用第三方框架导入

    1 使用终端打开文件 假设项目放在桌面上 cd Desktop cd 项目名称 2 创建Podfile文件 命令如下 vim Podfile 3 输入 i 进入编辑模式并copy下面的这段代码 platform ios 8 0 target
  • C语言比较两个字符串是否相等的案例讲解

    思路分析 比较两个字符串是否相等要看两个字符串的长度和内容是否一样 如果长度和内容有一个不一样那么这两个字符串不相等 方法1 strcmp函数可以比较2个字符串的大小和内容是否一样 我们可以使用这个函数来进行判断 知识补充 strcmp函数
  • Node.js——回调函数及事件处理机制

    目录 回调函数 定义 理解 事件处理机制 补充 回调函数 定义 什么是回调函数呢 通俗的讲 将一个函数A作为参数传递给函数B 在函数B内对函数A进行调用 函数A就是回调函数 Node js 异步编程的直接体现就是回调 回调函数在完成任务后就
  • VM虚拟机安装Ubantu18.04【踩坑无数】【指路合集】

    写在前面 因为自己最近正在学习 作为一个小白 也遇到了很多问题 这里一起记录一下给大家遇到相同问题的指指路 其实内容多难倒也没有 跟着教程走也不会有什么难度 只希望能减少遇到同样问题的人search有效信息的来解决自己问题的时间 安装教程指
  • git warning: LF will be replaced by CRLF in package.json解决办法

    在修改了package json文件之后 使用git add 提交代码出现以下报错 warning LF will be replaced by CRLF in package json The file will have its ori
  • JVM线上故障排查的基本操作

    前言 线上经常会遇到各种各样的问题 CPU 飚高 内存溢出 频繁 GC 总的来说 基本上就是cpu 磁盘 内存以及网络等相关问题 所以进行排查时候尽量四个方面依次排查一遍 同时例如jstack jmap等工具也是不囿于一个方面的问题的 基本
  • [Python] 转贴:anaconda 下多版本Python 安装说明(win10)

    anaconda 下多版本Python 安装说明 转贴再补充 原帖见 https blog csdn net soloyuyang article details 75807425在原帖基础上补充了图 但是主要工作还是原帖的 win10系统
  • android 串口开发

    FT312D有参考
  • AD批量隐藏元件注释(Comment)

    步骤 1 右击元件注释在菜单中选中 Find Similar Objects 查找相似元件 2 在弹出来的菜单中 在Part comment 后面的下拉框中选择Same 即设定筛选条件为筛选所有相同comment的元件 然后点击OK 最后点
  • HttpComponents入门解析

    1 简介 超文本传输协议 http 是目前互联网上极其普遍的传输协议 它为构建功能丰富 绚丽多彩的网页提供了强大的支持 构建一个网站 通常无需直接操作http协议 目前流行的WEB框架已经透明的将这些底层功能封装的很好了 如常见的J2EE
  • java 关于锁常见面试题

    1 synchronized作用于静态方法和非静态方法的区别 非静态方法 给对象加锁 可以理解为给这个对象的内存上锁 注意 只是这块内存 其他同类对象都会有各自的内存锁 这时候在其他一个以上线程中执行该对象的这个同步方法 注意 是该对象 就
  • 「考生说」双非考生依旧可以成为“天选之子”

    随着2022年考研复试季的结束 微博热搜开始被 六战法考最终上岸的北大物业小哥刘政 中专生考进清华 等词条刷屏 大批网友也开启了他们 夸夸 能力 在这大量的评论中依旧有着众多让人鼓舞的金句产出 你不需要很厉害才能开始 但你需要开始才能很厉害
  • 【计算机图形学课程】二.MFC鼠标响应函数模拟画图软件

    上一篇文章我们讲述MFC绘制图形的基本函数 包括绘制直线 绘制矩形 绘制椭圆及绘制文字 同时通过绕圆旋转和矩形平移简单的理解了图形学知识 这篇文章我将介绍鼠标响应和键盘响应 通过这些事件让学生实现一个类似画图的简单软件 同时充分发挥学生想象
  • 【新手教程】Windows本地化安装、运行,部署Auto-GPT

    Windows安装 运行Auto GPT 第一 准备条件 OpenAI Key 请登录官网获取 sk RhLoBodCbL6AAlyuYeC8T3BlbkFJ5vJfX9P5Md504SmADtth 第二 环境搭建 2 1安装python
  • 创建Vue项目(demo)教程

    如何创建个人Demo 1 环境准备 安装node js node官网 https nodejs org zh cn 安装完成后查看版本 打开 cmd 命窗口 使用 node v 查看版本号 出现版本号即安装成功 node v npm v 安
  • 怎么用C#获取指定窗口的句柄(笔记)

    获取鼠标位置处窗口句柄 需要使用到Win32Api函数WindowFromPoint 用来根据坐标获取窗口句柄 C 引用如下 DllImport user32 dll EntryPoint WindowFromPoint 指定坐标处窗体句柄
  • 不知道为什么的为什么

    我最想的是什么仔细想了想 静悄悄的从这个世界无声无息的消失 不想有任何牵连 任何羁绊
  • 随机生成Long值

    随机生成Long类型的数值 public class RandomLongUtil 随机生成Long值 param bit 位数 return 返回Long值 throws Exception 异常 public static Long r
  • STM32PWM控制智能风扇

    设计思路 这个是一个STM32通过定时器产生PWM波控制小风扇的设计 首先STM32驱动ds18b20温度传感器采集环境温度 然后通过按键设置温度的阈值 不同的温度范围定时器产生的PWM波不同 相应的小风扇的转速也会不一样 温度越高 小风扇