ADS7846使用心得

芯片简介:
ADS7846是4线电阻触摸屏转换接口芯片。它是一款具有同步串行接口的12位取样模数转换器。 在125KHz吞吐速率和2.7V电压下的功耗为750uW,而在关闭模式下的功耗仅为0.5uW。 因此ADS7843以其低功耗和高速率等特性,被广泛应用在采用 电池供 电的小型手持设备上。 ADS7843采用SSOP-16 引脚封装形式。温度范围是-40℃~+80℃。ADS7843具有两个辅助输入(1N3、1N4),可设置为8位或12位模式。该电路的工作电压在2.7~5.25V之间。基准电压vref介于1V~ +Vcc。该电路的基准电压确定了转换器的输入范围,输出数据中每个数字位代表的模拟电压等于基准电压除以4096。平均基准输入电流由ADS7846的转换率来确定。

工作原理:
ADS7846是一款连续近似记录(SAR)的a/d转换器。可通过连结触摸屏X+触摸信号输入到a/d转化器。同时打开 Y+和Y-的驱动,然后数字化X+的电压。从而得到当前Y位置的测量结果。同理,也可得到X方向的坐标。

硬件电路设计:

注意:芯片的X+,Y+,X-,Y- 直接与触摸屏的X+,Y+,X-,Y- 相连接,切勿串联或对地并联电容。我之前的调试时候因为在X+,Y+,X-,Y- 上并联的电容到地,导致读取的ADC结果总是不对,后来我降低了ADC的转换速度,发现也可以得到正确的ADC值,但是转换速度慢的无法接受。我反复检查程序,最后把ADS7846的每根数据线波形都用逻辑分析仪采集下来,对着芯片手册查找,依然未能找出原因,折腾了一周之后,我决定重头再来检查到底是什么地方的问题,在对照硬件电路的时候发现,芯片手册推荐的电路中,X+,Y+,X-,Y- 上都没有电容。这时候我才突然明白过来,应该就是这几个该死的电容惹的祸。于是立马把电容去掉了再烧进原来的程序,功能一切正常。虽然过程和曲折,但是在这个过程中我彻底搞明白了ADS7846的时序逻辑。
下面是逻辑分析仪采集的数据:

先来一张整体效果图:

花圈的地方就是,触摸屏按下的时候,IRQ由高变低,后面的两波数据就是两次读取ADC的过程。

下面我们把ADC读取的波形放大来看看:

当触摸屏按下之后,分别发送0x90和0xD0读取X,Y坐标的ADC值,具体为什么是0x90和0xD0参见数据手册。

下面再开看放大的时序图:

先配置CLK,DIN为低,然后拉低CS,接着开始发送控制命令,0xD0,在命令发送完成之后,等待ADC转换完成,此时Busy由芯片自动置高,等待8us之后,在发送一个CLK时钟,Busy变为低,此时可以开始读取ADC数据了,接下来的12位数据即为我们需要读取的ADC值,在每次CLK的上升沿之后读取数据。

这个是数据手册的数序图:

注意:在向ADS7846写入读取命令之后,并不能马上读取数据,这里需要至少等待8us,8us之后依然不能直接读取数据,为什么呢?因为8us之后的第一个CLK是用来清楚BUSY信号的,ADS7846并没有输出数据,从官方的时序图上也可以看的很清楚,实际逻辑分析仪采集到的结果也是一样!数据是从8us之后的第二个CLK开始输出的!

上了这么多张逻辑分析仪的截图之后,细心的读者可能会发现,IRQ在读取数据的时候也会有电平变化。这也是网上很多人都疑惑的,当采用中断触发读取触摸屏坐标时,触摸屏按下之后会不断的产生中断。
至于为什么IRQ会在读数据的时候会有电平跳变,我也没完全弄清楚,我反复看了3遍原版的数据手册,也没找到相关的说明。
如果必须使用中断触发读取数据,可以在读取数据之前关闭外部中断,数据读取完毕之后再打开外部中断,使用查询方式读取数据则没有任何影响。

最后再来看看代码,ADC读取代码如下:
IO初始化部分就省略不贴了,CS,TCK,Din配置为推挽输出,IRQ,Dout,BUSY配置为上拉输入即可。
u16 TP_Read_AD(u8 CMD)
{
u8 count=0;
u16 Num=0;
TCLK=0; //先拉低时钟
TDIN=0; //拉低数据线
TCS=0; //选中触摸屏IC
TP_Write_Byte(CMD);//发送命令字
delay_us(6);//ADS7846的转换时间最长为6us
TCLK=0;
delay_us(1);
TCLK=1; //给1个时钟,清除BUSY
TCLK=0;
for(count=0;count<16;count++)//读出16位数据,只有高12位有效
{
Num<<=1;
TCLK=0; //下降沿有效
TCLK=1;
if(DOUT)Num++;
}
Num>>=4; //只有高12位有效.
TCS=1; //释放片选
return(Num);
}
//SPI写数据
//向触摸屏IC写入1byte数据
//num:要写入的数据
void TP_Write_Byte(u8 num)
{
u8 count=0;
for(count=0;count<8;count++)
{
if(num&0x80)TDIN=1;
else TDIN=0;
num<<=1;
TCLK=0;
TCLK=1; //上升沿有效
}
}

总结:还有很多人搞不清楚触摸屏和液晶之间的关系,其实他们之间没有任何关系。液晶屏是用来输出文字和图像的,触摸屏是用来采集输入信号的,两个配合用于实现人机交互。液晶屏和触摸屏的关系就像数码管和按键的关系一样,一个用于输入一个用于输出。其实你也完全可以给数码管加装一个触摸屏,只是实际中很小有人这样用罢了!

你可能感兴趣的:(ADS7846使用心得)