沈阳工学院
课 程 作 业
作业题目: STM32的数据采集温度系统
学 院: 信息与控制学院
专 业: 测控技术与仪器
学 号: 11305116
姓 名: 佟昊
指导教师: 李征明
E-MAIL 地址: [email protected]
2014年5月10日
摘 要
本文介绍了基于单片机的数据采集的硬件设计和软件设计,数据采集系统是模拟域与数字域之间必不可少的纽带,它的存在具有着非常重要的作用。设计基于STM32单片机硬件资源进行了开发,采用DS18B20数字温度传感器作为测温元件,并通过ili9341LCD 进行温度显示,充分利用单片机的硬件资源,以非常小的硬件投入,实现了对温度信号的精确检测与控制,用C#语言编一个简单的客户端进行数据的显示和存储。电路设计方法简单、可靠性高,能满足实际应用的要求。
关键词:STM32
数据采集 LCD显示 DS18B20温度传感器
一、 设计原理及要求
本次设计主要利用STM32与DS18B20数字温度传感器结合的方式来实现温度的采集及其显示。根据要求STM32数据采集系统,要求能够采集温度,实现LCD 显示。
二、 程序硬件介绍
STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。按性能分成两个不同的系列:STM32F103“增强型”系列和STM32F101“基本型”系列。增强型系列时钟频率达到72MHz ,是同类产品中性能最高的产品;基本型时钟频率为36MHz ,以16位产品的价格得到比16位产品大幅提升的性能,是16位产品用户的最佳选择。两个系列都内置32K 到128K 的闪存,不同的是SRAM 的最大容量和外设接口的组合。 DS18B20的主要特性
(1)适应电压范围更宽,电压范围:3.0~5.5V ,在寄生电源方式下可由数据线供电
(2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯
(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温
(4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内
(5)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃
(6)可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温
(7)在9位分辨率时最多在93.75ms 内把温度转换为数字,12位分辨率时最多在750ms 内把温度值转换为数字,速度更快
(8)测量结果直接输出数字温度信号,以" 一线总线" 串行传送给CPU ,同时可传送CRC 校验码,具有极强的抗干扰纠错能力
(9)负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
STM32硬件原理图
图1.1STM32硬件原理图
DS18B20原理图
图1.2DS18B20原理图
三、 程序代码
主函数部分
/**
******************************************************************************
* @file main.c
* @author fire
* @version V1.0
* @date 2013-xx-xx
* @brief systick系统定时器
******************************************************************************
* @attention
*
* 实验平台:野火 ISO-MINI STM32 开发板
*
******************************************************************************
*/
#include "bsp_ds18b20.h"
#include "bsp_led.h"
#include "bsp_usart1.h"
#include "app_ui.h"
#ifdef LCD_DISPLAY
#include "bsp_ili9341_lcd.h"
#endif
/*
* 函数名:DS18B20_GPIO_Config
* 描述 :配置DS18B20用到的I/O口
* 输入 :无
* 输出 :无
*/
static void DS18B20_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStructure; /*开启DS18B20_PORT的外设时钟*/ RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE); /*选择要控制的DS18B20_PORT引脚*/
GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化DS18B20_PORT*/
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}
/*
* 函数名:DS18B20_Mode_IPU
* 描述 :使DS18B20-DATA 引脚变为输入模式
* 输入 :无
* 输出 :无
*/
static void DS18B20_Mode_IPU(void)
{
GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);
GPIO_InitTypeDef GPIO_InitStructure;
}
/*
* 函数名:DS18B20_Mode_Out_PP
* 描述 :使DS18B20-DATA 引脚变为输出模式
* 输入 :无
* 输出 :无
*/
static void DS18B20_Mode_Out_PP(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*选择要控制的DS18B20_PORT引脚*/
/*调用库函数,初始化DS18B20_PORT*/ GPIO_Init(DS18B20_PORT, &GPIO_InitStructure); /*设置引脚模式为浮空输入模式*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /*选择要控制的DS18B20_PORT引脚*/ GPIO_InitStructure.GPIO_Pin = DS18B20_PIN; GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化DS18B20_PORT*/
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}
/*
*主机给从机发送复位脉冲
*/
static void DS18B20_Rst(void)
{
}
/*
* 检测从机给主机返回的存在脉冲
* 0:成功
* 1:失败
/* 主机设置为推挽输出 */ DS18B20_Mode_Out_PP(); DS18B20_DATA_OUT(LOW); /* 主机至少产生480us 的低电平复位信号 */ Delay_us(750); /* 主机在产生复位信号后,需将总线拉高 */ DS18B20_DATA_OUT(HIGH); /*从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲*/ Delay_us(15);
*/
static uint8_t DS18B20_Presence(void)
{
uint8_t pulse_time = 0; /* 主机设置为上拉输入 */ DS18B20_Mode_IPU(); /* 等待存在脉冲的到来,存在脉冲为一个60~240us的低电平信号 * 如果存在脉冲没有来则做超时处理,从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲
*/ while( DS18B20_DATA_IN() && pulse_time=100 ) return 1; else /* 存在脉冲到来,且存在的时间不能超过240us */ while( !DS18B20_DATA_IN() && 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
/*
* 从DS18B20读一个字节,低位先行 */
uint8_t DS18B20_Read_Byte(void) { } /*
* 写一个字节到DS18B20,低位先行 */
void DS18B20_Write_Byte(uint8_t dat) {
uint8_t i, testb; DS18B20_Mode_Out_PP();
for( i=0; i
testb = dat&0x01; dat = dat>>1;
uint8_t i, j, dat = 0;
for(i=0; i
return dat;
j = DS18B20_Read_Bit(); dat = (dat) | (j
/* 写0和写1的时间至少要大于60us */ if (testb)
}
}
DS18B20_DATA_OUT(LOW); /* 1us
DS18B20_DATA_OUT(HIGH); Delay_us(58);
} else { }
DS18B20_DATA_OUT(LOW); /* 60us
DS18B20_DATA_OUT(HIGH);
/* 1us
void DS18B20_Start(void) { }
uint8_t DS18B20_Init(void) {
DS18B20_Rst();
DS18B20_Presence(); DS18B20_Write_Byte(0XCC); DS18B20_Write_Byte(0X44);
/* 跳过 ROM */ /* 开始转换 */
} /*
DS18B20_Rst();
return DS18B20_Presence();
* 存储的温度是16 位的带符号扩展的二进制补码形式
* 当工作在12位分辨率时,其中5个符号位,7个整数位,4个小数位 *
* |---------整数----------|-----小数 分辨率 1/(2^4)=0.0625----| * 低字节 | 2^3 | 2^2 | 2^1 | 2^0 | 2^(-1) | 2^(-2) | 2^(-3) | 2^(-4) | * *
* |-----符号位:0->正 1->负-------|-----------整数-----------| * 高字节 | s | s | s | s | s | 2^6 | 2^5 | 2^4 | * *
* 温度 = 符号位 + 整数 + 小数*0.0625 */
float DS18B20_Get_Temp(void) {
uint8_t tpmsb, tplsb; short s_tem; float f_tem;
DS18B20_Rst();
DS18B20_Presence(); DS18B20_Write_Byte(0XCC); DS18B20_Write_Byte(0X44);
/* 跳过 ROM */ /* 开始转换 */
DS18B20_Rst();
DS18B20_Presence();
DS18B20_Write_Byte(0XCC);
DS18B20_Write_Byte(0XBE);
tplsb = DS18B20_Read_Byte(); tpmsb = DS18B20_Read_Byte();
s_tem = tpmsb
if( s_tem
f_tem = (~s_tem+1) * 0.0625;
else f_tem = s_tem * 0.0625;
return f_tem;
}
void DS18B20_Test(void) { #ifdef LCD_DISPLAY
uint8_t lcd_char[20];
#endif
/* 配置SysTick 为1us 中断一次 */ SysTick_Init();
/* LED 端口初始化 */ LED_GPIO_Config();
while( DS18B20_Init())
/* 跳过 ROM */
/* 读温度值 */
}
{
#endif
printf("\r\n no ds18b20 exit \r\n"); #ifdef LCD_DISPLAY
LCD_DispEnCh(20,160,"检测失败, 请确保DS18b20与开发板已正确连接",RED);
}
printf("\r\n ds18b20 exit \r\n"); for(;;) { }
printf("\r\n temperature %.1f\r\n",DS18B20_Get_Temp()); Delay_ms(1000); LED1_TOGGLE; #ifdef LCD_DISPLAY
sprintf(lcd_char,"温度:%.1f 度",DS18B20_Get_Temp()); LCD_DispEnCh(20,160,lcd_char,BLUE);
/* 1s 读取一次温度值 */
#endif
/*************************************END OF FILE******************************/ 其中bsp_iso_test.c中
温度控制系统包括硬件和软件两个部分,硬件部分包括了温度检测,加热,调整和显示
等多个部分,而软件部分主要是对单片机进行程序设计以控制各个模块之间协调工作,完成温度控制的作用。
根据设计任务的要求, 系统软件主要完成温度数据的采集和滤波处理、LED 数码管显示以及串口同PC 机的通信[18]。程序采用STM32的固件函数库在MDK 环境下编写, 主要包括以下内容:
(1)初始化
(2)数据的采集和处理 (3)数码显示 (4)串口通信
软件部分的设计思路是将测试并放大过的信号与输入的温度进行比较如果低于临界值则输出信号控制加热模块进行加热,反之控制加热模块断开知道温度降到输入值一下再进行连接,其流程图如图所示:
图1.3温度控制流程图
四、 心得体会
本次试验围绕STM32芯片为核心展开对温度控制系统的研究,涵盖的技术包括热电偶测温技术、信号放大以及信号处理技术、双向可控硅调功控温系统。运用的方法及工具有protell 电路绘制软件、multisim 仿真软件及电路板实验等。完成的成果有检测及放大电路的研究与实现、加热部分的实现及触发器的研究、键盘和显示部分的研究。
系统的整个运作过程是:温度传感器测得的温度信号经过冷端补偿并转换为参考端为30℃的电压信号输出,再经过放大作为“模拟输入通道”的输入,送入STM32 实现A/D转换,给定恒温值采用电位输入,STM32对输入的温度信号进行数据处理,将输入值与给定值相比较,判定偏高还是偏低,这样得到控制量,处理后的数字信号经过D/A转换器转换为模拟信号在STM32输出,根据模拟信号的大小激发可控硅的导通,改变双向可控硅导通角的大小,使加在加热棒上的电压改变,以此来控制加热棒的加热功率,改变加热能量,最终实现对温度的自动控制。
通过这次试验,使我的动手能力得到了很大的提高,更使我懂得理论知识的重要性,没有理论的指导一切实际行动都是盲目的,且实际操作是我们得到的理论知识得到验证,更能增加对理论知识的理解一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题, 这次的课程设计结束了,但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。设计过程,有很多的困难和问题要自己去查找资料,好比是我们人类成长的历程,常有一些不如意,但毕竟不是一次做就能做好,难免会遇到各种各样的问题,所以自己要学会认真修改纠正自己的错误然后改正。
参考文献
[1]严洁. 单片机原理及其接口技术. 机械工业出版社,2010,65-105 [2] 范红刚.51单片机自学笔记. 北京航空航天大学出版社,2009 [3] 高云. 基于MSP430的温室多路数据采集系统. 农机化研究,2009 [4] 常铁原,王欣,陈文军. 多路数据采集系统的设计. 电子技术应用,2009 [5] 叶红海,李丽敏. 基于单片机的多路数据采集系统的设计与实现,2009
[6] 彭伟. 单片机C 语言程序设计实训100例. 电子工业出版社,2009,46-48,104-110 [7] 杨居义,杨晓琴,王益斌等. 单片机课程设计指导. 清华大学出版社,2009,135-141 [8] 陈雪芳,荣静. 基于FDM 的快速成型质量的研究[J].苏州市职业大学学报,2009 [9] 姚琳. 基于Cortex-M3内核的32位MCU 具有低功耗和多接口[J] . 电子设计技术,2009 [10] 元增民,张文希. 单片机原理与应用基础. 国防科技大学出版社,2006,205-266
沈阳工学院
课 程 作 业
作业题目: STM32的数据采集温度系统
学 院: 信息与控制学院
专 业: 测控技术与仪器
学 号: 11305116
姓 名: 佟昊
指导教师: 李征明
E-MAIL 地址: [email protected]
2014年5月10日
摘 要
本文介绍了基于单片机的数据采集的硬件设计和软件设计,数据采集系统是模拟域与数字域之间必不可少的纽带,它的存在具有着非常重要的作用。设计基于STM32单片机硬件资源进行了开发,采用DS18B20数字温度传感器作为测温元件,并通过ili9341LCD 进行温度显示,充分利用单片机的硬件资源,以非常小的硬件投入,实现了对温度信号的精确检测与控制,用C#语言编一个简单的客户端进行数据的显示和存储。电路设计方法简单、可靠性高,能满足实际应用的要求。
关键词:STM32
数据采集 LCD显示 DS18B20温度传感器
一、 设计原理及要求
本次设计主要利用STM32与DS18B20数字温度传感器结合的方式来实现温度的采集及其显示。根据要求STM32数据采集系统,要求能够采集温度,实现LCD 显示。
二、 程序硬件介绍
STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。按性能分成两个不同的系列:STM32F103“增强型”系列和STM32F101“基本型”系列。增强型系列时钟频率达到72MHz ,是同类产品中性能最高的产品;基本型时钟频率为36MHz ,以16位产品的价格得到比16位产品大幅提升的性能,是16位产品用户的最佳选择。两个系列都内置32K 到128K 的闪存,不同的是SRAM 的最大容量和外设接口的组合。 DS18B20的主要特性
(1)适应电压范围更宽,电压范围:3.0~5.5V ,在寄生电源方式下可由数据线供电
(2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯
(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温
(4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内
(5)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃
(6)可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温
(7)在9位分辨率时最多在93.75ms 内把温度转换为数字,12位分辨率时最多在750ms 内把温度值转换为数字,速度更快
(8)测量结果直接输出数字温度信号,以" 一线总线" 串行传送给CPU ,同时可传送CRC 校验码,具有极强的抗干扰纠错能力
(9)负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
STM32硬件原理图
图1.1STM32硬件原理图
DS18B20原理图
图1.2DS18B20原理图
三、 程序代码
主函数部分
/**
******************************************************************************
* @file main.c
* @author fire
* @version V1.0
* @date 2013-xx-xx
* @brief systick系统定时器
******************************************************************************
* @attention
*
* 实验平台:野火 ISO-MINI STM32 开发板
*
******************************************************************************
*/
#include "bsp_ds18b20.h"
#include "bsp_led.h"
#include "bsp_usart1.h"
#include "app_ui.h"
#ifdef LCD_DISPLAY
#include "bsp_ili9341_lcd.h"
#endif
/*
* 函数名:DS18B20_GPIO_Config
* 描述 :配置DS18B20用到的I/O口
* 输入 :无
* 输出 :无
*/
static void DS18B20_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStructure; /*开启DS18B20_PORT的外设时钟*/ RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE); /*选择要控制的DS18B20_PORT引脚*/
GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化DS18B20_PORT*/
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}
/*
* 函数名:DS18B20_Mode_IPU
* 描述 :使DS18B20-DATA 引脚变为输入模式
* 输入 :无
* 输出 :无
*/
static void DS18B20_Mode_IPU(void)
{
GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);
GPIO_InitTypeDef GPIO_InitStructure;
}
/*
* 函数名:DS18B20_Mode_Out_PP
* 描述 :使DS18B20-DATA 引脚变为输出模式
* 输入 :无
* 输出 :无
*/
static void DS18B20_Mode_Out_PP(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*选择要控制的DS18B20_PORT引脚*/
/*调用库函数,初始化DS18B20_PORT*/ GPIO_Init(DS18B20_PORT, &GPIO_InitStructure); /*设置引脚模式为浮空输入模式*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /*选择要控制的DS18B20_PORT引脚*/ GPIO_InitStructure.GPIO_Pin = DS18B20_PIN; GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化DS18B20_PORT*/
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}
/*
*主机给从机发送复位脉冲
*/
static void DS18B20_Rst(void)
{
}
/*
* 检测从机给主机返回的存在脉冲
* 0:成功
* 1:失败
/* 主机设置为推挽输出 */ DS18B20_Mode_Out_PP(); DS18B20_DATA_OUT(LOW); /* 主机至少产生480us 的低电平复位信号 */ Delay_us(750); /* 主机在产生复位信号后,需将总线拉高 */ DS18B20_DATA_OUT(HIGH); /*从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲*/ Delay_us(15);
*/
static uint8_t DS18B20_Presence(void)
{
uint8_t pulse_time = 0; /* 主机设置为上拉输入 */ DS18B20_Mode_IPU(); /* 等待存在脉冲的到来,存在脉冲为一个60~240us的低电平信号 * 如果存在脉冲没有来则做超时处理,从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲
*/ while( DS18B20_DATA_IN() && pulse_time=100 ) return 1; else /* 存在脉冲到来,且存在的时间不能超过240us */ while( !DS18B20_DATA_IN() && 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
/*
* 从DS18B20读一个字节,低位先行 */
uint8_t DS18B20_Read_Byte(void) { } /*
* 写一个字节到DS18B20,低位先行 */
void DS18B20_Write_Byte(uint8_t dat) {
uint8_t i, testb; DS18B20_Mode_Out_PP();
for( i=0; i
testb = dat&0x01; dat = dat>>1;
uint8_t i, j, dat = 0;
for(i=0; i
return dat;
j = DS18B20_Read_Bit(); dat = (dat) | (j
/* 写0和写1的时间至少要大于60us */ if (testb)
}
}
DS18B20_DATA_OUT(LOW); /* 1us
DS18B20_DATA_OUT(HIGH); Delay_us(58);
} else { }
DS18B20_DATA_OUT(LOW); /* 60us
DS18B20_DATA_OUT(HIGH);
/* 1us
void DS18B20_Start(void) { }
uint8_t DS18B20_Init(void) {
DS18B20_Rst();
DS18B20_Presence(); DS18B20_Write_Byte(0XCC); DS18B20_Write_Byte(0X44);
/* 跳过 ROM */ /* 开始转换 */
} /*
DS18B20_Rst();
return DS18B20_Presence();
* 存储的温度是16 位的带符号扩展的二进制补码形式
* 当工作在12位分辨率时,其中5个符号位,7个整数位,4个小数位 *
* |---------整数----------|-----小数 分辨率 1/(2^4)=0.0625----| * 低字节 | 2^3 | 2^2 | 2^1 | 2^0 | 2^(-1) | 2^(-2) | 2^(-3) | 2^(-4) | * *
* |-----符号位:0->正 1->负-------|-----------整数-----------| * 高字节 | s | s | s | s | s | 2^6 | 2^5 | 2^4 | * *
* 温度 = 符号位 + 整数 + 小数*0.0625 */
float DS18B20_Get_Temp(void) {
uint8_t tpmsb, tplsb; short s_tem; float f_tem;
DS18B20_Rst();
DS18B20_Presence(); DS18B20_Write_Byte(0XCC); DS18B20_Write_Byte(0X44);
/* 跳过 ROM */ /* 开始转换 */
DS18B20_Rst();
DS18B20_Presence();
DS18B20_Write_Byte(0XCC);
DS18B20_Write_Byte(0XBE);
tplsb = DS18B20_Read_Byte(); tpmsb = DS18B20_Read_Byte();
s_tem = tpmsb
if( s_tem
f_tem = (~s_tem+1) * 0.0625;
else f_tem = s_tem * 0.0625;
return f_tem;
}
void DS18B20_Test(void) { #ifdef LCD_DISPLAY
uint8_t lcd_char[20];
#endif
/* 配置SysTick 为1us 中断一次 */ SysTick_Init();
/* LED 端口初始化 */ LED_GPIO_Config();
while( DS18B20_Init())
/* 跳过 ROM */
/* 读温度值 */
}
{
#endif
printf("\r\n no ds18b20 exit \r\n"); #ifdef LCD_DISPLAY
LCD_DispEnCh(20,160,"检测失败, 请确保DS18b20与开发板已正确连接",RED);
}
printf("\r\n ds18b20 exit \r\n"); for(;;) { }
printf("\r\n temperature %.1f\r\n",DS18B20_Get_Temp()); Delay_ms(1000); LED1_TOGGLE; #ifdef LCD_DISPLAY
sprintf(lcd_char,"温度:%.1f 度",DS18B20_Get_Temp()); LCD_DispEnCh(20,160,lcd_char,BLUE);
/* 1s 读取一次温度值 */
#endif
/*************************************END OF FILE******************************/ 其中bsp_iso_test.c中
温度控制系统包括硬件和软件两个部分,硬件部分包括了温度检测,加热,调整和显示
等多个部分,而软件部分主要是对单片机进行程序设计以控制各个模块之间协调工作,完成温度控制的作用。
根据设计任务的要求, 系统软件主要完成温度数据的采集和滤波处理、LED 数码管显示以及串口同PC 机的通信[18]。程序采用STM32的固件函数库在MDK 环境下编写, 主要包括以下内容:
(1)初始化
(2)数据的采集和处理 (3)数码显示 (4)串口通信
软件部分的设计思路是将测试并放大过的信号与输入的温度进行比较如果低于临界值则输出信号控制加热模块进行加热,反之控制加热模块断开知道温度降到输入值一下再进行连接,其流程图如图所示:
图1.3温度控制流程图
四、 心得体会
本次试验围绕STM32芯片为核心展开对温度控制系统的研究,涵盖的技术包括热电偶测温技术、信号放大以及信号处理技术、双向可控硅调功控温系统。运用的方法及工具有protell 电路绘制软件、multisim 仿真软件及电路板实验等。完成的成果有检测及放大电路的研究与实现、加热部分的实现及触发器的研究、键盘和显示部分的研究。
系统的整个运作过程是:温度传感器测得的温度信号经过冷端补偿并转换为参考端为30℃的电压信号输出,再经过放大作为“模拟输入通道”的输入,送入STM32 实现A/D转换,给定恒温值采用电位输入,STM32对输入的温度信号进行数据处理,将输入值与给定值相比较,判定偏高还是偏低,这样得到控制量,处理后的数字信号经过D/A转换器转换为模拟信号在STM32输出,根据模拟信号的大小激发可控硅的导通,改变双向可控硅导通角的大小,使加在加热棒上的电压改变,以此来控制加热棒的加热功率,改变加热能量,最终实现对温度的自动控制。
通过这次试验,使我的动手能力得到了很大的提高,更使我懂得理论知识的重要性,没有理论的指导一切实际行动都是盲目的,且实际操作是我们得到的理论知识得到验证,更能增加对理论知识的理解一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题, 这次的课程设计结束了,但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。设计过程,有很多的困难和问题要自己去查找资料,好比是我们人类成长的历程,常有一些不如意,但毕竟不是一次做就能做好,难免会遇到各种各样的问题,所以自己要学会认真修改纠正自己的错误然后改正。
参考文献
[1]严洁. 单片机原理及其接口技术. 机械工业出版社,2010,65-105 [2] 范红刚.51单片机自学笔记. 北京航空航天大学出版社,2009 [3] 高云. 基于MSP430的温室多路数据采集系统. 农机化研究,2009 [4] 常铁原,王欣,陈文军. 多路数据采集系统的设计. 电子技术应用,2009 [5] 叶红海,李丽敏. 基于单片机的多路数据采集系统的设计与实现,2009
[6] 彭伟. 单片机C 语言程序设计实训100例. 电子工业出版社,2009,46-48,104-110 [7] 杨居义,杨晓琴,王益斌等. 单片机课程设计指导. 清华大学出版社,2009,135-141 [8] 陈雪芳,荣静. 基于FDM 的快速成型质量的研究[J].苏州市职业大学学报,2009 [9] 姚琳. 基于Cortex-M3内核的32位MCU 具有低功耗和多接口[J] . 电子设计技术,2009 [10] 元增民,张文希. 单片机原理与应用基础. 国防科技大学出版社,2006,205-266