打印

请教,触摸屏读数不准(问题已解决,附例程)

[复制链接]
3400|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ocon|  楼主 | 2008-7-14 03:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用ADS7846新做的12寸触摸屏接口,基本的电路,设成8位分辨率差分方式,跟PIC单片机的SPI口连接,SPI时钟1.25MHz上升沿采样,读出来的数据如下:

把X+跟Y+短接:X=250;Y=249;Z1=250;Z2=185;
把X+跟Y-短接:X=184;Y=3;Z1=159;Z2=159;
把Y+跟X-短接:X=2;Y=154;Z1=93;Z2=90;
从上面可以看出X和Y的变化范围在2~250之间,接口电路似乎没有问题。

但是,触摸测试的结果令我意外,变化范围太窄了:
左上角X=156;Y=157;Z1=194;Z2=172;
右上角X=94;Y=153;Z1=172;Z2=161;
左下角X=134;Y=88;Z1=154;Z2=164;
右下角X=110;Y=138;Z1=139;Z2=125;

什么原因?

相关帖子

沙发
ocon|  楼主 | 2008-7-14 03:40 | 只看该作者

换了一块同型触摸屏结果差不多,是不是芯片有问题?

使用特权

评论回复
板凳
xwj| | 2008-7-14 04:04 | 只看该作者

很正常,LZ先搞清楚芯片工作原理再说

使用特权

评论回复
地板
ocon|  楼主 | 2008-7-14 05:17 | 只看该作者

中英文的资料看了几份,没找到原因。

按道理测量结果应该基本满量程才对啊,而且发现Y的坐标值会随着X的变化而大幅变化,例如:
两个下角的X值应该有接近满量程的变化幅度,而Y值不应该有明显变化的。
可实测:
左下角X=134;Y=88;
右下角X=110;Y=138; 
X只变了24,而Y居然变了50,这还怎么校正?晕了。。。睡觉去。。。

使用特权

评论回复
5
lsqdesign| | 2008-7-14 10:33 | 只看该作者

应该是ADS7846的驱动程序没写好

应该是ADS7846的驱动程序没写好,触摸屏接口的开关状态不对.
没必要用ADS7846,有个A/D 加4个三极管就搞定了

使用特权

评论回复
6
ocon|  楼主 | 2008-7-14 15:26 | 只看该作者

帮看一下有什么问题。

//读取触摸屏坐标,8位分辨率,差分模式
void get_touch()
{
    int a,b;
    delay_us(500); //延时以消除抖动
    CST=0;//片选SPI
    
    a=spi_read(0xd8); //送控制字11011000给X+X-通电,Y+做A/D输入
    delay_us(20);
    a=spi_read(0x00);  //发送0x00以便读X轴坐标高字节
    b=spi_read(0x00);  //低字节
    a<<=1; //取高字节的6:0位
    b>>=7; //取低字节的第7位
    x=a+b; //拼合成8位结果
    delay_us(20);
    a=spi_read(0x98); //送控制字10011000给Y+Y-通电,X+做A/D输入
    delay_us(20);
    a=spi_read(0x00);  //读Y轴坐标
    b=spi_read(0x00);
    a<<=1;
    b>>=7;
    y=a+b;
    
    delay_us(20);
    a=spi_read(0xb8); //读z1
    delay_us(20);
    a=spi_read(0x00);  //读z1
    b=spi_read(0x00);
    a<<=1;
    b>>=7;
    z1=a+b;
    delay_us(20);
    a=spi_read(0xc8); //读z2
    delay_us(20);
    a=spi_read(0x00);  //读z2
    b=spi_read(0x00);
    a<<=1;
    b>>=7;
    z2=a+b;
    CST=1; //取消片选
}

使用特权

评论回复
7
ocon|  楼主 | 2008-7-14 20:47 | 只看该作者

搞定了,问题出在SPI口的配置上,空闲状态设成高电平即可

把代码重写了一下,整齐多了,ADS7846是个好东西,呵呵~
//编译器:CCSC V4.032
//SPI口设成时钟上升沿采样,下降沿送数,时钟1.25MHz空闲为高电平。
int get_ads7846(int comm)
{
    int a,b;
    a=spi_read(comm); //送控制字驱动X+X-,Y+做A/D输入
    delay_us(200); //延时200us待采样稳定再转换(1米长的排线实测从100us开始出现明显偏差)
    a=spi_read(0x00);  //发送0x00以便读取X轴坐标高字节
    b=spi_read(0x00);  //低字节
    a<<=1; //取高字节的6:0位
    b>>=7; //取低字节的第7位
    return(a+b); //拼合成8位结果
}
//读取触摸屏坐标,结果存入X,Y,Z1,Z2
//8位分辨率,差分模式,节电模式
void get_touch()
{
    CST=0;//片选ADS7846
    x=get_ads7846(0xd8);
    y=get_ads7846(0x98);
    z1=get_ads7846(0xb8);
    z2=get_ads7846(0xc8);
    CST=1; //关闭ADS7846
}

使用特权

评论回复
8
gyt| | 2008-7-15 11:19 | 只看该作者

谢谢分享经验

使用特权

评论回复
9
古道热肠| | 2008-7-15 14:28 | 只看该作者

SPI接口波形图有很多细节,用的时间一定要对照PDF仔细看程序

什么上升沿,下降沿,空闲态电平,字符的高低位,......等等都是值得注意的.

使用特权

评论回复
10
Swd21ic| | 2008-7-15 21:05 | 只看该作者

re

spi0~3.

1.空闲电平
2.第1个边沿还是第2个边沿.

2x2的矩阵

使用特权

评论回复
11
cgd555| | 2008-12-11 16:17 | 只看该作者

7846怎样识别触摸屏快速双击

使用特权

评论回复
12
cgd555| | 2009-4-30 15:02 | 只看该作者

请教

使用特权

评论回复
13
cgd555| | 2009-4-30 15:04 | 只看该作者

请教OCON,

我做的板子,ADS7846不能产生中断。是不是要先对ADS7846做初始化,系统才会工作。 需要怎样配置?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

143

主题

4869

帖子

14

粉丝