ADS8344数据老是跳,求助!!

[复制链接]
2555|13
 楼主| wjs02 发表于 2009-12-14 13:44 | 显示全部楼层 |阅读模式
哪位用过ADS8344的,能否帮我看下程序,数字量输出老是跳,不稳定。比如2V输入,满量程5V,结果波动会在26200~26000.
或者谁有代码可以给我参考下,万分感谢!!


#include "C8051F040.h"
#include "ABSACC.H"
#include <intrins.h>

  sbit ADC_CLK   =P0^2;//19
  sbit ADC_DOUT  =P0^3;//15
  sbit ADC_DIN   =P0^4;//17
  sbit ADC_CS0   =P0^5; //18
  sbit ADC_CS1   =P0^6;//18
  sbit ADC_BUSY0 =P0^7; //16
  sbit ADC_BUSY1 =P1^0;//16

unsigned char data AttData[3];

void Timer_Init()
{
    SFRPAGE   = TIMER01_PAGE;
    TMOD      = 0x22;
    TH1       = 0x4C;
    CKCON     = 0x12;
    TCON      = 0x44;
    TH0       = 0x9C;
     SFRPAGE   = TMR2_PAGE;
     TMR2CN    = 0x04;  

}

void UART_Init()
{
    SFRPAGE   = UART0_PAGE;
    SCON0     = 0x50;
    SCON0     &= 0xFC;
    SSTA0     = 0x10;
}

void EMI_Init()
{
    SFRPAGE   = EMI0_PAGE;
    EMI0CF    = 0x3B;
}

void Port_IO_Init()
{   SFRPAGE   = CONFIG_PAGE;
    P0MDOUT   = 0x76;
    P0=88;

P1MDOUT   = 0xFF;
    P4MDOUT   = 0xFF;
    P5MDOUT   = 0xFF;
    P6MDOUT   = 0xFF;
    P7MDOUT   = 0xFF;
    XBR0      = 0x04;
    XBR2      = 0x40;
}


void Oscillator_Init()
{
    int i = 0;
   SFRPAGE   = CONFIG_PAGE;
    OSCICN    = 0x80;
  CLKSEL    = 0x00;

}

void Interrupts_Init()
{
    IE        = 0xB2;
    IP        = 0xD2;
    EIE2      = 0x20;
}

void WatchDog_Init()
{
   WDTCN=0x47;
   WDTCN=0xDE;
   WDTCN=0xAD;
}

void Init_Device(void)
{
    WatchDog_Init();
    Timer_Init();
    UART_Init();
    EMI_Init();
    Port_IO_Init();
    Oscillator_Init();
    Interrupts_Init();
}


void ADC_Delay(void)
{
  int k=0;
  //for(k=0;k<5;k++);
    for(k=0;k<50;k++); //change by wb
}



//AD转换函数 chan:0-15



unsigned int ADC ( unsigned char chan)
{  
   unsigned int  ADdata=0;

unsigned char idata outcmd;

unsigned char code ChannelTable[8]={0,4,1,5,2,6,3,7};//转换表格

int i;
   ADC_DIN=0 ;
   //通道有效性检查

if(chan<0)

chan=0;

if(chan>15)

chan=15;

   //使能芯片

ADC_CLK=0;
     ADC_CS0=0;
     ADC_Delay();

   // 写命令
   outcmd=(ChannelTable[chan]<<4) | 0x86;  //内时钟模式。
   for(i=0;i<8;i++)           
   {
       ADC_CLK=0;
        ADC_Delay();


   if(outcmd&0x80)

   ADC_DIN=1;
       else ADC_DIN=0;
       outcmd=outcmd<<1;
       ADC_CLK=1;
       ADC_Delay();
    }

   
     ADC_CLK=0;


         ADC_CS0=1;


//等待转换结束
      if(chan<8)
        while(!ADC_BUSY0);
      else
       while(!ADC_BUSY1);


  //ADC_CLK=1;//by wb

       ADC_CS0=0;


   //ADC_Delay();


for(i=0;i<16;i++)

  { ADdata= ADdata<<1;




   ADC_CLK=1;//by wb


   ADC_Delay();//by wb


   ADC_CLK=0;//by wb


   ADC_Delay();//by wb


   if(ADC_DOUT)

ADdata|=0x0001;


   //ADC_Delay();

      }


for(i=0;i<8;i++)

  {




   ADC_CLK=1;//by wb


   ADC_Delay();//by wb


   ADC_CLK=0;//by wb


   ADC_Delay();//by wb


      }

    ADC_CS0=1;


    return ADdata ;

}

  void main()
{  
    unsigned int j=0;

int k;
    Init_Device();
    XBYTE[0xFF80]=0x00  ;     //55;


    j=ADC(0);



k=0;
}
thf2008 发表于 2009-12-15 00:17 | 显示全部楼层
你用的是什么片子?用的是SPI通讯吧,我现在也一直在做ADS8344的通讯,有时间可以交流一下,我的QQ是87478377
linhai2009 发表于 2009-12-15 00:32 | 显示全部楼层
没看懂:dizzy:
thf2008 发表于 2009-12-16 16:28 | 显示全部楼层
怎么没人回答?很想了解这个芯片
五谷道场 发表于 2009-12-16 18:19 | 显示全部楼层
这么长的码……
linhai2009 发表于 2009-12-16 23:56 | 显示全部楼层
还行,好像是51的码,不过没用过ADS8344也帮不上忙
thf2008 发表于 2009-12-18 00:22 | 显示全部楼层
今天想了想,会不会是你的参考电源不稳定造成的啊
linhai2009 发表于 2009-12-18 00:51 | 显示全部楼层
很有可能
 楼主| wjs02 发表于 2009-12-19 10:23 | 显示全部楼层
硬件方面的问题都考虑过了
hulan1985 发表于 2009-12-19 22:16 | 显示全部楼层
那就不是很明白了……
五谷道场 发表于 2009-12-20 23:07 | 显示全部楼层
这个……帮顶……
xiaoxin1986 发表于 2009-12-21 12:27 | 显示全部楼层
同问,过来学习
NICKY99 发表于 2009-12-29 16:15 | 显示全部楼层
时序的精确度影响的吧
linhai2009 发表于 2009-12-29 21:49 | 显示全部楼层
13# NICKY99

什么意思?能详细的说说嘛?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部