lixq201 发表于 2007-4-25 19:19:37

利用ICL7135的BUSY怎样读取A/D转换结果?

busy”输出端(ICL7135的21脚)高电平的

宽度等于积分和反积分时间之和。ICL7135内部规定积分时间固

定为10001个时钟脉冲时间,反积分时间长度与被测电压的大小

成比例。如果利用单片机内部的计数器对ICL7135的时钟脉冲计

数,利用“busy”作为计数器门控信号,控制计数器只能在bus

y为高电平时计数,将这段busy高电平时间内计数器的内容减去

10001,其余数便等于被测电压的数值。



我是想用T3的输入捕获ICP3来计算时钟脉冲个数,但结果都是0,

ATMEL128 8M



#define BUSY          PINE&0x80

unsigned int SampleConvert(unsigned int Num0,char Bit)                  //采样转换函数

{

unsigned int Sample3,count,j;

unsigned inti,Sample1;

TCNT3H = 0x00;   //T3

TCNT3L = 0x00;

TCCR3B =0x00;

while(BUSY!=0);

while(BUSY==1)

{

TCCR3B = 0x43;

}

//while(ETIFR&(1<<ICF3)==1);

TCCR3B =0x00;

count=ICR3H*256+ICR3L-10001;

Num0=count;

   for (i=0 ; i<bit ; i++)//送LCD显示

    {

    LCD_Buff = CHR;

    Num0 = Num0/10;

    }

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

    {

      Lcd_Command(0xC0);   

      Lcd_Write(LCD_Buff);

      Lcd_Command(0xC1);   

      Lcd_Write(LCD_Buff);

      Lcd_Command(0xC2);   

      Lcd_Write(LCD_Buff);

      Lcd_Command(0xC3);

      Lcd_Write(LCD_Buff);

      Lcd_Command(0xC4);

      Lcd_Write(LCD_Buff);

    }



}



刚用7135,希望各位大虾指点,谢谢!

Tomcat 发表于 2007-4-26 01:31:41

方法没错,但是程序好像有问题,你自己多查查看

ssyniuej 发表于 2007-4-26 09:47:35

这个方法是可行的。但你怎么知道7135的振荡频率?我是用一个时钟输出,然后由另外一个时钟捕捉,很好用的。

yanwang 发表于 2007-4-26 13:34:43

何必费那个事呢?以前想这种办法是因为它便宜没办法的办法.现在还这么用就不值得了.现在高分辨率(16BIT甚至24BIT的,内部甚至还带放大器)高性能的ADC价格便宜的有很多型号可选,干吗还要费劲用这种片子呢?而且你不觉得它的块头太大了点么?

ssyniuej 发表于 2007-4-26 20:45:26

楼上能否推荐几种?但7135有它自己的优点,采用双积分电路能够抗干扰,体积是够大的了。另外精度也是一般片子达不到的。可以看一下参数。

请楼上推荐几个高分辨率的片子,以后要用到的。

lixq201 发表于 2007-4-27 22:41:01

7135有它很多他自己的优点,块头是大了点,可是性价比好啊,做一些便宜又有精度要求的东西很有好处,7135的时钟外部输入250KHz,ssyniuej ,后来我用捕获中断还是不行,请问能不能发一份你的程序给我参考,谢谢 邮箱scpd@163.com

void timer3_init(void)

{

TCCR3B = 0x00; //stop

TCCR3A = 0x00;

TCCR3B = 0x47; //start Timer

}

#pragma interrupt_handler timer3_capt_isr:26

void timer3_capt_isr(void)

{

if(BUSY)

{

rising_edge=ICR3;

TCCR3B=TCCR3B&0XBF;

}

else

{

falling_edge=ICR3;

TCCR3B=TCCR3B|0X40;

}

count=falling_edge-rising_edge-10001;

}

ssyniuej 发表于 2007-4-28 08:58:31

这个频率好象有点高吧?另外你的时钟频率要和硬件配起来才行,否则会发现数据到一个数后就不再动了(积分饱和了)我用的是M88,下面是我的程序,这个是已经实际使用的程序了。

        TCCR1A=0x00;

        TCCR1B=0x82;//8倍分频 125KHz,这里要配合下面的定时器2,要求两个的时钟要相同。

        TCNT1=0;

        ICR1=0;

        OCR1A=sysdata.cs.clock;

        OCR1B=0;

        TIFR1 = 0XFF;



        // Timer/Counter 2 initialization

        // Clock source: System Clock

        // Clock value: 1000.000 kHz

        // Mode: CTC top=OCR0A

        // OC2A output: Disconnected

        // OC2B output: Toggle on compare match

        ASSR=0x00;

        TCCR2A=0x12;//这个定时器做为外部ADC的时钟源

        TCCR2B=0x01;//采用了CTC工作方式,时钟不分频

        TCNT2=0x00;

        OCR2A=0x03;//实际分频为2×1×(1+3)=8,也就是说实际工作频率为125KHz

        OCR2B=0x00;//这样实际的数据每秒钟更新三次。

以上是相关的初始化部分。

SIGNAL(SIG_INPUT_CAPTURE1)

{

// Place your code here

//此处准备执行外部AD转换数据检测,在此处要进行数据处理并且要对捕捉的变化沿进行处理。

        int adval;

        static uint adtmp = 0;

//        char adtm = adtmfp;

        if(chkices1)

        {   //上升沿被捕捉到,此时是开始进行转换

                clrices1;

                adtmp = ICR1 + 10001;

        }      

        else

        {//下降沿被捕捉到,此时是转换结束。

                setices1;

                adtmp = ICR1 - adtmp;

//                if(adtmp > 20000)

//                {

//                        adtmp = 20000;

//                }

                adval = adtmp;

                if(!(testpol))

                {

                        adval = -adval;

                }

//                if(adbak != adval)

                {

                        adbak = adval;

                        setbadchg;//这样在每次采样完成均会通知主程序进行一次检测判断

                }

        }

}

这里是真正的中断部分,这里会每次完成采样后通知主程序一次,由主程序来处理数据。

hexenzhou 发表于 2007-4-28 10:37:15

我推荐一个16位AD,ADS1100!只有6个引脚。

ssyniuej 发表于 2007-4-28 13:36:52

价格呢?精度能够达到多少?基准电源是多少的?外置还是内置?要不帮忙发个手册链接吧。这估计是个串行的AD转换器。

lixq201 发表于 2007-4-28 18:50:54

先谢谢ssyniuej,我再好好看看

lixq201 发表于 2007-4-28 20:48:26

250KHz时钟频率是想兼顾它的精度,每秒转换6次左右,ssyniuej你的注释已经很详细了,但是小弟还是有点不明白,希望能得到你的指点,

adtmp = ICR1 + 10001; 上升沿被捕捉到时,为什么还要+10001,而不是-10001呢?



setbadchg;//这样在每次采样完成均会通知主程序进行一次检测判断?不是很清楚

还有BUSY连接到ICP1脚的吧?

mail_cj 发表于 2011-11-5 17:58:28

1. Auto-Zero Phase.
2. Signal Integrate Phase.
3. Deintegrate Phase.
4. Zero Integrator Phase. this phase requires 100 to 200
clock pulses. However, after an over-range conversion, 6200 pulses are required.

关键是上面的第4个

请教7135 AD一次所花费的周期数究竟是多少?文档上说是10001 + 10000 + 20001,但又说在量程内第四阶段100-200,如果超量程是6200个,所以如果把超量程情况考虑在内,是不是测一次最多的周期数是10001 + 10000 + 20001 +6200了?还是6200已经包括在20001里面了?

lihongfang 发表于 2011-11-23 17:13:51

mark

gaobao_1 发表于 2017-12-29 19:38:50

测量一些内阻很高的微弱信号还是用积分式AD好!如测量管道电位等

gaobao_1 发表于 2018-5-2 12:05:32

void int0() interrupt 0 using 1                  //中断读ICL7135计数值
{//unsigned char tmp;
   //RUN_HOLD =0;
   TR0=0;
/* adc=TH0;
   ADC_ICL7135=adc*256+TL0;       
   */
   ((unsigned char *)&ADC_ICL7135)=TL0;
   ((unsigned char *)&ADC_ICL7135)=TH0;
   TL0=0X00;
   TH0=0X00;
// RUN_HOLD =1;
adc_cbdv=(ADC_ICL7135-10001);    //转换BCD码
}
51写的作参考

gaobao_1 发表于 2018-5-2 12:06:55

本帖最后由 gaobao_1 于 2018-5-2 12:08 编辑

主要是电路要搭对,好多书上有,网上也有电路
voidinit(void)           //系统初始化
{//        CLK_DIV=0x01;    //时钟1/2分频 用lcm061a时用
    AUXR=0x40;//1T
        WAKE_CLKO=(WAKE_CLKO|0x02);//启动p1.1输出
        TMOD=0x2d;//        T1 8bit重装模式          T0为计数模式
        TL1=0XF4;       //0xf4=250khz
        TH1=0XF4;       //0XFA=500KHZ
        TR1=1;                        //启动T1
        TL0=0X00;
        TH0=0X00;
    EA=1;
    EX0=1;                  //
    IT0=1;             //下降沿触发
        TR0=1;
}
页: [1]
查看完整版本: 利用ICL7135的BUSY怎样读取A/D转换结果?