触摸屏控制芯片ADS7843中文资料ADS7843是一个内置12位模数转换、低导通电阻模拟开关的串行接口芯片。
供电电压 2.7~5 V,参考电压VREF为 1 V~+VCC,转换电压的输入范围为0~ VREF,最高转换速率为125 kHz。
ADS7843引脚图及引脚功能说明了:ADS7843的引脚配置如图3所示。
表1为引脚功能说明,图4为典型应用。
aDS7843引脚说明ADS7843典型应用电路2.2 ADS7843的内部结构及参考电压模式选择ADS7843之所以能实现对触摸屏的控制,是因为其内部结构很容易实现电极电压的切换,并能进行快速A/D转换。
图5所示为其内部结构,A2~A0和SER/为控制寄存器中的控制位,用来进行开关切换和参考电压的选择。
ADS7843支持两种参考电压输入模式:一种是参考电压固定为VREF,另一种采取差动模式,参考电压来自驱动电极。
这两种模式分别如图6(a)、(b)所示。
采用图6(b)的差动模式可以消除开关导通压降带来的影响。
表2和表3为两种参考电压输入模式所对应的内部开关状况。
2.3 ADS7843的控制字及数据传输格式ADS7843的控制字如表4所列,其中S为数据传输起始标志位,该位必为"1"。
A2~A0进行通道选择(见表2和3)。
MODE用来选择A/D转换的精度,"1"选择8位,"0"选择12位。
SER/选择参考电压的输入模式(见表2和3)。
PD1、PD0选择省电模式:"00"省电模式允许,在两次A/D转换之间掉电,且中断允许;"01"同"00",只是不允许中断;"10"保留;"11"禁止省电模式。
为了完成一次电极电压切换和A/D转换,需要先通过串口往ADS7843发送控制字,转换完成后再通过串口读出电压转换值。
标准的一次转换需要24个时钟周期,如图7所示。
由于串口支持双向同时进行传送,并且在一次读数与下一次发控制字之间可以重叠,所以转换速率可以提高到每次16个时钟周期,如图8所示。
如果条件允许,CPU可以产生15个CLK的话(比如FPGAs和ASICs),转换速率还可以提高到每次15个时钟周期,如图9所示。
2.4 A/D转换时序的程序设计ADS7843的典型应用如图4所示。
假设μP接口与51单片机的P1.3~P1.7相连,现以一次转换需24个时钟周期为例,介绍A/D转换时序的程序设计。
; A/D 接口控制线DCLK BIT P1.3CS BIT P1.4DIN BIT P1.5BUSY BIT P1.6DOUT BIT P1.7; A/D 通道选择命令字和工作寄存器CHX EQU 094H ;通道X+的选择控制字CHY EQU 0D4H;通道Y+的选择控制字CH3 EQU 0A4HCH4 EQU 0E4HAD_CH EQU 35H ;通道选择寄存器AD_RESULTH EQU 36H ;存放12 bit A/D值AD_RESULTL EQU 37H; 存放通道CHX+的A/D值CHXAdResultH EQU 38HCHXAdResultL EQU 39H; 存放通道CHY+的A/D值CHY AdResultH EQU 3AHCHY AdResultL EQU 3BH; 采集通道CHX+的程序段(CHXAD) CHXAD: MOV AD_CH,#CHXLCALL AD_RUNMOV CHXAdResultH,AD_RESULTH MOV CHXAdResultL,AD_RESULTL RET; 采集通道CHY+的程序段(CHY AD) CHY AD: MOV AD_CH,#CHY LCALL AD_RUNMOV CHY AdResultH,AD_RESULTH MOV CHY AdResultL,AD_RESULTL RET; A/D转换子程序(AD_RUN); 输入: AD_CH-模式和通道选择命令字; 输出: AD_RESULTH,L ;12 bit的A/D转换值; 使用: R2 ;辅助工作寄存器AD_RUN:CLR CS ; 芯片允许CLR DCLKMOV R2,#8 ;先写8 bit命令字MOV A,AD_CHAD_LOOP:MOV C, ACC.7MOV DIN,C ;时钟上升沿锁存DINSETB DCLK ;开始发送命令字CLR DCLK ;时钟脉冲,一共24个RL ADJNZ R2,AD_LOOPNOPNOPNOPNOPADW0: JNB BUSY,AD_W AIT ;等待转换完成SJMP ADW1AD_W AIT:LCALL W ATCHDOGNOPSJMP ADW0CLR DINADW1: MOV R2,#12 ;开始读取12bit结果SETB DCLKCLR DCLKAD_READ:SETB DCLKCLR DCLK ;用时钟的下降沿读取MOV A,AD_RESULTLMOV C,DOUTRLC AMOV AD_RESULTL,AMOV A,AD_RESULTHRLC AMOV AD_RESULTH,ADJNZ R2,AD_READMOV R2,#4 ;最后是没用的4个时钟IGNORE:SETB DCLKCLR DCLKDJNZ R2,IGNORESETB CS ;禁止芯片ANL AD_RESULTH,#0FH ;屏蔽高4 bitRET2.5 A/D转换结果的数据格式ADS7843转换结果为二进制格式。
需要说明的是,在进行公式计算时,参考电压在两种输入模式中是不一样的。
而且,如果选取8位的转换精度,1LSB=VREF/256,一次转换完成时间可以提前4个时钟周期,此时串口时钟速率也可以提高一倍。
本文来自: 原文网址:/info/commonIC/0086705.htmlADS7843驱动程序(C语言源程序)ADS7843是一个内置12位模数转换、低导通电阻模拟开关的串行接口芯片。
供电电压2.7~5 V,参考电压VREF为1 V~+VCC,转换电压的输入范围为0~ VREF,最高转换速率为125 kHz。
//===================================================================== // ADS7843 驱动程序(串行)//硬件连接: DCLK ——P0^0;// CS ——P0^1;// DIN ——P0^2;// BUSY——P0^3// DOUT ——P0^4// PENIRQ——P3^2;// VDD--逻辑电源(+5V)// VSS--GND(0V)//ADS7843.c//writer:谷雨2008年7月23日于EDA实验室//=====================================================================#include //STC单片机头文件#include#define uint unsigned int#define uchar unsigned charsbit DCLK = P0^0; //时钟信号,下降沿有效sbit CS = P0^1; //片选信号,低电平有效sbit DIN = P0^2; //串行数据输入sbit BUSY= P0^3; //忙信号sbit DOUT = P0^4; //串行数据输出sbit PENIRQ = P3^2; //键盘中断请求信号,低电平(负边沿)有效void Tranfer(char Data);uint average(uint a[8]);//===================================================================== ===============//函数名称:void delay(uint us)//函数功能:延时子函数//入口参数:us 延时时间//出口参数:无//===================================================================== ===============void delay(uint us){while(us--);}===============//函数名称:void ADS7843_start(void)//函数功能:ADS7843启动//入口参数:无//出口参数:无//===================================================================== ===============void ADS7843_start(void){DCLK=0;CS=1;DIN=1;DCLK=1;CS=0;}//===================================================================== ===============//函数名称:void ADS7843_wr(uchar dat)//函数功能:写ADS7843//入口参数:dat 写入的数据//出口参数:无//===================================================================== ===============void ADS7843_wr(uchar dat){uchar count;DCLK=0;for(count=0;count<8;count++){dat<<=1;DIN=CY;DCLK=0;_nop_();_nop_();_nop_();DCLK=1;_nop_();_nop_();_nop_();}}===============//函数名称:uint ADS7843_rd(void)//函数功能:读ADS7843//入口参数:无//出口参数:读回的坐标值//===================================================================== ===============uint ADS7843_rd(void){uchar count=0;uint dat=0;for(count=0;count<12;count++){dat<<=1;DCLK=1; _nop_();_nop_();_nop_(); //下降沿有效DCLK=0; _nop_();_nop_();_nop_();if(DOUT)dat++;}return(dat);}//===================================================================== ===============//函数名称:void intr0_int()//函数功能:外中断0中断服务函数//入口参数:无//出口参数:无//===================================================================== ===============void intr0_int() interrupt 0 using 2{uint X=0,Y=0,a[4],i, avex,avey,x[8],y[8];IE=0; //关中断delay(100); //中断后延时以消除抖动,使得采样数据更准确if(!PENIRQ){for(i=0;i<8;i++) //进行8次数据采集{ADS7843_start();delay(2);ADS7843_wr(0x90);//送控制字10010000 即用差分方式读X坐标delay(2);DCLK=1;_nop_();_nop_();_nop_();_nop_();DCLK=0;_nop_();_nop_();_nop_();_nop_();X=ADS7843_rd(); //读X轴坐标x[i]=X;ADS7843_wr(0xD0); //送控制字11010000 即用差分方式读Y坐标DCLK=1;_nop_();_nop_();_nop_();_nop_();DCLK=0;_nop_();_nop_();_nop_();_nop_();Y=ADS7843_rd(); //读Y轴坐标y[i]=Y;CS=1;}avex=average(x); //X坐标数据处理a[0]=avex/1000; //发上位机观察结果a[1]=(avex-a[0]*1000)/100;a[2]=(avex-a[0]*1000-a[1]*100)/10;a[3]=avex%10;Tranfer(a[0]+48);Tranfer(a[1]+48);Tranfer(a[2]+48);Tranfer(a[3]+48);avey=average(y); //Y坐标数据处理a[0]=avey/1000; //发上位机观察结果a[1]=(avey-a[0]*1000)/100;a[2]=(avey-a[0]*1000-a[1]*100)/10;a[3]=avey%10;Tranfer(a[0]+48);Tranfer(a[1]+48);Tranfer(a[2]+48);Tranfer(a[3]+48);for(i=0;i<10;i++) //延时,在程序中根据具体情况改动delay(10000);}IE=0x81; //开中断}//===================================================================== ===============//函数名称:void init_serial()//函数功能:初始化串口//入口参数:无//出口参数:无//===================================================================== ===============void init_serial(){TMOD=0x22; //定时器T1使用工作方式2TH1=250; //设置初值TL1=250;TR1=1; //开始计时PCON=0x80; //SMOD=1;SCON=0x50; //工作方式1,波特率9600bit/s,允许接收TI=1;}//===================================================================== ===============//函数名称:void Tranfer(char Data)//函数功能:发送数据程序//入口参数:Data 要发送的数据//出口参数:无//===================================================================== ===============void Tranfer(char Data){while(TI==0);SBUF=Data;TI=0;}//===================================================================== ===============//函数名称:int main()//函数功能:主函数//入口参数:无//出口参数:无//===================================================================== ===============int main(){// uint b[4];TCON=0x01; //设置外部中断0下降沿触发EX0=1; //开外中断0EA=1; //开总中断init_serial();while(1);}//===================================================================== ===============//函数名称:uint average(uint a[8])//函数功能:数据处理程序,采集8次的数据,去掉最大值,去掉最小值,然后求平均//入口参数:数组首地址//出口参数:平均值//===================================================================== ===============uint average(uint a[8]){uint max,min,i,ave=0,sum=0;max=a[0];min=a[0];for(i=0;i<8;i++){if(maxif(min>a[i])min=a[i];sum+=a[i];}ave=(sum-min-max)/6;return ave;}本文来自: 原文网址:/mcu/c51src/0086707.html。