lknmlo 发表于 2011-4-17 19:10

请问一下ADS7841E要怎么使用?

我最近正照着找来的电路尝试做一个数控电源。电路图的大部分都看懂了,有一部分是ADS7841E和mega16连接。ADS7841E的手册我也大概看明白了一些,但心中还是有几个疑惑:
    1.我知道ADS7841E在电路中的作用是测量电压和电流,只用了两个通道,控制它大概是向DIN脚写8位控制位,选择通道和模式什么的。但是在程序中药怎么实现呢?
    2.BUSY脚的作用是什么呢?
    3.要怎么知道它已经转换好了呢?DOUT输出的数据格式是什么样的,又该怎样读取呢?
    4.手册上说DCLK是外部时钟输入,这是什么意思呢?要怎么实现,是不是周期性的让单片机引脚置高置低呢?

小弟我在网上找了找寻了很久,但因小弟才疏学浅,对它还是不能很好的理解。所以还得拜托各位,请各位大侠帮帮忙了,非常感谢......:)

yicaiwu 发表于 2011-4-17 23:00

#define                EC_BUSY               
#define                EC_DCLK               
#define                EC_DOUT               
#define                EC_DIN               
#define                EC_RST               
#define                EC_SLEEP       
unsigned int readdata(unsigned char channel)
{
        unsigned int rcvdata;
        unsigned char i;
        send_cmd_data=((channel&0x07)<<4)|0x87;
        EC_CS=0;EC_DCLK=0;EC_DIN=0;
        delay(1);
        for(i=0;i<8;i++)
        {
                EC_DCLK=0;
                if((send_cmd_data&0x80)==0x80)
                {EC_DIN=1;}
                else{EC_DIN=0;}
                delay(1);
                EC_DCLK=1;
                delay(1);
                send_cmd_data=send_cmd_data<<1;
        }
        EC_DCLK=0;EC_DIN=0;
        delay(5);
        for(i=0;i<16;i++)
        {
                EC_DCLK=0;
                delay(1);       
                EC_DCLK=1;
                if(EC_DOUT==0x1)
                {rcvdata|=0x0001;}
                if(EC_DOUT==0x0)
                {rcvdata&=0xfffe;}
                rcvdata=rcvdata<<1;
                delay(1);
        }
        rcvdata=rcvdata>>4;
        EC_DCLK=0;EC_CS=1;
        return rcvdata;
}
unsigned int ad7841_read(unsigned char channel)
{
        int i;
        int ec_tmp;
        int tmp;
        for(i=0;i<9;i++)
        {
                ec_tmp=readdata(channel);
        }
        for(i=0;i<8;i++)
        {
                if(ec_tmp>ec_tmp)
                {tmp=ec_tmp;ec_tmp=ec_tmp;ec_tmp=tmp;}
                if(ec_tmp>ec_tmp&&i<7)
                {tmp=ec_tmp;ec_tmp=ec_tmp;ec_tmp=tmp;}
                if(ec_tmp>ec_tmp&&i<6)
                {tmp=ec_tmp;ec_tmp=ec_tmp;ec_tmp=tmp;}
                if(ec_tmp>ec_tmp&&i<5)
                {tmp=ec_tmp;ec_tmp=ec_tmp;ec_tmp=tmp;}
                if(ec_tmp>ec_tmp&&i<4)
                {tmp=ec_tmp;ec_tmp=ec_tmp;ec_tmp=tmp;}
                if(ec_tmp>ec_tmp&&i<3)
                {tmp=ec_tmp;ec_tmp=ec_tmp;ec_tmp=tmp;}
                if(ec_tmp>ec_tmp&&i<2)
                {tmp=ec_tmp;ec_tmp=ec_tmp;ec_tmp=tmp;}
                if(ec_tmp>ec_tmp&&i<1)
                {tmp=ec_tmp;ec_tmp=ec_tmp;ec_tmp=tmp;}
        }
        return ec_tmp;
}
楼主这是驱动程序 你自己把时序图拿出来对着看吧。可以用的

lknmlo 发表于 2011-4-18 12:26

真是太谢谢你了!:lol

754385743 发表于 2013-5-16 21:52

跪求ADS7841E使用手册

754385743 发表于 2013-5-16 21:53

急用!

sanzi666 发表于 2022-9-6 15:17

BUSY脚的作用程序里面没有写啊,
这个脚从时序图看,只有由高变低后,数据才是有效位开始,,,你程序里面不判断一下,就只延迟了一下,就开始读取,怕会出问题,
还有你后边的程序,是做什么的,
for(i=0;i<8;i++)
      {
                if(ec_tmp>ec_tmp)
                {tmp=ec_tmp;ec_tmp=ec_tmp;ec_tmp=tmp;}
                if(ec_tmp>ec_tmp&&i<7)
                {tmp=ec_tmp;ec_tmp=ec_tmp;ec_tmp=tmp;}
                if(ec_tmp>ec_tmp&&i<6)
                {tmp=ec_tmp;ec_tmp=ec_tmp;ec_tmp=tmp;}
                if(ec_tmp>ec_tmp&&i<5)
                {tmp=ec_tmp;ec_tmp=ec_tmp;ec_tmp=tmp;}
                if(ec_tmp>ec_tmp&&i<4)
                {tmp=ec_tmp;ec_tmp=ec_tmp;ec_tmp=tmp;}
                if(ec_tmp>ec_tmp&&i<3)
                {tmp=ec_tmp;ec_tmp=ec_tmp;ec_tmp=tmp;}
                if(ec_tmp>ec_tmp&&i<2)
                {tmp=ec_tmp;ec_tmp=ec_tmp;ec_tmp=tmp;}
                if(ec_tmp>ec_tmp&&i<1)
                {tmp=ec_tmp;ec_tmp=ec_tmp;ec_tmp=tmp;}
      }
      return ec_tmp;
页: [1]
查看完整版本: 请问一下ADS7841E要怎么使用?