免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1961 | 回复: 1
打印 上一主题 下一主题

MICRO2440 ADC_触摸屏学习 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-20 09:44 |只看该作者 |倒序浏览
2440支持8 通道10 位ADC 和触摸屏接口
8通道:AIN0~AIN7,其中AIN4~AIN7为触摸屏复用
AIN4~YM
AIN5~YP
AIN6~XM
AIN7~XP
分辨率:10位,即数据位为10位

四种转换模式:
– 普通转换模式
– 分离的X/Y 方向转换模式
– 自动(顺序)X/Y 方向转换模式
– 等待中断模式

A/D 转换时间:
当PCLK 频率在50MHz 并且预分频器的值为49 时,共10 位的转换时间如下:
-----------------------------------------------
A/D 转换器频率 = 50MHz / (49+1) = 1MHz
转换时间 = 1/(1MHz / 5 周期) = 1/200KHz = 5μs
-----------------------------------------------

1. 普通转换模式:
单转换模式是最合适的通用ADC 转换。此模式可以通过设置ADCCON(ADC 控制寄存器)
初始化并且通过读写ADCDAT0(ADC 数据寄存器0)就能够完成。

2. 分离的X/Y 方向转换模式:
X 方向模式写X 方向转换数据到ADCDAT0,触摸屏接口产生中断源给中断控制器。
Y 方向模式写Y 方向转换数据到ADCDAT1,触摸屏接口产生中断源给中断控制器。

 

XP

XM

YP

YM

X Position

External Voltage

GND

AIN[5]

Hi-Z

Y Position

AIN[7]

Hi-Z

External Voltage

GND


3. 自动(顺序)X/Y 方向转换模式:
触摸屏控制器顺序变换触摸X 方向和Y 方向。
在自动方向转变模式中触摸控制器在写入X 测量数值到ADCDAT0 和写入Y 测量数值到ADCDAT1 后(低10位)
触摸屏接口产生中断源给中断控制器。

 

XP

XM

YP

YM

X Position

External Voltage

GND

AIN[5]

Hi-Z

Y Position

AIN[7]

Hi-Z

External Voltage

GND


4. 等待中断模式:
当笔尖落下时触摸屏控制器产生中断(INT_TC)信号。
等待中断模式设置值为rADCTSC=0xd3;
触摸屏控制器产生中断信号(INT_TC)后,必须清除等待中断模式。
(XY_PST 设置到无操作模式)即寄存器ADCTSC的低两位必须清零。

 

XP

XM

YP

YM

Waiting for Interrupt

Pull UP

Hi-z

AIN[5]

GND



s3c2440集成了4线制电阻式的触摸屏接口,它的原理是通过测量横向和纵向的电阻值来获得触点的坐标。
触点坐标的检测是通过A/D转换来实现的

@,寄存器ADCTSC的第8位能够实现是触笔落下中断还是触笔抬起中断
@,寄存器ADCTSC的第3位可以选择上拉电阻的使能,
在等待中断模式下,上拉电阻要有效,
在触发中断后,上拉电阻要无效。寄存器ADCTSC的低两位清零
@,寄存器ADCTSC的第2位用于选择自动(连续)XY坐标转换模式
@,触笔抬起/落下中断状态寄存器ADCUPDN的低2位能够判断触笔在何种状态下引起的中断
@,A/D延时寄存器ADCDLY可以设置开始中断到真正开始A/D转换这段时间的延时
@,ADCCON[0]用于启动AD转换


  1. #include "uart.h"
  2. #include "2440addr.h"
  3. #include "def.h"

  4. #define ADCPRS 9    

  5. int count=0;
  6. volatile int xdata, ydata;



  7. void __irq AdcTsAuto(void)            //进入中断,进行转换,每触摸一下屏幕,就进入该函数,进行A/D转换
  8. {                                    //这就是中断处理函数的深意
  9.                                 //一个触摸中断为:触摸笔按下到触摸笔抬起,不抬起的话,中断就没结束
  10.     rADCTSC=(1<<3)|(1<<2)|(0<<0); //XP上拉禁止,自动连续XY坐标转换模式开启,清XY_PST
  11.     
  12.     rADCDLY=40000; //重设等待转换测量时间
  13.                                 
  14.     rADCCON|=0x1; //start ADC

  15.     while(rADCCON & 0x1);        //检测ADC转换是否开始,开始后,该位会被自动清零
  16.     while(!(rADCCON & 0x8000)); //等待转换结束,可以读取转换后的数值了
  17.         
  18.     while(!(rSRCPND & (BIT_ADC))); //判断ADC的中断悬挂位,若为1,则说明该中断已经长生,可以处理按下的数据了
  19.     xdata=(rADCDAT0&0x3ff);    //读取X方向的转换数值    //ADCDAT为状态寄存器
  20.     ydata=(rADCDAT1&0x3ff);    //读取Y方向的转换数值
  21.             
  22.     rSUBSRCPND|=BIT_SUB_TC;    //清除中断标志
  23.     ClearPending(BIT_ADC);        
  24.     rINTSUBMSK=~(BIT_SUB_TC);    //重新打开中断,为触摸笔抬起中断做准备
  25.     rINTMSK=~(BIT_ADC);
  26.     
  27.          
  28.      //这一次的中断设为触笔抬起中断    ,触摸笔抬起了,一个触摸中断才算结束,才可以读取数据
  29.      rADCTSC =0xd3; //再设为等待中断模式
  30.      rADCTSC=rADCTSC|(1<<8); // 设置为触笔抬起中断,但不读取此中断的数据,因为按下和抬起是同一点,上面已经处理了按下的数据

  31.             while(1)        //等待触笔的抬起
  32.             {
  33.              if(rSUBSRCPND & (BIT_SUB_TC))
  34.                  {
  35.                     break;    //说明笔尖已经抬起,一个触摸中断终于结束,下面读取数据吧
  36.                 }
  37.             }    

  38.     Uart_Printf("count=%03d XP=%04d, YP=%04d\n", count++, xdata, ydata);//X-position Conversion data

  39.     rADCDLY=50000;             //延时,等待串口输出
  40.     rADCTSC=rADCTSC&~(1<<8); //重新设为触摸笔按下中断,为下次的触摸做准备
  41.     rSUBSRCPND|=BIT_SUB_TC;        //清除中断标志
  42.     rINTSUBMSK=~(BIT_SUB_TC);    //重新开启中断
  43.     ClearPending(BIT_ADC);
  44. }




  45. void Test_Touchpanel(void)
  46. {
  47.    
  48.     rADCDLY=50000; //设置等待转换测量时间
  49.     rADCCON=(1<<14)+(ADCPRS<<6); //预分频使能,值为9
  50.                                 //A/D 转换器频率 = PCLK / (预分频值+1)
  51.                                 //转换时间 = 1/(AD转换频率/ 5 周期)
  52.     Uart_Printf("ADC touch screen test\n");
  53.                     //设为等待中断模式
  54.     rADCTSC=0xd3; //设为笔尖落下中断
  55.                     
  56.     pISR_ADC = (int)AdcTsAuto;//并联中断处理程序
  57.     rINTMSK=~BIT_ADC; //ADC总中断开启
  58.     rINTSUBMSK=~(BIT_SUB_TC);//ADC触摸屏子中断开启

  59.     Uart_Printf("\nType any key to exit!!!\n");
  60.     Uart_Printf("\nTouch Screen Down, please...... \n");
  61.     Uart_Getch();    //该函数旨在等待用户的触摸,然后触发中断,并不其他实质意义,其实为等待触摸中断
  62.                     //直到用户从键盘随便输入一个字符后,结束该死循环,然后往下执行

  63.     rINTSUBMSK|=BIT_SUB_TC;    //关闭ADC触摸屏子中断
  64.     rINTMSK|=BIT_ADC;        //关闭ADC总中断
  65.     Uart_Printf("Touch Screen Test is Finished!!!\n");
  66. }

流程:
1,在主函数里设置转换时间,由ADCDLY和ADCCON设定,然后,ADCTSC=0xd3设为等待中断模式,触摸笔按下 中断,开启中断后,用一个UART_Getch();等待用户触摸屏幕,产生中断
2,进入中断处理函数,
@设ADCTSC=(1<<3)|(1<<2)|(0<<0); XP上拉禁止,自动连续XY坐标转换模式开启,清XY_PST;
@重设转换时间,开启AD转换直到结束,读取数据寄存器ADCDAT0/1的转换值,为低10位
然后清除中断标志;@在设为ADCTSC =0xd3|(1<<8),等待中断模式,触摸笔抬起中断,直到触摸笔 抬起之后,一次中断完成,输出转换值;
@然后在设为ADCTSC=rADCTSC&~(1<<8),触摸笔按下中断,清中断标志,为下次中断做准备
3,用户从键盘输入后,结束程序


总结:
一个完整的触摸中断为按下到抬起,
中断处理程序中负责实现AD的转换,
转换后触屏得到的坐标为触摸屏的物理坐标,若和LCD的物理坐标不一致的话,则需要进行触摸屏的校正
中断只负责无条件的引导你进入中断处理程序的入口,具体程序的实现内容还得自己根据需要编写。这就是中断的真实含义。
转换后的数据保存在ADCDAT0/1这两个寄存器里,只需读取就可
注意等待中断的那个操作模式
ADC中断源包括两个子中断源,要注意设置

论坛徽章:
0
2 [报告]
发表于 2012-09-11 10:05 |只看该作者
写的很详细,不错!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP