[讨论] 关于ICL7135A/D转换器串行接口的最优化设计

xu__changhua   2009-10-14 22:16 楼主
ICL7135AD转换器除了可以并行输出万、千、百、十、个位上的BCD码这种形式外,还可以利用BUSY和CLK的相与功能进行串行数据输出,以便方便使用单片机进行数据的串行接收。
其最优化接口电路如图所示,注意要用52系列的单片机,因为52单片机其内部的定时器T2有自动输出任意方波的功能,从百来HZ到几兆HZ,从P1.0输出的。
1.bmp

图中,左边的不加分析,仅分析与单片机接口的两根线,一个是CLK,另一个是BUSY,最基本AD转换功能就只需要这两根线与单片机接口。
其工作原理是:
通过对单片机的T2编程,从P1.0会自动输出125KHz的方波,供ICL7135AD转换时钟用。
同时这个时钟还提供给单片机的T0引脚,只要让单片机T0处于计数状态,并通过ICL7135的BUSY引脚的高低电平接到单片机的INT0引脚以决定T0是否允许计数,那就要将单片机的定时器T0工作方式定义为GATE=1,C/T=1,方式1.

编程要点:
1:
T2方波发生器的编程
T2要想自动输出方波,则要令T2CON.1=1,T2MOD.1=1,TR2=1即可,其频率为
fclk=fosc/{4[65536-(RCAP2H*256+RCAP2L)]}

2:
T0工作方式
GATE=1
C/T=1
M1M0=01

3:
BUSY脚接到单片机的INT0端有两个作用,乃一箭双雕之功效,只要GATE=1,则可实现一方面让T0有选择的计数,即需要计数的才计数,不需要计数的就不计数,因为GATE=1,就相当于INT0(即BUSY)和T0(即CLK)相与了。而另一方面,当BUSY由高到低变化时,除了可停止计数外,还可立即引起外部中断,在此外部中断中,先将计数结果TH0TL0取出,再将计数值TH0TL0清零,并置一个AD转换结束标志后退出该外部中断。

4:
进入到主程序判断转换结束标志,如果有标志就可以慢慢计算刚刚计数得到的数值,再清除这个转换结束标志,对应的电压为计数值-10001,该数据可用于数据处理或控制。

125KHz的频率,可每秒转换3-5次,与转换电压的大小有关。

这个设计达到了ICL7135与单片机最优化接口设计

[ 本帖最后由 xu__changhua 于 2009-10-15 00:37 编辑 ]

回复评论 (14)

当将一些辅助引脚接到单片机上时,可以实现其辅助功能
RUN/H脚
目前图中是接电源的,课实现自动连续转换。如果要切换AD转换源,就要接到单片机的一个口上,由这个口控制输出一个高电平脉冲开始进行一次AD转换。

POL、UN、OVER三个引脚也都可以接单片机的口,分别可以判定输入信号的极性、欠量程、超量程
点赞  2009-10-14 22:38
非常好的资料,最近正在做7135的A/D转换,看了你的文章受益很多,我用的是51的片子,没有T2自动产生125KHZ的频率,采用的是外部分频器1/4分频ALE端做的,在A/D采集上也是用的串行采集,再次感谢下楼主.
每天进步一点点...
点赞  2009-10-15 08:26
前文中的第四点有错,应将计数值-10001改为计数值-20001
4:
进入到主程序判断转换结束标志,如果有标志就可以慢慢计算刚刚计数得到的数值,再清除这个转换结束标志,对应的电压为计数值-10001,该数据可用于数据处理或控制。
点赞  2009-10-15 19:45
我想问下,第3点中:当BUSY由高到低变化时,除了可停止计数外,还可立即引起外部中断
外部中断是自动引起的吗?不是要等计数溢出才会中断申请吗?
我中断学的不好,见笑了,能帮我解答下吗?我也想试试你的这种做法,做一次7135的A/D转换.
每天进步一点点...
点赞  2009-10-16 13:54
引用: 原帖由 zq1030 于 2009-10-16 13:54 发表
我想问下,第3点中:当BUSY由高到低变化时,除了可停止计数外,还可立即引起外部中断
外部中断是自动引起的吗?不是要等计数溢出才会中断申请吗?
我中断学的不好,见笑了,能帮我解答下吗?我也想试试你的这种做法,做一次 ...


Q:我想问下,第3点中:当BUSY由高到低变化时,除了可停止计数外,还可立即引起中断
A:只要在初始化中设置过EX0=1,IT0=1,EA=1就会立即引起外部中断

Q:外部中断是自动引起的吗?不是要等计数溢出才会中断申请吗?
A:在这个特定应用中,TH0TL0是从0开始计数的,BUSY的高电平允许T0计数的脉冲个数(最大40001)不足以达到或超过65536,只要T0设置为方式1,则T0不会溢出,完全由BUSY决定引起中断的时刻。
祝你成功
点赞  2009-10-16 15:34
我走进一死胡同了,呵呵,我明白你的话的意思了,GATE=1,BUSY脚接到单片机的INT0端,CLK连到T0,当BUSY(INT0)为1&&CLK(T0)高电平1,结果为1,外部中断INT0末工作,此时T0是处在计数状态下,当BUSY置0后,再和CLK相与(&&)操作后,结果是0,外部中断INT0==0,启动了外部中断工作,然后在外部中断中把TH,TL计数值提取出来,并清零,当BUSY再次置1,定时器T0重新工作,如此循环.很巧妙的应用,不知道我理解还有错误之处否,谢谢指点.

[ 本帖最后由 zq1030 于 2009-10-16 17:37 编辑 ]
每天进步一点点...
点赞  2009-10-16 17:34
引用: 原帖由 zq1030 于 2009-10-16 17:34 发表
我走进一死胡同了,呵呵,我明白你的话的意思了,GATE=1,BUSY脚接到单片机的INT0端,CLK连到T0,当BUSY(INT0)为1&&CLK(T0)高电平1,结果为1,外部中断INT0末工作,此时T0是处在计数状态下,当BUSY置0后,再和CLK相与(&&)操作后 ...


你理解的好像是对的,在&&的地方描述的还不是很清楚。
我又查了下资料,减10001是对的,凡前面我写的减20001的地方都是错误的。特此更正。
1.bmp

[ 本帖最后由 xu__changhua 于 2009-10-17 09:37 编辑 ]
点赞  2009-10-17 09:13
T2要想自动输出方波,则要令T2CON.1=1,T2MOD.1=1,TR2=1即可,其频率为
fclk=fosc/{4[65536-(RCAP2H*256+RCAP2L)]}

编程时:
T2CON=1;
T2MOD=1;
TR2=1;
是这么操作吗?编译器怎么提示TMOD2错误?(我用的是keil C)
每天进步一点点...
点赞  2010-2-24 20:16
引用: 原帖由 zq1030 于 2010-2-24 20:16 发表
T2要想自动输出方波,则要令T2CON.1=1,T2MOD.1=1,TR2=1即可,其频率为
fclk=fosc/{4[65536-(RCAP2H*256+RCAP2L)]}

编程时:
T2CON=1;
T2MOD=1;
TR2=1;
是这么操作吗?编译器怎么提示TMOD2错误?(我用的是keil C ...


==================================
1:
Keil对51汇编语言的T2的支持比较麻烦,需要在程序开头用EQU语句对T2寄存器和T2的位寄存器通通定义一下。
2:
语句
T2CON=1;
T2MOD=1;
TR2=1;
要修改为
T2CON.1=1;
T2MOD.1=1;
TR2=1;
才行
3:
如果对keil如何修改定时器2的T2相关reg52.h不太熟,那下载一个wave6000编译,不需要对T2重新定义
点赞  2010-2-25 13:25
上一楼层又发现有错,改为T2CON.1=0;

完整的程序如下,实测通过
在REG52.H中增加一行:
sfr T2MOD  = 0xc9;

#include "reg52.h"
main()
{
   RCAP2H=0xff;
   RCAP2L=0Xf5;
   T2MOD=0x02;
   C_T2=0;
   TR2=1;
   while(1);
}

产生的频率,按照附图所示公式进行。
  • 未命名.JPG
点赞  2012-9-11 19:25
谢谢楼主的分享,看了你的帖子,搞定了ICL7135.
点赞  2013-2-10 12:27
非常不错的思路
点赞  2013-2-11 10:48
不错的资料,谢谢提供!
点赞  2013-3-15 23:02
感谢楼主无私分享,顶
点赞  2015-7-24 20:23
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复