基于STM32芯片的笔记本电脑散热智能控制系统设计12000字【论文】_第1页
基于STM32芯片的笔记本电脑散热智能控制系统设计12000字【论文】_第2页
基于STM32芯片的笔记本电脑散热智能控制系统设计12000字【论文】_第3页
基于STM32芯片的笔记本电脑散热智能控制系统设计12000字【论文】_第4页
基于STM32芯片的笔记本电脑散热智能控制系统设计12000字【论文】_第5页
已阅读5页,还剩23页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-- -PAGE1-基于STM32芯片的笔记本电脑散热智能控制系统设计目录TOC\o"1-3"\h\u19014摘要 1124071引言 298942概述 562702.1笔记本电脑自动散热控制器系统概述 565872.2本设计方案思路 5219942.3研发方向和技术关键 5217873硬件设计 887013.1系统硬件框图 8273643.2MCU部分 853103.3LED灯部分 1040823.4按键电路图 10247653.5数码管显示部分 10248583.6蜂鸣器部分 1166463.7DS18B20部分 12191924软件设计 14186584.1总体方案 14289954.2功能模块说明 15212374.3主程序说明 2366084.4程序总体简述 24194795调试 261745.1PWM调速技术 2684095.2电机驱动模块和风扇 26260995.3调试 2622027参考文献 32摘要本毕业设计设计了一款笔记本电脑的自动散热控制器,该控制器能够根据其上搭载的DS18B20温度传感器采集温度,并通过板载的STM32F411RCT6芯片进行相关数据和操作的处理,最终实现对风扇的转速控制。该系统主要由六个部分组成,分别为温度采集部分,MCU(MicrocontrollerUnit,微控制单元)部分,电机驱动及直流电机部分,报警电路部分,数码管温度显示部分,LED灯部分。温度采集部分通过温度传感器DS18B20对笔记本电脑出风口温度进行采集。MCU部分通过STM32F41RCT6芯片进行相关的软件代码处理并输出有关的操作信号。电机驱动及直流电机部分包括直流电机驱动模块、直流电机和风扇,由MCU传输的信号进行相关控制。报警电路部分由一个LED灯和蜂鸣器组成,由MCU传输的信号进行相关控制。数码管温度显示部分由一个共阴极数码管和74HC138D芯片组成,由MCU部分控制显示温度采集部分采集到的温度值。LED灯部分由数个LED灯组成,由MCU部分控制亮灭。该系统通过温度采集部分得到笔记本出风口温度,再经过MCU部分进行有关处理后,数码管温度显示部分会显示采集到的温度值,亮起相关的LED灯并通过PWM(PulseWidthModulation,脉冲宽度调制)调制方法输出信号给电机驱动及直流电机部分,从而控制风扇的转动。在温度超过一定阈值时,报警电路部分会受MCU控制而启动,即LED灯亮,蜂鸣器响。关键词:笔记本;散热控制器;自动;温度采集1引言在进一步了解本毕业设计前,我先讲述下该设计的意义以及国内外对笔记本散热器的相关研究状况。购买笔记本电脑的用户基本都是因为笔记本电脑好携带,相比于台式机,笔记本电脑能够更方便的被使用者携带往返于教室和寝室或者公司与家庭间。随着时代发展,笔记本电脑的厂商也更加注重于笔记本电脑的轻薄性,但是又为了兼顾笔记本电脑的性能,势必就要压缩热管或者减少风扇数量以及缩小风道,这就导致了笔记本电脑的散热功能受到了极大的限制。散热系统在专攻游戏的高配置笔记本电脑或者需要处理大量信息的办公笔记本电脑上显得尤为重要,但是大部分的笔记本散热系统都存在着或多或少的限制,所以外接一个外置的笔记本电脑散热控制器就能帮助笔记本电脑更好的散热。对于笔记本电脑的散热,国内外一直以来都在不断的研究并开发新的产品来解决笔记本电脑的散热问题。在国外,早早的便有了一种称为coolingball的散热器设计,其原理便是简单的抬高笔记本电脑底板与桌面的距离,增强空气流动。由于简单的工作原理,其在今天演变为带风扇的底座支架式。值得一提的是国外JIUM公司曾经发明了一种名为Cycooler散热器,通过温差电偶将与Cycooler接触的笔记本电脑底板的热量吸走并排出热量从而达成散热的效果。笔记本外接散热器的研究总是大致相似的,比如国内的九州风神E-golf与coolingball的设计就十分类似,国内外网友也都会凭自己的理解去DIY水冷组件。但国内的网友却凭借自己的丰富经验DIY出了抽风式和底座压风式两种散热器,这两种散热器的散热效果都十分强大,稍后会详细介绍。现在的主流外置笔记本电脑散热器分为四种,一是底座支架式,二是抽风式,三是水冷式,四是底座压风式。底座支架式是最为简单的,其原理就是通过支架增高笔记本电脑与桌面的高度来达到辅助散热的目的,并且通过设置在底座的散热风扇使笔记本电脑下方的空气流动速度更快以达到散热的目的。但事实上由于笔记本外壳的阻挡,大量向上吹的风都被阻隔在外,造成散热底座普遍无法带来有效降温的现实。相对于其他散热器来说,底座支架式的散热效果是最差的,但除此之外无明显缺点,需要一题的是它虽然有一定的体积但是比较轻巧,能够与笔记本电脑一起随身携带。抽风式通过连接笔记本电脑的出风口帮助笔记本电脑排出热空气,加强笔记本内部空气流通以达到散热的效果,相对于其他的散热器,它的体积较小,方便携带,并且相比底座支架式有更好的散热效果,但是它有三个比较明显的缺点。首先,由于现在笔记本电脑设计较为多样化,笔记本的出风口也不尽相同,要使用抽风式散热器的话必须得两者相匹配,否则根本无法连接起来。其次,使用抽风式散热器会对笔记本电脑自带的风扇产生损害,使用久了甚至会导致笔记本自带的风扇无法转动。最后,它会产生比较大的噪音。水冷式通过在导管内循环的水冷液带走CPU(CentralProcessingUnit,计算机中央处理器)或者显卡的温度以此达到降温的目的。笔记本电脑若是想通过水冷散热,一种是简单的将笔记本电脑内部的热管换成循环导管,另一种是外接水冷散热模组(本次讨论的就是外接散热模组)。水冷式散热器的散热效果十分显著,并且没有噪音,但是只有少数笔记本厂商会给自己的一些产品提供特定的水冷模组,这代表着大部分的笔记本电脑是没有自己特定的水冷散热器,所以只能靠用户自己DIY水冷散热器。还要说的是,水冷式散热器一旦发生漏液就可能会导致笔记本电脑内部短路,对电脑产生较大的危害。并且水冷模组的大体积往往只能放置在家中不能随意携带,这对于经常被携带的笔记本电脑来说属实不好。底座压风式是最近刚推出不久的一款外置散热器。它是利用比较柔软的材料做成密封圈,放在底座与笔记本电脑底部之间,将四周密封起来,使笔记本底部和散热器形成一个密封空间,在涡轮风扇之前装上防尘过滤网,使用高风压的涡轮风扇把外部冷空气从笔记本底部所有的进风口压入至笔记本内部,使整个笔记本内部都能享受降温。压风式散热器的散热效果同样十分优秀,但作为风冷,它也一样存在着噪音的缺点,尤其是当加大风扇的档数的时候,它的噪音会十分的明显。优秀的散热效果同样代表该设计会放弃一些方面,市面上大部分的压风式散热器体积都比较大并且有一定的重量,不利于随身携带。可以看到现在市面上的大部分场面都还是依靠风冷的散热器,因此设计一款能够自动控制的散热器是十分有必要的。通过对风扇的自动控制转动,不仅仅能够节约电量,实时调节,方便了笔记本电脑的散热也便利了笔记本电脑主人,并且也是对外置散热控制器噪音的一种控制。只要现在外置散热器还是在往风冷方面发展,对散热器的自动控制就不会停止发展,比如说最早最原始的底座支架式能够搭载该自动控制系统,最新式的底座风压式散热器也能够搭载该系统。

2概述2.1笔记本电脑自动散热控制器系统概述该系统主要由六个部分组成,分别为温度采集部分,MCU(MicrocontrollerUnit,微控制单元)部分,电机驱动及直流电机部分,报警电路部分,数码管温度显示部分,LED(LightEmittingDiode,发光二极管)灯部分。首先由温度采集部分的DS18B20温度传感器采集笔记本出风口附近的温度,并将数据传输给MCU部分进行处理。MCU部分的STM32F411RCT6芯片会根据软件代码将传输过来的温度值进行一个档数判断,根据判断得到的档数输出相应的信号给LED灯部分,LED灯部分亮起相关的档数指示LED灯。同时MCU部分还会由软件代码根据档数输出相对应的PWM波给电机驱动及直流电机部分,PWM波先进入直流电机驱动模块,再由直流电机驱动模块输出电压给直流电机控制风扇转动。数码管温度显示部分的74HC138D芯片也会根据因MCU部分的软件代码输出的信号来控制显示数码管显示采集到的温度值。当温度超过软件代码设定好的阈值时,MCU部分会输出信号给报警电路部分,从而启动报警LED灯和报警蜂鸣器。同时设置有警报取消按钮,按下按键后本次系统启动期间将停止警报。2.2本设计方案思路本毕业设计课题要求该设计能够监测电脑的温度,并根据温度调节风扇的转速以达到节能控温的目的。简单的来说,该课题最主要的内容便是设计一个温控风扇,在此基础上我打算增添几个额外的功能使该设计能够更加完善,具有更实际的应用性。首先我们需要三个LED状态指示灯来显示当前的风扇档数,是我们更为直观的观测到该系统当前的散热能力。其次,我想到或许可以用显像数码管来显示监测到的温度,使使用该系统的人能够更准确地把握笔记本电脑的当前温度。当然,报警功能也应该加入该设计之中,使得该系统更加的智能性,有报警功能当然还得需要报警停止功能,因此需要一个按钮来停止报警。以上,便是我设计该系统时的大致思路,最后,为了方便测试系统各功能是否完好以及方便答辩(在答辩时,笔记本电脑可能因为使用时间短,CPU(CentralProcessingUnit,中央处理器)处理的东西不多而导致笔记本电脑出风口温度在一个不高的值附近浮动),添加了测试功能,按下特定按键后,系统将会进入测试模式,测试模式的详细内容会在之后的软件设计部分进行讲解。2.3研发方向和技术关键技术关键:1. 使用DS18B20温度传感器采集到笔记本电脑的实时温度2. 判断读取到的采集温度确定风扇档数3. 根据风扇的档数调节风扇转速4. 控制指示LED灯的亮灭5. 根据风扇的档数亮起相应数量的指示LED灯6. 控制蜂鸣器的启动7. 控制警报LED灯的亮灭8. 设置按钮停止警报9.控制数码管显示温度值研发方向:该系统其实还可以增添许多新的功能,比如增加一个手动调控风扇转速功能,增加一个手动调控模式,通过增大或者减小电位器的值来改变输出的PWM波的占空比从而改变风扇的转速。添加OLED屏并设置GUI来更为直观地观察到温度值以及风扇的动力值。或者设置多个风扇,并控制各风扇的启动关闭等等来调控散热的性能。之前在引言里提到过底座支架型散热器,所以甚至能够在该系统里添加自动调控支架高度的功能,在需要高性能散热时,输出信号使搭载的电机运行抬高支架,增加笔记本电脑底座与周围的空气流通。在不需要高性能散热时,输出信号使搭载的电机运行降低支架。添加手动按钮来使用电机调控支架让我们不用亲手调支架,避免了麻烦也使得底架更为牢固。这些也是我在构想该系统时的一些想法,但由于一些原因最后还是没有能够将这些功能添加进系统里,但是这些功能是现阶段完全可以做到的。在我对散热器未来的想法里,我觉得散热器能够启到的作用可能还不仅仅是散热,现在日常的底座散热器完全有可能稍加改造而成为兼具音响功能的设计,或者如同现在一些手机底座充电器的设计,未来的外接散热器甚至能给我们的笔记本电脑充电。在说完该系统的研发方向后还是不得不提一下笔记本电脑散热器这一大方向的研发方向。以风冷为主流的散热器的一个通病便是风扇的转动会产生噪音,当越需要散热时,便越需要风扇有更大的功率,而这势必会造成更大的噪音。该系统虽然能够根据温度自动调节风扇转速,但也只是控制了不必要的噪声产生,仍然无法避免在高笔记本电脑温度下产生的噪音,所以在未来,散热器的发展除了在散热性能上的提高,更加便利的自动化控制以外,风冷还需要在控制噪音的能力上有较大的提升。对散热器材料或者笔记本电脑外壳材料的研究肯定也是一大重点,毕竟对于笔记本电脑的发热源头CPU和显卡来说,越来越高的性能也代表着越来越高的功率以及更高的发热,在无法避免源头的情况下,我们只能尽可能的增加散热器或者笔记本电脑自身的散热能力了,因此,笔记本电脑或者散热器的外壳用料也十分重要。

3硬件设计3.1系统硬件框图硬件部分的系统框图如下图1所示。图1:系统框图温度采集电路主要由DS18B20传感器构成,采集温度后传输给MCU部分。由MCU部分进行相关信号的处理并输出信号给LED灯部分和PWM输出部分以及数码管温度显示部分。当温度超过阈值时,MCU部分会输送信号给报警电路部分启动报警。PWM输出部分通过将PWM波输入电机驱动模块从而控制电机两端的电压实现调速。3.2MCU部分MCU部分选用STM32F411RCT6芯片,该芯片是STM32F4家族常用型号里面,中等配置的芯片,是STM32F411里中容量的,它拥有的资源包括:128KBSRAM、256KBFLASH、7个通用定时器、1个高级定时器、2个DMA控制器(共14个通道)、5个SPI、3个IIC、3个串口、1个USB、1个SDIO、1个12位ADC以及50个通用IO口。STM32F411RCT6芯片原理图如下图2所示。图2:芯片原理图它的位数为32位,电源电压最小值为1.7V,电源电压最大值为3.6V,采用了ARMCortex-M4的架构,该架构基于ARM-v7-M架构。是三级流水线设计。为哈佛总线架构,指令和地址总线使用相同的地址空间。32位寻址,支持4GB存储空间。基于ARMAMBA(高级微控制器总线架构)技术的片上接口,支持高吞吐量的流水线总线操作。NVIC(嵌套向量中断控制器),最多支持240个中断请求和8~256个中断优先级(理论上支持,实际需芯片厂商设计)具有支持多种OS(操作系统)特性,例如:节拍定时器和影子栈指针等。支持休眠模式和多种低功耗模式。支持可选MPU(存储器保护单元),具有存储器保护特性:可编程存储器或访问权限控制等。可通过位段特性支持两个特定存储器区域中的位数据访问。可选择使用单个或多个处理器。具有多种指令:普通数据处理,包括硬件除法指令。存储器访问指令(8位,16位,32位)。位域处理指令。乘累加(MAC)以及饱和指令。跳转,条件跳转以及函数调用指令。系统控制、支持OS指令。在DSP方面应用具有更高的性能。支持浮点运算(单精度)。支持单指令多数据(SIMD)操作。支持快速MAC和乘法指令。支持饱和运算指令。具有如下的优势:低功耗:都低于200uA/MHz。高性能:3CoreMark/MHz高能耗效率:功耗低,性能高所以具有高能耗效率。良好的代码密度:ThumbISA指令架构,在完成相同任务时,所需程序代码更少。中断多数量,多优先级,实时性好:240个向量中断,8~256中断优先级,中断等待12个周期(中断嵌套由硬件自动处理)。易于使用:具有简单、线性的存储器。可扩展性强:低端处理器,到200MHz高端处理器。调试特性丰富:标准调试特性(单步,暂停等),捕获程序流、数据变动以及概况信息等跟踪数据。还可以多Cortex-M处理器共享调试连接。多种OS支持,超过30余种。多种系统特性,例如:可位寻址存储器区域(位段特性)和MPU(存储器保护单元)。软件可移植性、可重用性:C友好架构,CMSIS。3.3LED灯部分LED灯部分的硬件电路设计如下图3所示。LED0-LED2分别接到PC0-PC3上。其中电路中的电阻起到限流的作用,由于发光二极管是非线性元件,所以就算是很小的电压也会引起电流较大的变化,因此串联一个电阻能够有效地保护电路。图3:LED灯电路图3.4按键电路图按键电路图如下图4所示。KEY0、KEY1和KEY2用作普通按键输入,分别连接在PC8、PC9和PD2上,这里并没有使用外部上拉电阻,但是STM32的IO作为输入的时候,可以设置上下拉电阻,所以我们使用STM32的内部上拉电阻来为按键提供上拉。图4:按键电路图3.5数码管显示部分该部分由一个共阴极数码管和共阳极数码管以及两个芯片74HC138和74HC595组成。具体电路图如下图5所示。LEDSEG1和LEDSEG2为4位共阴极数码管,CH1~CH4为位选端,A~DOT为段选段。74HC138(U7)为3-8译码器芯片,这里使用它实现数码管的位选功能,其Y0~Y7连接到两个数码管的CH1~CH4位选端,通过U7的A0~A2三个地址线的控制,选择Y0~Y7的输出(低电平有效),A0连接在MCU的PC10,A1连接在PC11,A2连接在PC12。74HC595(U6)为串行转并行数据芯片,这里使用它实现数码管的段选功能,其QA~QH引脚连接在数码管的HC595_QA~HC595_QH公共端,通过SFTCLK和LCHCLK的时钟控制,将SDI输入的串行数据转换成并行数据,通过QA~QH端输出控制数码管的段选,SFTCLK连接在MCU的PB5,LCHCLK连接在PB4,SDI连接在PB3,而RST则连接在MCU的复位电路RESET端,上电或按下RESET按键可对74HC595进行复位。图5:数码管显示部分电路图3.6蜂鸣器部分蜂鸣器部分的电路图如下图6所示。有源蜂鸣器是指自带了震荡电路的蜂鸣器,这种蜂鸣器一接上电就会自己震荡发声。而如果是无源蜂鸣器,则需要外加一定频率(2~5Khz)的驱动信号,才会发声。这里我选择使用有源蜂鸣器。图中Q1是用来扩流,R25则是一个限流电阻直接连接在BEEP信号端,BEEP信号端连接在MCU的PB8上面。图6:蜂鸣器电路图与报警系统有关的报警LED灯如之前的图3所示,3,3V电源经过发光二极管和510欧姆电阻最后连至MCU部分SRM32F411RCT6的PC3引脚上。用一个PNP三极管(S8550)来驱动蜂鸣器,R25主要用于控制PNP管饱和导通作用。当PB.8输出低电平的时候,蜂鸣器将发声,当PB.8输出高电平的时候,蜂鸣器停止发声。3.7DS18B20部分DS18B20部分的电路图如下图7所示。本设计的系统采用温度传感器DS18B20,该传感器具有宽广的适应电压范围,在寄生电源方式下还可以由数据线供电。不仅如此,与微处理器MCU相连时仅需一条口线便可以实现双方的双向通讯。在使用时不需要任何外围原件。温度范围包括了日常温度所能到达的极端值。这是一种十分常用,精度不错且非常适合用于日常生活用品的一种温度传感器,所以我选择它作为该设计的温度传感器。图7:DS18B20部分电路图1WIRE_DQ是传感器的数据线,该信号连接在MCU的PB9上。

4软件设计4.1总体方案该系统主要还是侧重于软件代码方面。因为MCU部分的芯片STM32F411RCT6是涉及到STM32单片机的相关应用,因此我打算用STM32CubeMX和Keil5这两个软件来实现对相关代码的编写。STM32CubeMX软件是一款STM32芯片图形化配置工具,使得用户能够根据自己的功能需求来对芯片的时钟或者GPIO口等等进行一系列的配置并生成C语言初始工程代码来进行后续的软件编写。这是一款十分好用便利的工具,也是近年来ST意法半导体大力推荐的一款图形化配置工具。Keil5这个软件我就不多介绍,是目前针对ARM处理器,尤其是CortexM内核处理器的最佳开发工具,被广大嵌入式工程师所选择。具体的GPIO口配置和定时器配置我会在之后的模块说明内涉及到时进行详细说明,在此我先简单讲解下使用STM32CubeMX配置系统时钟的过程以及相关的系统时钟参数。我们选择HSE(HighSpeedExternalClocksignal,高速外部时钟信号)为时钟源,并且用外部晶振来产生它。PLL(PhaseLockedLoop,锁相环)倍频系数M设置为4。主PLL倍频系数N设置为96。主PLL分频系数P设置为2。系统时钟时钟源我们选择PLL。此时就配置好了标准的96MHz的系统时钟。接下来就是设置好系统时钟的分频系数,该STM32单片机的时钟就配置完成了。软件流程如下图8所示。图8:软件流程框图在系统初始化完成后,由于定时器TIM3的中断操作以及中断回调函数,DS18B20传感器会一直读取温度并由数码管显示。之后系统会判断模式,该模式可由按键控制。当处于工作模式时,首先进行档数判断,并根据相应档数亮起指示LED灯并输出对应PWM波,当温度超过阈值时会触发警报,可由按键关闭警报。在调试模式时,可由按键调节档数,并根据档数亮起相应指示LED灯并输出对应PWM波。4.2功能模块说明按键扫描模块:配置PC8、PC9、PD2引脚为GPIO口输入,模式为上拉输入。#defineKEY0HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_8)#defineKEY1HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9)#defineKEY2HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_2)#defineKEY0_PRES1#defineKEY1_PRES2#defineKEY2_PRES3u8KEY_Scan(u8mode){ staticu8key_up=1; if(mode)key_up=1; if(key_up&&(KEY0==0|KEY1==0||KEY2==0)) { delay_ms(10); key_up=0; if(KEY0==0)returnKEY0_PRES; elseif(KEY1==0)returnKEY1_PRES; elseif(KEY2==0)returnKEY2_PRES; }elseif(KEY0==1&&KEY1==1&&KEY2==1)key_up=1; return0;}使用HAL库里的函数HAL_GPIO_ReadPin()函数来读取各引脚的电平状态,一旦按下某按键,则读取到该引脚的电平为0,输出相对应的值,若无按键按下返回0值。档数判断函数:shorttemperature;intdir;intjingbao=0;intbaojingguanbianniu=0;voiddangshupanduan(){ if(temperature<400) { dir=1; jingbao=0; baojingguanbianniu=0; }elseif(temperature>=400&&temperature<600) { dir=2; jingbao=0; baojingguanbianniu=0; }elseif(temperature>=600&&temperature<800) { dir=3; jingbao=0; baojingguanbianniu=0; }elseif(temperature>=800) { dir=3; jingbao=1; }}temperature为温度值,如何得到的稍后会解释。dir为风扇档数,jingbao为警报指示,baojingguanbianniu为报警关闭按钮。当温度值小于40摄氏度时,风扇档数为1,警报指示为0,报警关闭按钮为0。当温度值大于等于40摄氏度小于60摄氏度时,风扇档数为2,警报指示为0,报警关闭按钮为0。当温度值大于等于60摄氏度小于80摄氏度时,风扇档数为3,警报指示为0,报警关闭按钮为0.当温度值大于80摄氏度时,风扇档数为3,警报指示为1。档数指示灯函数:配置PC0、PC1、PC2为GPIO输出,PC0对应LED0,PC1对应LED1,PC2对应LED2。设置IO口初始化电平为高电平,输出模式为推挽输出,IO口上拉,输出速度设置为高速。voidLEDLIGHT(){ switch(dir) { case1:HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1|GPIO_PIN_2,GPIO_PIN_SET);break; case2:HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0|GPIO_PIN_1,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);break; case3:HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2,GPIO_PIN_RESET);break; }}运用switch语句来使相应档数的指示LED灯点亮。当档数为1时,LED0亮起,LED1,LED2处于熄灭状态。当档数为2时,LED0,LED1处于亮起状态,LED2处于熄灭状态。当档数为3时,LED0,LED1,LED2都处于亮起状态。PWM输出函数:使用PWM输出需要配置定时器TIM2。设置定时器时钟源为内部时钟源,设置定时器通道CH1为PWM输出模式,自动重装主计数器设置为899,Pulse设置为300,即初始占空比为30%,但由于档数dir初始定义为1,所以若使能TIM2定时器的PWM输出,会由于代码改变占空比。voidPWMshuchu(){ switch(dir) { case1:__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,500);break; case2:__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,650);break; case3:__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,800);break; }}用switch语句和__HAL_TIM_SetCompare()来根据档数调节PWM输出波的占空比。当档数为1时,输出占空比为55.6%的PWM波。当档数为2时,输出占空比为72.2%的PWM波。当档数为3时,输出占空比为88.9%的PWM波。报警指示灯函数:配置PC7口为GPIO口输出,设置IO口初始化电平为高电平,输出模式为推挽输出,IO口上拉,输出速度设置为高速。voidbaojingLEDLIGHT(){ if(jingbao==1) { HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_RESET); }elseHAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_SET);}当警报指示值为1时,设置PC7口的电平为低电平,即点亮警报LED灯。当警报指示值不为1时,警报LED灯不亮。报警蜂鸣器函数:配置PB8口为GPIO口输出,与配置LED灯一致,设置IO口初始化电平为高电平,输出模式为推挽输出,IO口上拉,输出速度设置为高速。voidbaojingfengmingqi(){ if(jingbao==1) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET); }elseHAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);}当警报指示值为1时,将PB8口的电平置低,报警蜂鸣器启动,发出警报。当警报指示值为0时,警报蜂鸣器不启动。报警系统函数:voidbaojingxitong(){ if(KEY_Scan(0)==1) { baojingguanbianniu=1; } if(baojingguanbianniu==0) { baojingLEDLIGHT(); baojingfengmingqi(); }}若按下KEY0按键,报警关闭按钮的值变为1,只有当报警关闭按钮的值为0时,报警系统正常执行报警指示灯功能函数和报警蜂鸣器功能函数,所以当按下KEY0后报警系统为关闭状态。模式判断函数:intmoshi=1;intx=0;voidmoshipanduan(){ if(moshi==0) { if(KEY_Scan(0)==2) { moshi=1; x=0; } }elseif(moshi==1) { if(KEY_Scan(0)==2) { moshi=0; x=1; } }}为了方便功能测试以及论文答辩时显示各项功能,增添了测试功能函数。moshi表示模式状态,当moshi=1时为工作状态,moshi=0时为测试状态。初始默认moshi的值为1,处于工作状态。x表示测试档数,初始值为0。如果处于测试模式,按下KEY1按键,转变为工作模式,测试档数变为0。如果处于工作模式,按下KEY1按键,转变为测试模式,测试档数变为一档,表示刚进入测试模式时,默认为一档。测试档数判断函数:voidceshidangshupanduan(){ if(x>=1&&x<3) { if(KEY_Scan(0)==3) { x++; } }elseif(x==3) { if(KEY_Scan(0)==3) { x=1; } }}当测试档数为1,2时,按下按键KEY2,测试档数x的值就加1,即按下按键KEY2,档数1变为档数2,档数2变为档数3。当档数为3时,按下按键KEY2,测试档数变为1。测试系统函数:voidceshixitong(){ switch(x) { case1:__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,500); HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1|GPIO_PIN_2,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_SET); break; case2:__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,650); HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0|GPIO_PIN_1,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_SET); break; case3:__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,800); HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_RESET); break; }}用switch语句来实现各个档数的相关功能。当测试档数为1时,指示LED0亮起,指示LED1,指示LED2灯熄灭,输出占空比为55.6%的PWM波,警报LED灯和警报蜂鸣器都处于关闭状态。当测试档数为2时,指示LED0,LED1灯亮起,指示LED2灯熄灭,输出占空比为72.2%的PWM波,警报LED灯和警报蜂鸣器都处于关闭状态。当测试档数为3时,三个指示LED灯都亮起,输出占空比为88.9%的PWM波,警报LED灯亮起,警报蜂鸣器启动发出声音。中断回调函数:配置一个中断定时器来实现通过中断回调函数读取DS18B20采集到的温度值并通过显示数码管来显示读取到的温度值。选择TIM3定时器,并设置其时钟为内部时钟。定时器分频系数的值设为9599,计数模式为向上计数,自动重装载值为19,时钟分频因子为不分频,使能自动重装载。u8smg_num[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x01,0x00};u8smg_wei=4;u8num=0;u16temp_t=0;u8flag=0;voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){if(htim==(&htim3)){ if(moshi==1) { temp_t++; if(temp_t>=500) { temp_t=0; temperature=DS18B20_Get_Temp(); if(temperature<0) { temperature=-temperature; flag=1; }elseflag=0; } }elseif(moshi==0) { switch(x) { case1:flag=0;temperature=330;break; case2:flag=0;temperature=550;break; case3:flag=0;temperature=880;break; } } switch(smg_wei) { case4:if(flag)num=0x02; elsenum=0x00; break; case5:num=smg_num[temperature/10/10];break; case6:num=smg_num[temperature/10%10]|0x01;break; case7:num=smg_num[temperature%10];break; } LED_Write_Data(num,smg_wei); LED_Refresh(); smg_wei++; if(smg_wei==8)smg_wei=4; }}配置了一个中断定时器TIM3并通过其中断回调函数来实现读取DS18B20采集到的温度并显示的功能。其中添加了数码管以及DS18B20温度传感器的驱动文件,通过驱动文件内的相关函数来更为便利的实现该功能。定义共阴数字数组使共阴数码管初始为全灭状态。定义数码管位选smg_wei初始为4,数码管数值num初始为0,采样时间temp_t初始为0,并定义一个正负标志值flag。当判断为TIM3产生中断时,中断返回时,如果处于工作状态,那么每次中断后temp_t的值都会加1,当temp_t的值大于或等于500时便会清零一次,并由DS18B20传感器获取温度值并赋值给temperature,从而实现每0.5s采样温度值。若温度值为负值,对temperature取反,并将正负标志值记1。若处于测试模式,则直接使用switch语句根据测试档数来赋予temperature固定值。当测试档数为1时,正负标志值为0(代表温度为正),temperature值为330(代表温度值为33摄氏度)。当测试档数为2时,正负标志值为0(代表温度为正),temperature值为550(代表温度值为55摄氏度)。当测试档数为3时,正负标志值为0(代表温度为正),temperature值为880(代表温度值为88摄氏度)。接下来使用switch语句来根据位选设置相应的数码管值。位选为4时,若正负标志符为1,数码管值为0x02,即“-”,若为0,数码管值为0x00,即不亮。位选为5时,数码管值为temperature的百位数,即实际温度值的十位数(该DS18B20传感器的精度为0.1摄氏度,DS18B20_Get_Temp()函数返回值为-550~1250,由于该设计,暂不设计显示100摄氏度以上值)。位选为6时,数码管值为temperature的十位数,即实际温度值的个位数。位选为7时,数码管值为temperature的个位数,即实际温度值的小数点后一位。将数码管值写到相应的数码管位里,并更新显示。当数码管位选为8时,将其更新到4。4.3主程序说明#include"main.h"#include"tim.h"#include"gpio.h"#include"delay.h"#include"ds18b20.h"#include"sys.h"#include"smg.h"intmain(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_TIM2_Init();MX_TIM3_Init();delay_init(96);LED_SMG_Init();DS18B20_Init();HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);HAL_TIM_Base_Start_IT(&htim3);while(1){moshipanduan() if(moshi==1) { dangshupanduan(); LEDLIGHT(); PWMshuchu(); baojingxitong(); }elseif(moshi==0) { ceshidangshupanduan(); ceshixitong(); }voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){……}在main函数前添加相关的头文件。main函数中最开始是对一系列东西的初始化。首先初始化HAL库,初始化时钟设置,初始化GPIO口设置,初始化TIM2定时器设置,初始化TIM3中断定时器设置,初始化延时设置,初始化数码管设置,初始化DS18B20传感器。接下来是对两个定时器的使能,使能定时器TIM2通道1的PWM输出,使能中断定时器TIM3。之后用while语句来循环执行其中的功能,首先用模式判断函数来判断模式,如果模式为工作模式,依次执行档数判断函数,档数指示灯函数,PWM输出函数,报警系统函数。如果模式为测试模式,依次执行测试档数判断函数,测试系统函数。中断回调函数加在main函数之后,在每次中断定时器TIM3进入中断后返回执行中断前的程序时,都会调用中断回调函数来执行DS18B20传感器以及数码管的相关功能。4.4程序总体简述当系统上电后,默认处于工作模式。不管温度多少,数码管都会显示DS18B20检测到的温度,同时根据监测到的温度来进行档数判断,若温度小于40摄氏度,指示LED0灯亮起,定时器TIM2的通道1输出占空比为55.6%的PWM波。若温度大于等于40摄氏度小于60摄氏度,指示LED0灯和指示LED1灯亮起,定时器TIM2的通道1输出占空比为72.2%的PWM波。若温度大于等于60摄氏度小于80摄氏度,三盏指示LED灯都亮起,定时器TIM2的通道1输出占空比为88.9%的PWM波。当温度大于80摄氏度时,三盏指示LED灯都亮着,定时器TIM2的通道1输出占空比为88.9%的PWM波,同时报警系统启动,警报LED灯亮起,警报蜂鸣器发出声响,此时按下KEY0键,会关闭报警系统。按下KEY1键后会改变系统的模式,进入测试模式后,系统默认处于测试模式一档,数码管显示温度33摄氏度,指示LED灯0亮起,定时器TIM2的通道1输出占空比为72.2%的PWM波。按下KEY2键,档数会发生改变,二档时,数码管显示温度55摄氏度,指示LED0灯和指示LED1灯亮起,定时器TIM2的通道1输出占空比为72.2%的PWM波。三档时,数码管显示温度88摄氏度,三盏指示LED灯都亮着,定时器TIM2的通道1输出占空比为88.9%的PWM波,警报LED灯亮起,警报蜂鸣器发出声响。5调试5.1PWM调速技术在主电路的硬件软件都设计完成以后,之后便是连接上电机驱动模块和风扇来控制风扇的转动。本系统通过主电路输出的PWM波来控制小风扇的转速,具体如何实现,在本部分会讲解。PWM,脉冲宽度调制技术,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化。占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比。所以,在本系统中,我们通过输出不同占空比的PWM波来实现风扇的三个档数不同的转动速度。5.2电机驱动模块和风扇本次系统用到的风扇由直流电机控制转动,因此我们需要一个直流电机驱动模块。由于MCU部分STM32F411RCT6输出的PWM波IO口的电流很小不足以驱动直流电机直接转动,因此我们需要直流电机驱动模块来放大功率接着使直流电机转动。直流电机驱动模块最主要的部分便是芯片L298N,它是专用驱动集成电路,属于H桥集成电路,不仅能够驱动两相电机,也能够驱动四相电机。它的输入端能够与单片机直接相连十分方便,而且根据输入端的逻辑电平能够实现驱动的电机正转反转,这又方便了一系列操作。总结其特点,可实现电机正反转及调速,启动性能好,启动转矩大,工作电压可达到36V,4A,可同时驱动两台直流电机。通过电机驱动模块,输入进不同占空比的PWM波,它将会输出不同的平均电压,将其连接在我们用到的两相直流电机上,该直流电机便会因为加在其负载两端的不同电压而有不同的功率,所以它们的转速就会有所不同,从而达成PWM波调速。5.3调试将所有部分电路组装完成后,将该系统上电,进行相关功能的调试。在调试过程中发现了许许多多的问题,并解决了这些问题。上电后,发现显像数码管能够显示当前环境温度,但是会有不正常的闪烁现象,经过反复研究,排除了自己编写的软件代码的问题,可能是自己配置的中断定时器的初始化存在相关问题。最后将原先的自动重装载值4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论