>
首 页文章中心单片机论坛电脑援救中心杀毒软件下载电子元件速查集成电路速查客户留言下载中心商品展示频道繁體中文
设为首页
加入收藏
联系我们
您当前的位置:中国单片机网 -> 称重技术 -> 文章内容 退出登录 用户管理
栏目导航
· 经典软件 · 单片机讲座
· 电源技术 · 称重技术
· 硬件与电路 · 资料下载
· 淘宝商品 · 轻松一刻
· 金华电大资讯 · 胡老师招生
· l
热门文章
· [图文] 本站承接单片..
· 金华广播电视大学(金..
· 关于金华广播电视大..
· 关于金华广播电视大..
· [组图] 三极管s8050管..
· [组图] 9014三极管管..
· [组图] 三极管9012引..
· [组图] 中央广播电视..
· [组图] 三极管9013管..
· [组图] 万用表的使用..
相关文章
· [组图] 一种廉价实用..
廉价实用的双积分A/D转换器
作者:本站  来源:本站整理  发布时间:2007-6-2 11:00:17  发布人:admin

减小字体 增大字体

  廉价实用的双积分A/D转换器

本站启示
1、本站www.chinadpj.com (中国单片机网),拥有设计开发生产的团队和条件,承接电子称、电子衡器设计、开发、生产等业务。欢迎联系、洽谈。
2、本站www.chinadpj.com (中国单片机网),欢迎衡器爱好者加入:中国电子称群:40052117。也欢迎大家承接分担部分和全部产品、电路、软件开发任务。 
  中国单片机网(www.chinadpj.com),联系方法:   QQ:281016595;    Email: chinadpj@126.com  ;   电话:0579-83282952 ;    联系人: 胡克俭 老师

    51系列单片机具有两个以上16位双通道定时器(TIME0和TIME1),每个通道可选择为输入捕获方式来测量脉宽。我们用片内16位的定时器外接运放、比较 廉价实用的双积分A/D转换器 技术分类: 模拟与无源器件 来源:仪表技术/作者:林浩顺 发表时间:2006-09-04
http://article.ednchina.com/2006-09/2006920453221.htm


  摘 要:介绍用51单片机和通用分立器件构成的双积分A/D转换器,文中给出了详细的源程序清单。
  关键词:双积分A/D转换器;单片机;定时器

1原理
  51系列单片机具有两个以上16位双通道定时器(TIME0和TIME1),每个通道可选择为输入捕获方式来测量脉宽。我们用片内16位的定时器外接运放、比较器实现双积分A/D转换。原理图如图1所示(电源和5l单片机外围电路同常规电路),TL082是JFETINPUT运放;LM358作为比较器;MC4066是多路开关。51单片机P1口的P10、P11、P12作为输出,控制MC4066多路开关的输入选择;INT0作为中断输入口,捕捉LM358比较器的输出电平跳变。C1为积分电容,常取0.22μF左右的聚丙烯电容,R2为积分电阻,可取500k左右,U2A为积分运放,U2A、C1、R2构成了积分器,U2B是过零检测运放。VIN为输入电压,VREF为基准电压,AGND为转换器的参考零点。VREF和参考零点以R9、R10、R11分压产生。
  测量前,TK3=1、TK2=0、TK1=0,打开U1C、U1D模拟开关,使积分器输入等于AGND,进入调零阶段,第一次启动转换的时间为300ms;启动以后调零时间为40ms。开始转换时,TK3=0、TK2=0、TK1=1,积分器输入接至输入电压,使VIN通过积分电阻R2向C1充电,设积分时间为T。然后,将TK3=0、TK2=1、TK1=0,即积分器输入接至基准电压VREF,电容C1开始通过R2向VREF逆向放电。当运放的输出低于C2电容电压时,比较器输出反转。然后,TK3=1、TK2=0、TK1=0,打开U1C、U1D模拟开关,又进入调零阶段。设逆向充电的时间为t,则有


上式中VIN是被测电压,T是正向积分时间,t是反向积分时间,VREF是基准参考电压,AGND是转换器的参考零点。积分器输出波形如图2所示。

 

 

2软件结构
  程序由初始化程序、输入捕捉中断服务程序、TIME0中断服务程序和调用该程序模块的接口程序组成。
  程序初始化时,置TK3=1、TK2=0、TK1=0,软件300ms延时,进行初始调零;进行正向积分时,关闭INT0,置TK3=0、TK2=0、TK1=1,开TIME0(设置TIME0工作在定时方式),进行定时正向积分;正向积分完毕,设置定时TIME0工作在输入捕获方式,打开INT0,置TK3=0、TK2=1、TK1=0,进行反向积分,TIME0进行计时,利用另一个寄存器来计数定时器溢出次数;当比较器输出反转、INT0中断产生时,单片机自动关断TIME0,完成一次双积分A/D转换。AD值(HEX)=寄存器计数值*100+TIME0。
  源程序清单如下:
  


 
 以下为txt文档:
   

;www.chinadpj.com(中国单片机网)整理

;sjf20070521,2007-5-21,双积分A/D转换软件(完整版)

; 已补上另一版本所欠的一段,

;T1:

;用16M晶振。该源程序包括:A/D初始化。TIME0.INT0中断服务程序

;以及如何调用A/D转换

;模块的主程序。

TK1 BIT P1.0

TK2 BIT P1.1

TK3 BIT P1.2

CHK BIT P3.2    ;INT0

ADC_H   EQU 03H ;AD值高8位

ADC_M   EQU 04H ;AD值中间8位

ADC_L   EQU 05H ;AD值低8位

T0COUNT EQU 10H ;AD转换TIME0次数

COUNT1  EQU 11H ;AD值存放单元1HIGH

COUNT2  EQU 12H ;AD值存放单元2middle

COUNT3  EQU 13H ;AD值存放单元3Low

ADLOWF  BIT FLAGO.O ;AD值下溢标志

ADOVERF BIT FLAGO.1 ;AD值上溢标志

GETADF  BIT FLAGO.2 ;AD值采样标志位

;T2

INT0SEVER:             ;输入捕捉中断服务

        CLR EX0 ;完成一次AD采集,停止外部中断

        PUSH    PSW ;特殊寄存器入堆栈

        PUSH    Acc

        PUSH    B

        PUSH    DPH

        PUSH    DPL

        CLR     TR0 ;关TIME0运行位

        CLR     ET0 ;关TIME0中断允许位

        MOV     COUNT3,TL0  ;保存TIME0值

        MOV     COUNT2,TH0 ;

;T3

    MOV TMOD,#11H   ;设TIME0为定时方式

    MOV     TLO,#00H    ;清TIME0

    MOV     THO,#00H

    CLR TK1             ;置调零,一次TIME0时间

    CLR     TK2

    SETB    TK3

    SETB    TR0             ;开TIME0运行位

    NOP

    CLR     ET0            ;关TIME0中断允许位

    SETB    GETADF         ;设置转换结束标志

    MOV     T0COUNT,#00H    ;清TIMEO计数寄存器

    POP     DPL             ;弹出特殊寄存器

    POP     DPH

    POP     B

    POP     Acc

    POP     PSW

    RETI

;T4

TIME0SEVER: 

    PUSH   PSW     ;TIME0中断服务

        PUSH   Acc                 ;特殊寄存器入堆栈

        PUSH   B

        PUSH   DPL

        PUSH   DPH

        MOV     A,T0COUNT       ;控制积分各阶段时间

        RL     A

        MOV     DPTR,#TAB0

        JMP    @A+DPTR 

TAB0:   AJMP    TIME01      ;不同时间阶段跳转表

        AJMP    TIME02

        AJMP    TIME03

        AJMP    TIME04

        AJMP    TIME05

        AJMP    TIME06

   ;T5

TIME01: INC T0COUNT     ;第一次TIME0溢出中断      

    MOV TL0,#00H    ;用offset  调整调零时间。删去这两句

    MOV TH0,OFFSET  ;则凋零时间为1个TIME0

        MOV TMOD,#11H

        CLR EX0

        CLR PX0

        CLR ADLOWF

        CLR ADOVERF     ;以上是一个TIMEO的调零时间

        SETB    TK1     ;开始正向积分,两次TIMEO时间

        CLR TK2        

    CLR TK3

    LJMP    TIME0SEVER_END                 

;T6

TIME02: INC T0COUNT     ;正向积分,第2次TIME0溢出中断     

    LJMP    TIME0SEVER_END 

TIME03: INC T0COUNT     ;

    JNB CHK,ADLOW   ;如果INT0已经是低电平,说明输入

    MOV COUNT1,#00H ;信号太低,AD下溢出

        CLR GETADF

        CLR ADLOWF

        CLR ADOVERF     ;

        CLR TK1     ;开始反向积分,最大四次TIMEO时间

        SETB    TK2        

    CLR TK3

        CLR IE0     ;清外部沿触发中断0请求标志

        SETB    EX0     ;开外部中断0允许位

        SETB    PX0     ;定义INT0优先级

    MOV TMOD,#19H   ;开TIME0 GATE

    LJMP    TIME0SEVER_END

TIME04: INC T0COUNT     ;反向积分,第2次TIMEO时间

;T7

    INC COUNT1      ;A/D转换结果最高位加一

    LJMP    TIME0SEVER_END

TIME05: INC T0COUNT     ;反向积分,第3次TIMEO时间

    INC COUNT1      ;

    LJMP    TIME0SEVER_END

TIME06: SETB    ADOVERF     ;反向积分,第4次TIMEO时间,

                ;AD上溢出。

    MOV T0COUNT,#00H    ;清TIMEO溢出次计数器  

    MOV COUNT1,#00H ;清A/D转换结果最高位寄存器

        CLR EX0     ;外部中断0允许位

    MOV TMOD,#11H   ;

    SETB    ET0            ;TIME0中断允许位

    SETB    TR0             ;

    JB  CHK,$

    LJMP    TIME0SEVER_END

;T8

ADLOW:  SETB    ADLOWF      ;AD下溢处理子程序

    MOV T0COUNT,#00H    ;清零(TIMEO溢出次计数器)

        CLR EX0     ;CLOSE外部中断0允许位

    MOV TMOD,#11H   ;

    LJMP    TIME0SEVER_END

TIME0SEVER_END:

    POP DPH     ;弹出特殊寄存器

    POP DPL

    POP B

    POP Acc

    POP PSW

    RETI

;T9

ADINI:

    MOV TCON,#00H       ;AD初始化,清TIMEO控制寄存器

    MOV IE,#00H         ;清中断允许寄存器

    MOV TMOD,#11H       ;设TIMEO为16位计数器

    SETB    TR0            ;开TIME0

    NOP             ;

    SETB    ET0            ;开TIME0 中断

    NOP             ;

    SETB    PT0            ;TIME0 为高优先级

    NOP             ;

    CLR    EX0              ;关外部INT0中断允许位

    NOP             ;

    SETB    IT0            ; INT0外部中断0下降沿触发

    SETB    EA              ;开禁止所有中断位

;T10

    MOV T0COUNT,#00H    ;清零(TIMEO溢出次计数器)

    RET

READAD: MOV ADC_H,COUNT1    ;读A/D接口程序

    MOV ADC_M,COUNT2   

    MOV ADC_L,COUNT3

    CLR GETADF      ;取走AD值后清GETADF

    RET

INITPORT:

    MOV P1,#0FFH    ;出始化IO口

    MOV P2,#0FFH

    MOV P0,#0FFH

    MOV P3,#0CH

    RET

;T11

MAIN:   MOV PSW,#00H    ;清除PSW

    MOV SP,#0C0H    ;定义堆栈

    MOV IE,#00H     ;禁止所有中断

    SETB    IT0     ;INT0由跳变触发

    MOV TMOD,#19H   ;

    CALL    INITPORT

    CALL    ADINI       ;AD初始化

MAINLOOP:

    JB  GETADF,ADLOOP   ;A/D是否转换完成

    LJMP    MAINLOOP

ADLOOP: CALL    READAD      ;读A/D值

    ;。。。。。。。。。。。。。

    JMP MAINLOOP


       END

3工艺上应注意的问题
  (1)充放电时间(T和t)一般不能超过2RC。超过时线性误差会增大。
  (2)PCB板设计时模数电源的地要分开,单点相接;AD转换部分元件连线尽可能短,这部分元件应与数字部分元件分开;PCB板应采用较厚铜箔的板材。
  (3)保持PCB板和元件的清洁,模拟部分应涂上防水胶。
  (4)积分电容应采用漏电小的聚丙烯电容,基准分压电阻和积分电阻应采用温度系数和噪声较小的电阻。

http://fortisinfo.cn/?q=12915

[] [返回上一页] [打 印] [收 藏]
上一篇文章:LCD1602的滚动显示
∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论…]
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 - 管理登录
Copyright © 2002-2009 www.chinadpj.com. All Rights Reserved. 浙ICP备06040125号
Powered by:NewAsp SiteManageSystem Version 2.1 SP1 1030