利用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,希望各位大虾指点,谢谢! 方法没错,但是程序好像有问题,你自己多查查看 这个方法是可行的。但你怎么知道7135的振荡频率?我是用一个时钟输出,然后由另外一个时钟捕捉,很好用的。 何必费那个事呢?以前想这种办法是因为它便宜没办法的办法.现在还这么用就不值得了.现在高分辨率(16BIT甚至24BIT的,内部甚至还带放大器)高性能的ADC价格便宜的有很多型号可选,干吗还要费劲用这种片子呢?而且你不觉得它的块头太大了点么? 楼上能否推荐几种?但7135有它自己的优点,采用双积分电路能够抗干扰,体积是够大的了。另外精度也是一般片子达不到的。可以看一下参数。
请楼上推荐几个高分辨率的片子,以后要用到的。 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;
} 这个频率好象有点高吧?另外你的时钟频率要和硬件配起来才行,否则会发现数据到一个数后就不再动了(积分饱和了)我用的是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;//这样在每次采样完成均会通知主程序进行一次检测判断
}
}
}
这里是真正的中断部分,这里会每次完成采样后通知主程序一次,由主程序来处理数据。 我推荐一个16位AD,ADS1100!只有6个引脚。 价格呢?精度能够达到多少?基准电源是多少的?外置还是内置?要不帮忙发个手册链接吧。这估计是个串行的AD转换器。 先谢谢ssyniuej,我再好好看看 250KHz时钟频率是想兼顾它的精度,每秒转换6次左右,ssyniuej你的注释已经很详细了,但是小弟还是有点不明白,希望能得到你的指点,
adtmp = ICR1 + 10001; 上升沿被捕捉到时,为什么还要+10001,而不是-10001呢?
setbadchg;//这样在每次采样完成均会通知主程序进行一次检测判断?不是很清楚
还有BUSY连接到ICP1脚的吧? 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里面了? mark 测量一些内阻很高的微弱信号还是用积分式AD好!如测量管道电位等 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: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]