3422|4

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

AD转换 [复制链接]

请问专家:
我以前用的是12位AD转换器MAX187,现在用的是16位的MAX1162,不知怎么转换的数据不对,变小了好多?
以前的MAX187自带基准电压,这次我用的是外基准电压MAX6241,和以前的一样4.096v
#include
#include
#include

#define uchar unsigned char
#define uint unsigned int

sbit Sclk = P0^1;
sbit CS = P0^0;
sbit Dout = P0^2;
sbit ControlA = P1^0;
sbit ControlB = P1^1;
#define TimeDelay 2000
//程序所用变量声明
uchar Time0Count;
uchar Time0Count;

uchar Uart0DataNum;
uchar Uart0Data[5];

uint ADout;

//程序所用函数声明
void McuInitial(void);
void InitialTime0(void);
void IntialSerialComm(void);
void SerialSend(uchar SendData);
void delay(uint n);
void Max1162(void);
void ADAverage(void);
void ADResult(void);
void OutControl(void);
bit FlagComm;
//主函数//
void main(void)
{
        uint i;
        McuInitial();
        for(i=0;i<20;i++)
        delay(0xff);
        for(i=0;i<8;i++)
        SerialSend('A');
        while(1)
        {
                        ADResult();
                        SerialSend(0xaa);
                        SerialSend(ADout/256);
                        SerialSend(ADout%256);
                        SerialSend(0xbb);
                        Time0Count = 0;
                if(FlagComm==1)
                {
                        FlagComm = 0;
                        OutControl();
                        FlagComm = 0;
                }
        }
}
//单片机初始化处理//
void McuInitial(void)
{
        IntialSerialComm();//串行中断初始化,占用定时器1,如果用串行中断,定时器1不能用于定时
        EA = 1;//打开中断
        ControlA = 0;
        ControlB = 0;
}
//定时器1初始化//
void InitialTime0 (void)
{
        TMOD |= 0x01;//16位定时器
        TH0 = 0x06;//8ms
        TL0 = 0xed;
        ET0 = 1;//使能中断
        TR0 = 0;//打开定时器
}
//串行中断初始化//
void IntialSerialComm(void)
{
        PCON = 0x00;//串口中断初始化,SMOD=0
        TMOD = 0x20;
        SCON=0x50;//允许接收
        TH1=0xfd;//fd
        TL1=0xfd;//fd
        TR1=1;
        ES=1;
}
//定时器0中断服务子程序//
void InterruptTime0(void) interrupt 1
{
        TH0 = 0x06;//8ms
        TL0 = 0xed;
        Time0Count++;
}
//串行接收中断服务子程序//
void InterruptSerialComm(void) interrupt 4
{
        if(RI)
        {
                RI = 0;
                Uart0Data[Uart0DataNum] = SBUF;
                Uart0DataNum++;
                if(Uart0DataNum>4)
                {
                        ES = 0;
                        FlagComm = 1;
                        Uart0DataNum = 0;
                }
        }
}
//串行发送程序//
void SerialSend(uchar SendData)
{
        SBUF = SendData;
        while(TI==0);
        TI = 0;
}
//延时//
void delay(uint n)
{
        while(n!=0)
        {
                n--;
        }
}
void Max1162(void)
{
        uchar i;
        uchar TempUp,TempDown;
        CS = 1;
        TempUp = 0;
        TempDown = 0;
        CS = 0;
        for(i=0;i<8;i++)    用MAX187的时候是i<4
        {
                TempUp = TempUp << 1;
                Sclk = 1;
                delay(1);
                Sclk = 0;
                if(Dout)
                        TempUp = TempUp + 1;
        }
        for(i=0;i<8;i++)
        {
                TempDown = TempDown << 1;
                Sclk = 1;
                delay(1);
                Sclk = 0;
                if(Dout)
                        TempDown = TempDown + 1;
        }
        CS = 1;
        ADout = TempUp;
        ADout = ADout << 8;
        ADout += TempDown;
}
//数据处理:以MAX1162采样转换发送T转换周期=25μs计算,每隔一T转换周期采一次数据,
//连续采集5次,共用时(25+25)*5=250μs,即0.25ms,组成一个采集周期T采集,
//求这5次的数据的平均得平均值Y1(注意:在此过程中如有某一数据与其它数据相差较大,即删除不用。)
//每隔250个T采集的周期即62.5ms后,再采集一组数据得平均值Y2,在1000个T采集的周期内,共得四个数据Y1、Y2、Y3、Y4,
//取平均值Y,将此值Y 送上位机。完成了1秒送上位机4个数据的任务。此过程不断循环。
void ADAverage(void)
{
        uchar i;
        uint TempOut[5];
        for(i=0;i<5;i++)
        {
                Max1162();
                TempOut = ADout;
        }
        for(i=0;i<5;i++)
        {
                ADout = ADout + TempOut;
        }

        ADout = ADout / 5;
}
void ADResult(void)
{
        uchar i;
        uint TempOut[5];
        for(i=0;i<5;i++)
        {
                ADAverage();
                TempOut = ADout;
        }
        for(i=0;i<5;i++)
        {
                ADout = ADout + TempOut;
        }

        ADout = ADout / 5;
}
//P1口输出控制,受命于串口命令//
void OutControl(void)
{
        uchar i;
        if(Uart0Data[3] == 0x11)
                ControlA = !ControlA;
        if(Uart0Data[3] == 0x12)
                ControlB = !ControlB;
        if(Uart0Data[3] == 0x13)
                McuInitial();
        for(i=0;i<5;i++)
        {
                Uart0Data = 0;
        }
        ES = 1;
        RI = 0;//此处一定要清0
}

最新回复

估计是你数据读取处理有问题 请认真查看转换芯片的资料  详情 回复 发表于 2007-12-28 11:22
点赞 关注

回复
举报

66

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你没有做让器件确定完成转换的处理....

也许是没有做完,你就取值了

还有一个,确认一下转换值的放置次序....

 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
声明一下,我用十二位的MAX187是正常的。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
指出一下,如果是完全兼容的片子,是不会出这个问题的

收低到高的变化的差异主要就是:

转换时间...

 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

5
 
估计是你数据读取处理有问题
请认真查看转换芯片的资料
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表