计算机测量与控制系统(学时数:54)
参考教材:
【1】 陈涛,单片机应用及C51程序设计,机械工业出版社,2008.
【2】 徐爱钧,智能化测量控制仪表原理与设计(第二版),北京航空航天大学出版社,
2004。
【3】 马忠梅,单片机的C语言应用程序设计(3/4版),北航版,2003/2007。 【4】 李刚、林凌,现代测控电路,高等教育出版社,2004。
【5】 韩九强、等,现代测控技术与系统,清华大学出版社,2007。
课程介绍:本课程是在本科阶段学习了有关基础课程与专业课程的基础上,进一步了解和掌握计算机测量与控制系统的硬件与软件设计方法与过程,并通过实例分析与实际应用系统的设计制作掌握基本的设计、调试与操作技能。 学习的重点有三个方面:第一,深入理解与掌握一种以上的单片机体系结构与基本应用技巧(目前以MCS-51兼容机为主),单片机的C语言程序设计、编程与调试方法。第二,使用计算机实现基本物理量的测量(例如,基本电物理量测量、温度测量)。第三,使用计算机实现基本物理量的控制(温度控制)。
主要内容与安排(18周*3课时):
1.绪论,本课程的安排等一般性介绍
2. 智能化测控系统中的MCU/MPU,新型MCS-51兼容单片机;电量计算软件设计。 3. 集成开发环境IDE/Keil uVision2/C51编译器;电量计算软件设计。 4. 实验板硬件与功能介绍/安装与使用/入门程序 5. 数字时钟程序设计与调试 6. 同上
7. 参数与操作面板 8. 参数设置程序设计 9. 机动安排
10.温度测量/数字温度传感器DS18B20 11. 温度测量程序设计 12. 温度控制及其算法 13. 温度控制程序设计 14. 同上
15. 超声波测距的原理与实现
16. 超声波测距(分体式)程序设计 17. 同上 18. 机动安排
课程设计题目及要求: 1. 电量计算程序设计
编写一个计算交流电有效值、功率与功率因数的程序。假设已经得到了电流与电压的采样数据(10位A/D转换),零点对应采样值为512。
先按照有效值的定义编写程序,然后进行标定。标定采用峰-峰值为256的交流信号数据,对应的电流为10安培,电压为100伏特。再用直流信号的数据进行验证。
进一步对电流与电压信号进行谐波分析,编写FFT程序,并用标准采样数据对结果进行
验证。
2. 数字时钟系统设计
在给定的硬件系统上实现基本的数字时钟功能(含时间设定功能)。 3. 参数设置程序设计
设计一个参数设置功能的程序。参数号为0-9,每个参数的缺省参数值、上限与下限均由表格给定,2位数值显示。
发挥部分:参数号为0-99,4位数值显示,进一步实现参数的快速设定与15秒自动退出功能。 4.超声波测距系统设计
针对给定的超声波测距硬件系统编写相应的软件,实现基本的测距功能。测量范围为10-200cm,动态显示结果。
发挥部分(1):进一步增加测量范围,提高测量精度。
(2):实现基于测距原理的超声波主动目标定位。 5.温度测量与控制系统
针对给定的硬件系统编写相应的软件,实现基本的温度测量与显示功能,测量精度为0.1度。在此基础上利用电阻加温进行温度控制。利用键盘操作实现温度的设定(30-100度)。 发挥部分(1):用不同的方法进行温度控制,并比较优缺点。
(2):在外界干扰下(小风扇吹风)能够尽快达到新的稳定点。
(3):开机进入参数设置,退出后进行温度控制。实现具有上下限幅、快速改变数值功能的参数设定(设定参数范围为0-800)。 设计报告要求:
(1) 任务可行性分析(所需要的功能如何实现)。 (2) 程序结构流程框图。
(3) C语言程序的关键程序段及说明。
(4) 总结(对自己工作的评价、改进与提高的设想等)。 (5) 源程序电子文档。
嵌入式系统设计过程与规范
一.以产品开发为目标的设计过程 1. 技术可行性分析与论证 2. 原理设计/总体规划
3. 各个独立组成部分的设计
4. 电路板设计/调试(一般需要经过多次反复才能完善) 5. 软件/硬件联合调试(也要经过若干次反复修改) 6. 出样机/产品试验(如果试验无法通过还要进行修改) 7. 技术文件汇总/移交生产部门
整个过程少则几个月,多则几年时间才能完成。 二.硬件开发技术规范 1. 安全性(一票否决) 2. 可靠性(产品试验)EMC
3. 实用性(标准功能/用户要求)
4. 标准化(企业标准、行业标准、国家标准与国际标准) 三.软件开发技术规范
1. 合理性(对于系统的各种资源如何充分合理地利用)
2. 实用性(标准功能/用户要求/市场导向) 3. 可靠性(评判标准) 4. 标准化(软件标准) 其中,合理利用系统资源需要有对于系统各种功能的全面了解与使用经验的积累。就CPU系统来说,系统的资源包括:运行时间、存储器、中断以及所具有的各种功能模块(定时器/计数器、串行接口SPI、并行接口PPI、通信接口、信号控制接口、A/D与D/A接口等)。 举例来说,一个超声波测量距离的程序设计,可以不使用任何其它资源,完全利用程序的查询功能实现。但是单片机本身已有的资源不用就明显是不合理的。一般来说,中断是计算机测控系统的重要资源,一个应用系统没有使用中断就不是一个好的程序(除非很简单的程序)。但是,过多地使用某一种资源肯定也是不合理的。例如,在单片机应用系统中使用了3个以上的中断就很难保证系统的可靠性。 软件设计的标准化也是非常重要的方面,特别是对于大型和复杂程序的设计。为了保证程序的维护性,必须遵循相应的设计规范和标准,包括流程框图和程序的注释。很多人并不重视这方面的工作,实际上会对以后的工作造成很大影响。流程框图的绘制应该是由粗到细,逐步细化,直到能够转化为程序(指令)。 四.典型实例
实际上软件流程框图中只有两个基本元素:过程与分支。其余的元素都是些辅助元素(如入口、出口、返回等)和组合元素(如循环、散转结构等)。
一个过程可以是一条语句(操作),也可以是多条语句直至一个很大的子程序。例如一个初始化过程,可以是:
x=0; //参数初始化
也可以是: TMOD=0x01; //定时器T0初始化 TL=0x00; //定时器T0计数初值 TH=0xcc;
还可以是: display(); //调用显示子程序 如此等等。
分支是由判断语句和相应的操作共同组成的,其结构如下: if(条件) 过程(操作)一; else 过程(操作)二;
有时语句中无else 过程(操作)二;这实际是简化的分支。
多个分支语句连续使用,就形成了散转。为了简化编程,使用switch语句,实际上最终的机器语言是一样的。各种循环语句最终也还是利用分支语句实现的。 以下是动态显示程序的框图和相应的C语言程序。 void display();
入口 {
TH0=0xee; //5mS
TL0=0x00; 重新设置初值
if(dpt<3) dpt++;
显示指针处理 else dpt=0; //动态显示计数器
P0 = tab[dpbuf[dpt]];
输出显示内容
if(dpt==0)
显示第0位 dpt = 0? { dp1 = dp2 = dp3 = 1;
dp0 = 0; }
if(dpt==1)
显示第1位 dpt = 1? { dp0 = dp2 = dp3 = 1; dp1 = 0;
}
if(dpt==2)
{ dp0 = dp1 = dp3 = 1; dp2 = 0; } else
{ dp0 = dp1 = dp2 = 1; dp3 = 0; } }
其中的入口与出口所对应的就是函数名与括号。
多重分支语句也可以用switch语句代替,使程序更为简洁: switch(dpt)
{ case 0: dp1 = dp2 = dp3 = 1; dp0=0; break;
case 1: dp0 = dp2 = dp3 = 1; dp1=0; break;
case 2: dp0 = dp1 = dp3 = 1; dp2=0; break;
case 3: dp0 = dp1 = dp2 = 1; dp3=0; }
dpt = 2? 显示第2位 显示第3位 出口 从事计算机开发的人需要有一定的悟性(基础反倒不是问题),更需要有“三心”:细心-- 一丝不苟;耐心-- 孜孜不倦;恒心-- 持之以恒(积累)。 有志者事竟成,大家共勉! 嵌入式系统设计——电量计算程序设计 一. 技术要求:利用单片机进行基本的电量计算(电流与电压的有效值、功率与功率因数,
进一步再深入进行谐波分析)。
二.功能实现:首先给出有关的公式如下:
11有效值计算:I??idt;V??vdt;
T0T0视在功率:S=I×V;
TT1有功功率:P??ivdt;
T0功率因数:??TP;注意一般情况下??cos?。 S然后对上面的公式进行离散化,得到离散化的计算公式。注意将所有的系数归并后再统一进行标定处理。 三.软件设计:
具体内容见参考程序流程框图。
四.程序调试:熟悉利用调试工具观察计算结果及排查软件错误的方法。
嵌入式系统设计——数字时钟设计(动态显示) 二. 技术要求:利用单片机实验箱实现数字时钟显示分:秒的数值。进一步利用键盘实现
时钟的设定功能(只使用4个建即可实现设定,即:设定/返回,分/秒切换,增量和减量。设定时相应的内容闪动显示)。 三. 功能实现与系统结构:利用单片机的定时器中断实现5毫秒的定时(动态显示处理),
再利用软件对5毫秒定时进行计数。计数值为TCT,满200时即为1秒,秒计数器SCT加1,同时TCT清零。满60秒则分计数器MCT加1,同时秒计数器清零。秒计数器改变同时刷新显示。 四. 硬件设计:见实验指导书电路图。 五. 软件设计:主程序初始化后即进入等待循环,所有时钟的处理均在定时器中断中完成。
动态显示频率为5*4=20毫秒(50Hz),这是比较合适的频率。每次定时中断需要更新显示位,因此需要设置一个显示位计数器(0-3)。
LED数码管显示需要使用字模查表的方法实现。先建立一个字模表: code uchar tab[]={0x18,… …};
定时器中断函数需要使用中断函数的说明,具体内容见教材108页。 void timer0(void) interrupt 1 //
具体程序可以参考教材中的例子(实验Y2与Y3)。 无设置功能的程序流程框图:
入口
开始
动态显示处理 时钟初始化 TCT+1 TCT>=200? 定时器初始化
SCT+1,TCT=0