XX 学
综合实践(文)
题 目 基STM32温控风扇
学 院 通信电子工程学院
专业班级
学生姓名
学生学号
指导教师
摘:着科技日新月异智家居逐渐走入普通家庭风扇作基家电器成智家居部分里介绍STM32单片机控制单元结合嵌入式技术设计款具温控调速液晶显示温度等信息智电风扇前期设计制作终测试出该风扇电源稳定性操作方便运行功强价格低廉节约耗够满足户元化需求该风扇具性化设计低廉价格适合普通户家庭
关键词:STM32单片机 电风扇 温控调速
目 录
摘 I
第1章 绪 1
11 概述 1
12 设计目应 1
第2章 温控电风扇方案证 2
21 温度传感器选择 2
22 控制核心选择 2
23 显示电路选择 3
24 调速方式选择 3
第3章 温控电风扇硬件设计 5
31 硬件系统总体设计 5
32 系统器件简介 5
321 DS18B20简介 5
322 STM32简介 7
323 LCD1602液晶屏简介 8
33 部分电路设计 9
331 温度传感器电路 9
332 LCD1602液晶屏显示电路 10
第4章 温控电风扇软件设计 11
41 软件系统总体设计 11
42 系统初始化程序设计 11
43 温度采集显示程序设计 12
结 14
参考文献 15
附录1 16
附录2 25
第1章 绪
11 概述
传统电风扇采机械控制功单噪声定时时间短摇头模式固定变档风速变化较针缺点文采款性价高功耗低基ARM CortexM3核STM32单片机作控制单元制作台智电风扇该风扇巧妙运温度传感技术液晶显示技术等智控制技术应家电器控制中根环境温度采样实现风速动调整根采集温度显示液晶屏采芯片功强方便进行功扩展
12 设计目意义
春夏(夏秋)交时节白天温度旧高电风扇应高转速风量感清凉晚气温降低入睡应该逐步减转速免感然电风扇调节档位功必须手动换档睡着力普遍采定时器关闭做法方面定时时间长短限制般两时方面两时气温旧没降低风扇关闭睡梦中热醒起床重新开风扇增加定时器时间非常麻烦次定时次定时时间太长温度降低风扇旧继续吹风感第三方面简单定时时间关闭风扇电源单功满足气温变化风扇风速求较功率电子产品散热方面现绝数采风冷系统利风扇引起空气流动带走热量电子产品发热烧坏电子产品保持较低温度必须功率高转速风量风扇风扇噪音功率成正果低噪音减风扇转速会引起电子设备温度升两全美解决述问题设计套温控动风扇系统系统采高精度集成温度传感器单片机控制显示实时温度根者设定温度动相应温度时作出风风停机动作精确度高动作准确
第2章 温控电风扇方案证
21 温度传感器选择
温度传感器种方案供选择:
方案:选热敏电阻作感测温度核心元件通运算放器放温度变化引起热敏电阻电阻变化进导输出电压变化微弱电压变化信号AD转换芯片ADC0809模拟信号转化数字信号输入单片机处理
方案二:采热电偶作感测温度核心元件配合桥式电路运算放电路AD转换电路温度变化信号送入单片机处理
方案三:采数字式集成温度传感器DS18B20作感测温度核心元件直接输出数字温度信号供单片机处理
方案采热敏电阻价格便宜元件易购优点热敏电阻温度细微变化敏感信号采集放转换程中会产生失真误差热敏电阻RT关系非线性身电阻温度变化存较误差然通定电路予纠正仅电路复杂稳定性降低体处温度环境温度变化中难检测温度变化该方案适合系统
方案二采热电偶桥式测量电路相热敏电阻温度敏感性器件非线性误差较提高测温范围非常宽50摄氏度1600摄氏度均测量然存电路复杂温度敏感性达系统求标准采该方案
方案三数字式集成温度传感器DS18B20高度集成化降低外接放转换等电路误差素温度误差感测温度原理述两种方案原理着质温度分辨力极高温度值器件部转换成数字量直接输出简化系统程序设计该传感器采先进单总线技术(1WRIE)单片机接口变非常简洁抗干扰力强关DS18B20详细参数参面硬件设计中器件介绍
2.2 控制核心选择
方案:采电压较电路作控制部件温度传感器采热敏电阻热电偶等温度信号转电信号放集成运放组成较电路判决控制风扇转速高低某值时风扇切换相应档位
方案二:采STM32单片机作控制核心软件编程方法进行温度判断端口输出控制信号
方案采电压较电路具电路简单易实现需编写软件程序特点控制方式单设置限动作温度法满足户环境种动作温度求系统中采
方案二STM32单片机作控制器通编写程序传感器感测温度通显示电路显示出户通键盘接口设置限动作温度值满足全方位需求通程序判断温度具极高精准度精确握环境温度微变化系统采方案二
2.3 显示电路选择
方案:采五位阳数码显示温度动态扫描显示方式
方案二:采液晶显示屏LCD显示温度
方案该方案成低廉显示温度明确醒目夜间见功耗极低显示驱动程序编写相简单种显示方式广泛应足方扫描显示方式五LED逐点亮会闪烁眼视觉暂留时间20MS数码扫描周期时间时眼感觉闪烁通增扫描频率消闪烁感
方案二液晶体显示屏具显示字符优美显示数字显示字符甚图形优点LED数码法拟硬件连接简单系统采方案二
2.4 调速方式选择
方案:采数模转化芯片DAC0832控制单片机根前环境温度值输出相应数字量DAC0832中DAC0832产生相应模拟信号控制晶闸导通角通级调速电路实现风扇电机转速动调节
方案二:采单片机软件编程实现PWM(脉宽度调制)调速方案PWM英文Pulse Width Modulation缩写定规律改变脉序列脉宽度调节输出量波形种调节方式PWM驱动控制调节系统中常矩形波PWM信号控制时需调节PWM波占空占空指高电持续时间周期时间百分控制电机转速时占空越转速越快全高电占空100时转速达单片机IO口输出PWM信号时两种方案:
(1) 利软件延时高电延时时间时IO口电取反变成低电然延时定时间低电延时时间时该IO口电取反循环PWM信号设计中应方案
(2) 利定时器控制方案(1)相该方案中利单片机定时器定时进行高低电转变软件延时应方案时编程相复杂
方案该方案够实现直流风扇电机级调速速率变化灵敏DA转化芯片价格较高温控状态级调速性相性价高
方案二相硬件者软硬件相结合方案实现电机进行调速言采PWM 纯软件方案实现调速程具更灵活性降低成够充分发挥单片机性简单速率控制系统实现提供种效途径综合考虑选方案二
第3章 温控电风扇硬件设计
31 硬件系统总体设计
次设计采STM32单片机做控芯片通DS18B20采集温度温度显示 LCD1602根温度利STM32风扇进行调速总体硬件设计图1示:
图1 系统总体结构框图
32 系统器件简介
321 DS18B20简介
DS18B20美国DALLAS半导体公司继DS1820新推出种改进型智温度传感器传统热敏电阻相够直接读出测温度根实际求通简单编程实现9~12位数字值读数方式分9375 ms750 ms完成9位12位数字量DS18B20读出信息写入DS18B20信息仅需根口线(单线接口)读写温度变换功率源数总线总线身挂接DS18B20供电需额外电源DS18B20系统结构更趋简单性更高测温精度转换时间传输距离分辨率等方面较DS1820改进户带更方便更令满意效果
DS18B20简介:
(1)独特单线接口方式:DS18B20微处理器连接时仅需条口线实现微处理器DS18B20双通讯
(2)中需外围元件
(3)数线供电电压范围:+30~ +55 V
(4)测温范围:55 ~+125 ℃固测温分辨率05 ℃
(5)通编程实现9~12位数字读数方式
(6)户设定非易失性报警限值
(7)支持点组网功DS18B20联惟三线实现点测温
(8)负压特性电源极性接反时温度计会发热烧毁正常工作
单线(1—wire)技术:
该技术采单根信号线传输时钟传输数双传输适单机系统机够控制机设备通漏极开路三态端口连该数线允许设备发送数时释放该线设备单线通常求外接5K拉电阻样该线空闲时状态高电
机机间通讯分成三步骤:初始化单线器件识单线器件单线数传输
单线1—wire协议复位脉应答脉写0写1读0读1种信号类型实现信号中应答脉机发起指令数字节低位前
DS18B20直接测量温度值转化数字量提交单片机工作时必须严格遵守单总线器件工作时序
DS18B20 部结构脚图2图3示:
图2 DS18B20部结构图
图3 DS18B20外形脚图
322 STM32简介
STM32系列基专求高性低成低功耗嵌入式应专门设计ARM CortexM核中STM32F1系列:STM32F103增强型系列STM32F101基型系列STM32F105STM32F107互联型系列
增强型系列时钟频率达72MHz类产品中性高产品基型时钟频率36MHz16位产品价格16位产品幅提升性32位产品户佳选择两系列置32K128K闪存SRAM容量外设接口组合时钟频率72MHz时闪存执行代码STM32功耗36mA32位市场功耗低产品相05mAMHz
核:ARM32位CortexM3 CPU高工作频率72MHz125DMIPSMHz单周期法硬件法
存储器:片集成32512KBFlash存储器664KBSRAM存储器
时钟复位电源理:2036V电源供电IO接口驱动电压PORPDR编程电压探测器(PVD)416MHz晶振嵌出厂前调校8MHz RC振荡电路部40 kHzRC振荡电路CPU时钟PLL带校准RTC32kHz晶振
低功耗:3种低功耗模式:休眠停止机模式RTC备份寄存器供电VBAT
调试模式:串行调试(SWD)JTAG接口
DMA:12通道DMA控制器支持外设:定时器ADCDACSPIIICUART
312位us级AD转换器(16通道):AD测量范围:036 V双采样保持力片集成温度传感器
2通道12位DA转换器:STM32F103xCSTM32F103xDSTM32F103xE独
高达112快速IO端口:根型号26375180112IO端口端口映射16外部中断量模拟输入接受5V输入
达11定时器:416位定时器定时器4ICOCPWM者脉计数器216位6通道高级控制定时器:6通道PWM输出2门狗定时器(独立门狗窗口门狗)Systick定时器:24位倒计数器216位基定时器驱动DAC
达13通信接口:2IIC接口(SMBusPMBus)5USART接口(ISO7816接口LINIrDA兼容调试控制)3SPI接口(18 Mbits)两IIS复CAN接口(20B)USB 20全速接口SDIO接口
ECOPACK封装:STM32F103xx系列微控制器采ECOPACK封装形式
323 LCD1602液晶屏简介
1602液晶1602字符型液晶种专门显示字母数字符号等点阵型液晶模块干5X7者5X11等点阵字符位组成点阵字符位显示字符位间点距间隔行间间隔起字符间距行间距作正显示图形实物图图4示:
图4 LCD1602实物图
1602LCD指显示容16X2显示两行行16字符液晶模块1602采标准16脚接口中:
第1脚:GND电源
第2脚:VCC接5V电源正极
第3脚:V0液晶显示器度调整端接正电源时度弱接电 源时度高
第4脚:RS寄存器选择高电1时选择数寄存器低电0时选择指令寄存器
第5脚:RW读写信号线高电(1)时进行读操作低电(0)时进行写操作
第6脚:E(EN)端(enable)端高电(1)时读取信息负跳变时执行指令
第7~14脚:D0~D78位双数端
第15~16脚:空脚背灯电源15脚背光正极16脚背光负极
33 部分电路设计
331 温度传感器电路
模块更优秀DS18B20作温度传感器STM32单片机作处理器配温度显示作温度控制输出单元整系统力求结构简单功完善电路图图2示
系统工作原理:
DS18B20数字温度传感器采集现场温度测量数送入STM32单片机GPIO口单片机处理显示前温度值设定温度值限值作较高设定限值低设定限值控制电机转速进行动调整
图5 DS18B20温度计原理图
332 LCD1602液晶屏显示电路
模块采LCD1602温度进行显示液晶体显示屏具显示字符优美显示数字显示字符甚图形优点电路设计图:
图6 液晶显示电路
第4章 温控电风扇软件设计
41 软件系统总体设计
次设计控制系统软件C语言编程模块化设计程序外功子程序分执行直流电机驱动调速温度采集显示等功编辑环境采集成开发环环境Keil程序总体运行流程图:
图7 程序运行流程图
42 系统初始化程序设计
系统初始化包括STM32系统定时器初始化GPIO口初始化LCD1602初始化等具体设计流程图图8:
图8 初始化程序流程图
43 温度采集显示程序设计
DS18B20温度传感器进行温度采集时次进行初始化ROM操作指令存储器操作指令数传输等操作具体程序设计流程图9
图9 温度采集显示流程图
结
次设计系统STM32单片机控制核心温度传感器DS18B20检测环境温度实现根环境温度变化调节风扇电机转速定范围实现转速连续调节LCD1602连续稳定显示环境温度实现基单片机温控风扇设计
系统设计推广种电动机控制系统中实现电动机转速调节生产生活中系统简单日常风扇智控制生活带便利工业生产中改变输入信号实现信号输入控制电机转速进实现生产动化电力系统中根负荷达电压信号电压信号调节发电机转速进调节发电量实现电力系统动化调节综述该系统设计研究社会生产生活中具重位
参考文献
[1] 曹巧媛单片机原理应北京:电子工业出版社20022
[2] 王伦电风扇原理维修技术北京:新时代出版社1999
[3] 张毅刚新编MCS51单片机应设计哈尔滨工业学出版社200610
[4] 梁廷贵王裕琛控硅触发电路语音电路分册北京:科学技术文献出版社2003
附录1 程序
1 函数
#include stm32f10xh
#include bsp_SysTickh
#include
#include bsp_ds18b20h
int main()
{ int PWMlowzhouqi
float wendu
int wendu1
zhouqi500
lowzhouqiPWM
SysTick_Init()
init1602()
lcdpos(10)
writestring(TEM 000)
GPIO_SetBits(GPIOBGPIO_Pin_0)
while( DS18B20_Init())
{
lcdpos(00)
writestring( no ds18b20 exit)
}
lcdpos(00)
writestring(ds18b20 exit)
for()
{
DS18B20_Get_Temp(wendu)
if (wendu<0)
{ lcdpos(14)
writestring()
}
wendu1wendu*100
lcdpos(15)
write_dat(wendu110000+0x30)
lcdpos(16)
write_dat(wendu1100001000+0x30)
lcdpos(17)
write_dat(wendu11000100+0x30)
lcdpos(19)
write_dat(wendu110010+0x30)
lcdpos(110)
write_dat(wendu110+0x30)
Delay_ms(2000)
if(wendu1>30)
{ low500
GPIO_SetBits(GPIOBGPIO_Pin_0)
Delay_ms(PWM)
}
if(wendu1<15)
{ low0
GPIO_SetBits(GPIOBGPIO_Pin_0)
Delay_ms(PWM)
}
if(wendu1>15&wendu1<20)
{ low100
GPIO_SetBits(GPIOBGPIO_Pin_0)
Delay_ms(PWM)
GPIO_ResetBits(GPIOBGPIO_Pin_0)
Delay_ms(low)
}
if(wendu1>20&wendu1<25)
{
low200
GPIO_SetBits(GPIOBGPIO_Pin_0)
Delay_ms(PWM)
GPIO_ResetBits(GPIOBGPIO_Pin_0)
Delay_ms(low)
}
if(wendu1>25&wendu1<30)
{ low300
GPIO_SetBits(GPIOBGPIO_Pin_0)
Delay_ms(PWM)
GPIO_ResetBits(GPIOBGPIO_Pin_0)
Delay_ms(low)
}
}
}
2 DS18B20子程序
#include bsp_ds18b20h
*
* 函数名:DS18B20_GPIO_Config
* 描述 :配置DS18B20IO口
* 输入 :
* 输出 :
*
static void DS18B20_GPIO_Config(void)
{
*定义GPIO_InitTypeDef类型结构体*
GPIO_InitTypeDef GPIO_InitStructure
*开启DS18B20_PORT外设时钟*
RCC_APB2PeriphClockCmd(DS18B20_CLK ENABLE)
*选择控制DS18B20_PORT引脚*
GPIO_InitStructureGPIO_Pin DS18B20_PIN
*设置引脚模式通推挽输出*
GPIO_InitStructureGPIO_Mode GPIO_Mode_Out_PP
*设置引脚速率50MHz *
GPIO_InitStructureGPIO_Speed GPIO_Speed_50MHz
*调库函数初始化DS18B20_PORT*
GPIO_Init(DS18B20_PORT &GPIO_InitStructure)
GPIO_SetBits(DS18B20_PORT DS18B20_PIN)
}
*
* 函数名:DS18B20_Mode_IPU
* 描述 :DS18B20DATA引脚变输入模式
* 输入 :
* 输出 :
*
static void DS18B20_Mode_IPU(void)
{
GPIO_InitTypeDef GPIO_InitStructure
*选择控制DS18B20_PORT引脚*
GPIO_InitStructureGPIO_Pin DS18B20_PIN
*设置引脚模式浮空输入模式*
GPIO_InitStructureGPIO_Mode GPIO_Mode_IPU
*调库函数初始化DS18B20_PORT*
GPIO_Init(DS18B20_PORT &GPIO_InitStructure)
}
*
* 函数名:DS18B20_Mode_Out_PP
* 描述 :DS18B20DATA引脚变输出模式
* 输入 :
* 输出 :
*
static void DS18B20_Mode_Out_PP(void)
{
GPIO_InitTypeDef GPIO_InitStructure
*选择控制DS18B20_PORT引脚*
GPIO_InitStructureGPIO_Pin DS18B20_PIN
*设置引脚模式通推挽输出*
GPIO_InitStructureGPIO_Mode GPIO_Mode_Out_PP
*设置引脚速率50MHz *
GPIO_InitStructureGPIO_Speed GPIO_Speed_50MHz
*调库函数初始化DS18B20_PORT*
GPIO_Init(DS18B20_PORT &GPIO_InitStructure)
}
*
*机机发送复位脉
*
static void DS18B20_Rst(void)
{
* 机设置推挽输出 *
DS18B20_Mode_Out_PP()
DS18B20_DATA_OUT(LOW)
* 机少产生480us低电复位信号 *
Delay_us(750)
* 机产生复位信号需总线拉高 *
DS18B20_DATA_OUT(HIGH)
Delay_us(15)
}
*
* 检测机机返回存脉
* 0:成功
* 1:失败
*
static uint8_t DS18B20_Presence(void)
{
uint8_t pulse_time 0
* 机设置拉输入 *
DS18B20_Mode_IPU()
while( DS18B20_DATA_IN() && pulse_time<100 )
{
pulse_time++
Delay_us(1)
}
* 100us存脉没*
if( pulse_time >100 )
return 1
else
pulse_time 0
* 存脉存时间超240us *
while( DS18B20_DATA_IN() && pulse_time<240 )
{
pulse_time++
Delay_us(1)
}
if( pulse_time >240 )
return 1
else
return 0
}
*
* DS18B20读取bit
*
static uint8_t DS18B20_Read_Bit(void)
{
uint8_t dat * 读0读1时间少60us *
DS18B20_Mode_Out_PP()
* 读时间起始:必须机产生 >1us <15us 低电信号 *
DS18B20_DATA_OUT(LOW)
Delay_us(10)
* 设置成输入释放总线外部拉电阻总线拉高 *
DS18B20_Mode_IPU()
Delay_us(2)
if( DS18B20_DATA_IN() SET )
dat 1
else
dat 0
* 延时参数请参考时序图 *
Delay_us(45)
return dat
}
*
* DS18B20读字节低位先行
*
uint8_t DS18B20_Read_Byte(void)
{
uint8_t i j dat 0
for(i0 i<8 i++)
{
j DS18B20_Read_Bit()
dat (dat) | (j< }
return dat
}
*
* 写字节DS18B20低位先行
*
void DS18B20_Write_Byte(uint8_t dat)
{
uint8_t i testb
DS18B20_Mode_Out_PP()
for( i0 i<8 i++ )
{
testb dat&0x01
dat dat>>1
* 写0写1时间少60us *
if (testb)
{
DS18B20_DATA_OUT(LOW)
* 1us < 延时 < 15us *
Delay_us(8)
DS18B20_DATA_OUT(HIGH)
Delay_us(58)
}
else
{
DS18B20_DATA_OUT(LOW)
* 60us < Tx 0 < 120us *
Delay_us(70)
DS18B20_DATA_OUT(HIGH)
* 1us < Trec(恢复时间) < 穷*
Delay_us(2)
}
}
}
void DS18B20_Start(void)
{
DS18B20_Rst()
DS18B20_Presence()
DS18B20_Write_Byte(0XCC) * 跳 ROM *
DS18B20_Write_Byte(0X44) * 开始转换 *
}
uint8_t DS18B20_Init(void)
{
DS18B20_GPIO_Config()
DS18B20_Rst()
return DS18B20_Presence()
}
float DS18B20_Get_Temp(float f_tem)
{
uint8_t tpmsb tplsb
short s_tem
DS18B20_Rst()
DS18B20_Presence()
DS18B20_Write_Byte(0XCC) * 跳 ROM *
DS18B20_Write_Byte(0X44) * 开始转换 *
DS18B20_Rst()
DS18B20_Presence()
DS18B20_Write_Byte(0XCC) * 跳 ROM *
DS18B20_Write_Byte(0XBE) * 读温度值 *
tplsb DS18B20_Read_Byte()
tpmsb DS18B20_Read_Byte()
s_tem tpmsb<<8
s_tem s_tem | tplsb
I f( s_tem < 0 ) * 负温度 *
f_tem (~s_tem+1) * 00625
else
f_tem s_tem * 00625
return f_tem
}
3 LCD1602子程序
#include
#include bsp_SysTickh
void LCD_GPIO_init()
{
GPIO_InitTypeDef GPIO_InitStructure
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB ENABLE)
GPIO_InitStructureGPIO_Pin GPIO_Pin_All
GPIO_InitStructureGPIO_Mode GPIO_Mode_Out_PP
GPIO_InitStructureGPIO_Speed GPIO_Speed_50MHz
GPIO_Init(GPIOA &GPIO_InitStructure)
GPIO_InitStructureGPIO_Pin
GPIO_Pin_1|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_0|GPIO_Pin_11
GPIO_Init(GPIOB &GPIO_InitStructure)
}
void RS(u8 a)
{
if(a0)GPIO_ResetBits(GPIOBGPIO_Pin_5)
if(a1)GPIO_SetBits(GPIOBGPIO_Pin_5)
}
void WR(u8 a)
{
if(a0)GPIO_ResetBits(GPIOBGPIO_Pin_1)
if(a1)GPIO_SetBits(GPIOBGPIO_Pin_1)
}
void EN(u8 a)
{
if(a0)GPIO_ResetBits(GPIOBGPIO_Pin_6)
if(a1)GPIO_SetBits(GPIOBGPIO_Pin_6)
}
void dat(u8 dat)
{
u16 a
aGPIO_ReadOutputData(GPIOA)
aa&0xff00
aa|dat
GPIO_Write(GPIOAa)
}
void write_cmd(u8 cmd)
{
RS(0)
WR(0)
dat(cmd)
Delay_us(500)
EN(1)
Delay_us(500)
EN(0)
}
void write_dat(u8 date)
{
RS(1)
WR(0)
dat(date)
Delay_us(500)
EN(1)
Delay_us(500)
EN(0)
}
void lcdpos(u8 Xu8 Y)
{
u8 cmd
if(X0)cmd0x80+Y
if(X1)cmd0x80+0x40+Y
write_cmd(cmd)
}
void writestring(char *s)
{
while(*s)
{
write_dat(*s)
s++
}
}
void init1602(void)
{
LCD_GPIO_init()
Delay_us(1000)
EN(0)
write_cmd(0x38)
write_cmd(0x0c)
write_cmd(0x06)
write_cmd(0x01)
write_cmd(0x80)
}
附录2 实物图
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档