ad采集加了滤波后,整个main.c函数运行不正常了?
2019-07-15 08:39发布
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
我是用adc0804采集压力传感器的压力,得到的电压值不稳定,会在0.492V和0.512V之间跳动,在ad部分加了滤波函数,加了后,整个main.c函数运行不正常了,好像ad没采集似的,一直显示如下界面,什么都不变化。传感器输出的电压,压力是电压换算得到的。
这是我ad.c部分
************************
#include<reg51.h>
#include<intrins.h>
#include<string.h>
#include "adc.h"
#include "display.h"
uchar recieve_volt;
extern uchar data date_tab[8];
extern uint PresValue;
/*******************************************************************/
/* */
/* 启动AD转换子程序 */
/*******************************************************************/
void start_ad(void)
{ cs=0; //允许进行A/D转换
wr=0;_nop_();wr=1; //WR由低变高时,AD开始转换
//while(intr); //查询转换结束产生INTR 信号(低电平有效)
cs=1; //停止AD转换
}
/*******************************************************************/
/* */
/* 读A/D数据子程序 */
/*******************************************************************/
unsigned int read_ad()
{ uint ad_data;
ad0_7=0xff;
cs=0; //允许读
rd=0; //读取转换数据结果数据结果
_nop_();
ad_data=ad0_7; //把数据存到ad_data中
rd=1;cs=1; //停止A/D读取
return(ad_data);
}
/*******************************************************************/
/* */
/*取平均值滤波函数 */
/*******************************************************************/
uchar ad_filter()
{
uchar i,U[10],min,max,R;
uint sum;
start_ad();
for(i=0,sum=0;i<10;i++) //测量十次,去除最大最小值后取平均值
{
U=read_ad(); sum+=U; //获取ad结果
}
for(i=1,min=U[0];i<=9;i++)
{
if(U<min) min=U; //求最小值
}
for(i=1,max=U[0];i<=9;i++)
{
if(U>max) max=U; //求最大值
}
R=(sum-min-max)/8;
return R; //返回计算结果
}
/*******************************************************************/
/* */
/*电压采集子程序 */
/*******************************************************************/
void Volt_collect()
{
uint Pressure;//采集的压力值变量
recieve_volt=ad_filter();
recieve_volt=recieve_volt*201; //5.15/256*10000=201
recieve_volt=recieve_volt+100; //ad精度只能是0.0201v,加0.01v误差校准是为了显示与实际相符
date_tab[0]=recieve_volt/10000; //整数
date_tab[1]=recieve_volt%10000/1000; // 十分位
date_tab[2]=recieve_volt%1000/100; // 百分位
date_tab[3]=recieve_volt%100/10; //千分位
//Pressure=1000*date_tab[0]+100*date_tab[1]+10*date_tab[2]+date_tab[3]-170;
//Pressure=Pressure/8.86/0.98;
Pressure=1000*date_tab[0]+100*date_tab[1]+10*date_tab[2]+date_tab[3]-220;
if(Pressure<0)
{
Pressure=0;
}
Pressure=Pressure/92.7/0.098;; //转换成cmH2O
PresValue =Pressure; //传给main文件的全局变量
date_tab[4] = Pressure/1000;
date_tab[5] = Pressure/100%10;
date_tab[6] = Pressure/10%10;
date_tab[7] = Pressure%10;
}
************************
一周热门 更多>