处理算法
1、实验目的
1.掌握随机误差的数字滤波算法。
2.掌握查表法、线性插值法。
2、实验内容
利用K分度号热电偶进行温度
检测
工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训
,测温范围为0-1200ºC,室温25 ºC,现假设热电偶输出信号经信号放大100倍为0-5V信号,经单片机采集连续10次后存放在数组table[]中,其值为table[]={100,100,101,102,105,99,99,100,150,80 },要求完成标度变换后转换为电压值u1,利用对半查表法查K分度表并经计算获得相应的温度值,将温度值存入变量var中。
3、主要仪器设备
1.单片机实验板一块 2.导线若干 3.PC机一台(安装有Keil c51软件)
4、实验
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
4.1实验方案
本次
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
的任务是设计一个数字滤波算法,并将给定电压值进行滤波,然后再进行查表,计算出相应的温度值。
4.2硬件设计
该实验中的最小系统模块中包括CPU、复位电路和晶振,其最小系统原理图如图4.2所示。
图4.2 CPU时钟与复位电路图
4.3软件设计
根据功能将软件系统分为四部分,主程序、滤波部分、查表部分。
主函数流程图如图4.3。
图4.3主函数流程图
4.3.1滤波函数设计
该函数采用冒泡排序法将table数组里面的数据按从小到大的顺序进行排序,然后取中间8个数据进行求和,最后将其转换为
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
电压用于后面查表。其流程图如图4.3.1所示。
图4.3.1 滤波函数流程图
4.3.2查表函数设计
该函数用对半查表法进行数据查找。当要查找值不在表中,而是介于该表两个数据之间,该函数将采用插值法进行处理。其流程图如图4.3.2所示。
图4.3.2查表函数流程图
5、调试
在该次实验的调试过程中并没有遇到什么大的问题。最初在查表函数中发现min的值大于max的值。修改了中间值的计算
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
后,该问题得到了解决。
6、实验结果及分析
经过调试好后,该程序能够对table数组中的数据进行数字滤波,然后进行查表,查找对应的温度值。最终结果经检验,无大偏差。
7、参考文献
[1]汪德彪. MCS-51单片机原理及接口技术[M]. 北京电子工业出版社. 2004.
[2]张毅刚,彭喜元,董继成. 单片机原理及应用[M]. 重庆大学出版社. 2003.
附录一:硬件原理图
附录二:源程序代码
#include "reg51.h"
#include "math.h"
unsigned int code K_TAB[121]={ 0,397,798,1203,16114,2022,2436,2850,3266,3681,\
4095,4508,4919,5327,5733,6137,6539,6939,7338,7737,\ 8137,8537,8938,9341,9745,10151,10560,10969,11381,11793,\ 12207,12623,13039,13456,13874,14292,14712,15132,15552,15974,\ 16395,16818,17241,17664,18088,18513,18938,19363,19788,20214,\ 20640,21066,21493,21919,22346,22772,23198,23624,24050,24476,\ 24902,25327,25751,26176,26599,27022,27445,27867,28288,28709,\ 29128,29547,29965,30383,30799,31214,31629,32042,32455,32866,\ 33277,33686,34095,34502,34909,35314,35718,36121,36524,36925,\ 37325,38122,38519,38915,39310,39703,40096,40488,40897,41296,\ 41657,42045,42432,42817,43202,43585,43968,44349,44729,45108,\ 45486,45863,46238,46612,46985,47356,47726,48095,48462,48828}; /*0~1200°C范围的 K分度表,每隔10°C对应一个电压值*/
unsigned int table[10]={100,100,101,102,105,99,99,100,150,80};
unsigned int da=0,max=120,min=0,mid,temp,var;
int sum=0;
float u1;
void lbo(void)
{ int i,j;
for(i=0;i<9;i++)
for(j=i+1;j<10;j++)
{ if (table[i]>table[j])
{temp=table[i];
table[i]=table[j];
table[j]=temp;
} }
for(i=1;i<9;i++)
{ sum+=table[i]; }
u1=(float)sum/408;}
void ser2 (void) //查表子程序
{ unsigned int j;
da=(unsigned int)(u1*10000)+1000; //u1扩大10000倍
while(1)
{ mid=(max+min)/2; //中心元素位
if(K_TAB[mid]==da)
{ var=mid*10;
break; } //中心元素等于查表的元素,计算
if((max-min)==1) //线形插值计算
{j=(K_TAB[max]- K_TAB[min])/10; //表中相邻两值对应温度相
j=(da- K_TAB[min])/j;
var=10*min+j;
break;}
if(K_TAB[mid]>da) max=mid;
else min=mid; } }
void main()
{
lbo();
ser2();
}