单片机报告.docx
《单片机报告.docx》由会员分享,可在线阅读,更多相关《单片机报告.docx(74页珍藏版)》请在冰豆网上搜索。
单片机报告
学生实习(实训)总结报告
学院:
_电气与信息工程学院_专业班级:
自动化2013-04
学生姓名:
_______学号:
__
实习(实训)地点:
_____________
报告题目:
__关于STM32的温度控制系统综合训练报告____
报告日期:
2016年5月13日
指导教师评语:
_______________________________________
________________________________________________________________________________________________________________________________________________________________________________________________________
成绩(五级记分制):
_____________
指导教师(签字):
_____________________
1温度控制的功能规划与方案设计………………………………………1
1.1温度控制的安全与环境约束条件……………………………………1
1.2功能规划………………………………………………………………1
1.3硬件总体方案优选与设计……………………………………………1
1.4软件总体方案优选与设计……………………………………………2
2硬件电路优选与设计………………………………………………………2
2.1CPU时钟与复位电路…………………………………………………2
2.2显示电路优选与设计…………………………………………………3
2.3按键接口电路优选与设计……………………………………………4
2.4温度检测电路优选与设计……………………………………………5
2.5加热电路优选与设计…………………………………………………5
*2.6参数保存电路优先与设计(选做)………………………………6
3软件设计及其实现优化…………………………………………………6
3.1控制程序的结构及模块化设计………………………………………11
3.2显示程序的实现与优化………………………………………………14
3.3按键扫描及处理程序的实现与优化…………………………………17
3.4温度检测程序的实现与优化………………………………………20
3.5PID控制程序的实现与优化……………………………………………21
3.6PWM输出程序实现与优化……………………………………………22
*3.7参数保存程序的实现与优化(选做)………………………………26
4调试与测试工作……………………………………………………………26
4.1软硬件环境与工具简介………………………………………………26
4.2调试方法及步骤………………………………………………………27
4.3测试方法及测试结果…………………………………………………28
5技术总结……………………………………………………………………31
5.1主要问题及其解决……………………………………………………31
5.2小组协同情况…………………………………………………………31
5.3文献、帮助文档与库函数手册使用情况……………………………31
5.4总结与致谢…………………………………………………………32
参考文献……………………………………………………………………32
附录1原理图
附录2源程序
1温度控制的功能规划与方案设计
1.1温度控制的安全与环境约束条件
在人们的日常生活、工业制造、制冷等领域,温度作为当前环境的重要因素之一,被人们广泛的作为参考因素来使用,从而保证各项工作的正常运行,如火灾报警、温室或粮仓中温度的实时监测、冷库温度的调节等,因此以温度参数为基础而设计的温度控制系统被广泛开发和使用。
使用传统意义上的温度计采集温度信息,不但采集精度低,实时性差,而且操作人员的劳动强度高,不利于广泛的推广。
此外由于环境因素导致的数据难以采集的问题,特别是在工厂,火灾等的现场,工作人员不能长时间停留在现场观察和采集温度,就需要实现能够将数据采集并将其传送到一个地方集中进行处理,以节省人力,提高效率,但这样就会出现数据传输的问题,由于厂房大、需要传输数据多,使用传统方法容易造成资源浪费而且可操作性差,精度不高,这都在不同程度上限制了工作的进行和展开。
因此,高精度,低成本,实时性好的温度控制系统亟待人们去开发。
1.2功能规划
该控制系统实现温度的定值闭环控制,具有如下基本功能:
温度控制的设定范围为35~85℃;
静态误差≤0.4℃;
实时显示当前的温度值;
能设置和保存有关的控制参数;
命令按键4个:
复位键,模式切换键,参数值加1键,参数值减1键。
1.3硬件总体方案优选与设计
温度控制系统的硬件由主机电路、前向测温通道、后向测温通道、人机接口电路、通信接口及供电电源几部分组成。
在进行硬件总体方案设计时既要考虑技术指标,同时还要兼顾经济指标,满足成本要求。
最后,还要选用市场上敞开供应的元器件和材料,方便以后的生产和维护。
前向测温通道(NTC)
主机电路
F103VCT6
后向控温通道(PWM)
人机接口
LED数码管、按键
电源
USB供电
通信接口(选配)
1.4软件总体方案优选与设计
系统初始化
按键输入
工作模式选择
显示更新
实时温度数据采集
实时PID控制决策
实时PWM控制输出
其它实时任务如:
s数码管扫描等
本系统的软件任务比较简单,不需要嵌入式操作系统,主要包括温度数据采集程序、PID控制算法程序、温度控制输出程序、人机服务程序几部分。
为保证实时性的要求,代码具有良好的可读性和可维护性,采用C语言按结构化程序进行编码。
a)主程序流程图b)定时中断程序流程图
2硬件电路优选与设计
2.1CPU时钟与复位电路
CPU时钟周期通常为节拍脉冲或T周期,它是处理操作的最基本的单位。
在为程序控制器中,时序信号比较简单,一般采用节拍电位——节拍脉冲二级体制。
就是说它只要一个节拍电位,在节拍电位又包含若干个节拍脉冲(时钟周期)。
节拍电位表示一个CPU周期的时间,而节拍脉冲把一个CPU周期划分为几个叫较小的时间间隔。
根据需要这些时间间隔可以相等,也可以不等。
指令周期是取出并执行一条指令的时间。
指令周期常常有若干个CPU周期,CPU周期也称为机器周期,由于CPU访问一次内存所花费的时间较长,因此通常用内存中读取一个指令字的最短时间来规定CPU周期。
这就是说,这就是说一条指令取出阶段(通常为取指)需要一个CPU周期时间。
而一个CPU周期时间又包含若干个时钟周期(通常为节拍脉冲或T周期,它是处理操作的最基本的单位)。
这些时钟周期的总和则规定了一个CPU周期的时间宽度。
复位电路是一种用来使电路恢复到起始状态的电路设备,它的操作原理与计算器有着异曲同工之妙,只是启动原理和手段有所不同。
2.2显示电路优选与设计
开发板配有一个4位的共阴极的数码管,电路如图所示。
PE0~PE7接数码管a~dp段,PB10~PB13接4个位,R54~R66是段的上拉电阻,R71~R74是位的限流保护电阻。
数码管有两种显示方式分静态显示、动态显示。
2.2.1静态显示原理
静态驱动也称直流驱动。
静态驱动是值每个数码管的每一个段码都有一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器进行驱动。
静态驱动的有点是编程简单,显示亮度高,缺点是占用I/O端口多,如5个数码管静态显示则需要5*8=40跟I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个。
实际应用时必须增加译码驱动器,这样增加了硬件电路的复杂性。
2.2.2动态显示原理
点亮数码管采用动态扫描,即把所有数码管的8段按顺序并联在一起
成为一组段选口接到控制器,利用公共端使每个数码管依次被点亮,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
显示器的亮度既与导通电流有关,也与点亮时间和间隔时间的比例有关。
调整电流和时间参数,课实现亮度较稳定的显示。
动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
若数码管数目不大于8位,则控制显示器公共集电极只需8位口(称为位选口),控制各位显示器所显示的字形也需要一个8位口(成为段选口)。
采用动态显示由于数码管点亮次序有位选口控制,段选口被并联成为8根线,节约了线缆的数量。
2.3按键接口电路优选与设计
开发板配有一个复位按键,四个独立按键及四个用户指示灯,具体电路如图3.8所示。
其中,PC13指示灯是低电平亮,其它指示灯是高电平亮。
LD1指示灯连接PA5,当PA5配置为DAC输出时,可通过LD1的亮度可大概指示DAC的电平。
4个独立按键为低电平有效,均可作普通输入或中断输入。
另有一个独立的系统复位按键KRS1,当按下复位按键时,整个系统复位,程序重新运行。
2.3.1单次按键
单次按键除了要加消抖函数以外还需要判断按键是否已弹起,必须在按键已经弹起的状态下才能进行下次按键,一次按键只执行一次按键需要执行的程序。
为判断按键是否已松开需要增加上次按键标志位。
按键松开则标志位轻灵,按键未松开则标志位置1。
若上次按键未松开标志为1也即上次按键为松开,即使一直按下也不执行按键要执行的程序。
由于有延时去抖动函数,单次按键的扫描函数应放在主函数里面执行。
2.3.2连续按键
连续按键要求按键一直按下,同时按键要执行的程序以一定的时间间隔运行,因此连续按键扫描程序应放在定时中断里,利用定时中断来产生时间间隔,若放在主函数里则时间间隔不易控制且影响其他标志位的判断或程序的执行。
2.4温度检测电路优选与设计
温控模块含2个温度传感元件:
18B20单总线温度传感器及NTC热敏电阻。
NTC1电阻的阻值会随温度的变化而变化,PC5为NTC温度传感检测端口。
R55为加热电阻,当PB15为高电平时,加热电阻电路导通,电阻加热。
在做温度模块实验时,应尽量将温度传感器与加热电阻相贴近,以检测比较准确的加热环境温度。
2.5加热电路优选与设计
PWM(PulseWidthModulation),即脉冲宽度调制,简称脉宽调制。
它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,具有控制简单、灵活和动态响应好等有点。
采用PWM输出可以替代传统的DA输出连续控制量,另一方面能产生较大的输出功率替代传统的功率放大电路。
因此PWM技术成为电力电子技术最广泛应用的控制方式,其应用领域包括测量、通信、功率控制与变换,电控及控制、伺服控制、调光、调温、开关电源,甚至某些音频放大器。
*2.6参数保存电路优先与设计(选做)
EEPROM(ElectricallyErasableProgrammableRead-OnlyMemory),点可擦可编程只读储存器,是一种掉电后数据不丢失的储存芯片。
EEPROM的电路结果经历了一个发展过程,目前大多采用FLOTOX(FloatingTunnelOxide)结构。
这种结构的基本储存单元是一个特殊的MOS管,如图1所示。
它的储存原理是:
浮置栅乡下凸出一块,使得浮置栅与漏区之间的隧道氧化层面积很小、厚度很薄。
它的编程原理是让浮置栅上带电荷。
具体实现是在控制栅加高电位,此时漏端的电子将借助Fowler-Nordheim隧道效应穿过薄氧化层而进入浮置栅。
它的擦除原理是在控制栅加低电位,储存在浮置栅中的电子被抽出,于是又恢复到初始状态。
3软件设计及其实现优化
3.1控制程序的结构及模块化设计
//CheckedbyCassy2015
#include"SMG_Display.h"
#include"key.h"
#include"NTC.h"
#include"pid.h"
#include"pwm.h"
#include"usart.h"
#include"delay.h"
#include"24C02.h"
u8key,key2,key3,key4;
externfloatt;
externunsignedintdat,max,min,mid,da,j;
externunsignedcharflag;
externu32P;//比例放大系数参数2
externu32I;//积分时间1/Ti参数3
externu32D;//微分时间常数TD参数4
externu32temp;//设定温度参数0
externu32REAL;//实际温度参数1
externunsignedcharpid_val_mid;//PID输出
intmain(void)
{
uart_init(115200);
GPIOLED_Configuration();
Tim_Configuration();
NVIC_init();
KEY_GPIO_config();
AD_init();
TIM1_PWM_Init(1000,71);
PWM_NVIC_init();
GPIOEEPROM_Configuration();
while
(1)
{
key=KEY1_SCAN();
if(key)
{
switch(key)
{
caseXSWD:
flag=0;
while
(1)
{
key2=KEY2_SCAN();
ntc();
REAL=da/10;
PIDcompute();//PID控制
printf("pid_val_mid=%d\r\n\r\n",pid_val_mid);
TIM_SetCompare3(TIM1,pid_val_mid);//输出PWM脉冲
SMGshow(da+1000);
if(key2)break;
}
break;
casePID_P:
flag=1;
P=eeprom_read_one
(1)+2000;
printf("P=%d",P);
SMGshow(P);
while
(1)
{
key4=KEY4_SCAN
(1);
key3=KEY3_SCAN
(1);
key2=KEY2_SCAN();
if(key4)
{
P--;
delay_ms(100);
SMGshow(P);
}
if(key3)
{
P++;delay_ms(100);
SMGshow(P);
}
if(key2)
{
P=P-2000;
eeprom_write_one(1,P);
break;
}
}
break;
casePID_I:
flag=1;
I=eeprom_read_one(3)+3000;
SMGshow(I);
while
(1)
{
key4=KEY4_SCAN
(1);
key3=KEY3_SCAN
(1);
key2=KEY2_SCAN();
if(key4)
{
I--;delay_ms(100);
SMGshow(I);
}
if(key3)
{
I++;delay_ms(100);
SMGshow(I);
}
if(key2)
{
I=I-3000;
eeprom_write_one(3,I);
break;
}
}
break;
casePID_D:
flag=1;
D=eeprom_read_one(5)+4000;
SMGshow(D);
while
(1)
{
key4=KEY4_SCAN
(1);
key3=KEY3_SCAN
(1);
key2=KEY2_SCAN();
if(key4)
{
D--;delay_ms(100);
SMGshow(D);
}
if(key3)
{
D++;delay_ms(100);
SMGshow(D);
}
if(key2)
{
D=D-4000;
eeprom_write_one(5,D);
break;
}
}
break;
caseSET:
flag=1;
temp=eeprom_read_one(7)+5000;
SMGshow(temp);
while
(1)
{
key4=KEY4_SCAN
(1);
key3=KEY3_SCAN
(1);
key2=KEY2_SCAN();
if(key4)
{
temp--;delay_ms(100);
SMGshow(temp);
}
if(key3)
{
temp++;delay_ms(100);
SMGshow(temp);
}
if(key2)
{
temp=temp-5000;
eeprom_write_one(7,temp);
break;
}
}
break;
}
}delay_ms(10);
}
}
3.2显示程序的实现与优化
#ifndef__SMG_
#define__SMG_
#include"led.h"
#include"key.h"
#include"delay.h"
#include"stm32f10x_tim.h"
voidGPIOLED_Configuration(void);
voidTim_Configuration(void);
voidNVIC_init(void);
voidSMGshow(u32ADResult);
#endif
#include"SMG_Display.h"
unsignedcharData_Buffer[4]={1,2,3,4};//显示缓冲位选
unsignedintDuan[19]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76,0x40,0};
externunsignedshortADResult;
unsignedcharBrushFlag=0;//更新数码管显示变量
unsignedcharflag=0;
voidGPIOLED_Configuration(void)//数码管IO初始化
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);
//LEDS
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13;//位码GPIO端口配置
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_Init(GPIOE,&GPIO_InitStructure);
}
voidTim_Configuration(void)//定时初始化
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//TIM1时钟使能
//时基单元配置
TIM_TimeBaseStructure.TIM_Period=5000;//5MS定时时间常数
TIM_TimeBaseStructure.TIM_Prescaler=71;//71+172M进行72分频即1M
TIM_TimeBaseStructure.TIM_ClockDivision=0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
TIM_InternalClockConfig(TIM1);//此句可屏蔽,默认选为内部时钟
TIM_ITConfig(TIM1,TIM_FLAG_Update,ENABLE);//使能定时更新中断
TIM_Cmd(TIM1,ENABLE);
}
voidNVIC_init(void)//定