ARM9S3C2440—ADC和触摸屏控制

上传人:mg****2 文档编号:122126055 上传时间:2020-03-01 格式:DOC 页数:20 大小:122KB
返回 下载 相关 举报
ARM9S3C2440—ADC和触摸屏控制_第1页
第1页 / 共20页
ARM9S3C2440—ADC和触摸屏控制_第2页
第2页 / 共20页
ARM9S3C2440—ADC和触摸屏控制_第3页
第3页 / 共20页
ARM9S3C2440—ADC和触摸屏控制_第4页
第4页 / 共20页
ARM9S3C2440—ADC和触摸屏控制_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《ARM9S3C2440—ADC和触摸屏控制》由会员分享,可在线阅读,更多相关《ARM9S3C2440—ADC和触摸屏控制(20页珍藏版)》请在金锄头文库上搜索。

1、.ARM9S3C2440ADC和触摸屏控制详解 S3C2440芯片内部共有8路A/D转换通道,AIN0-AIN7,转换器只有一个,转换精度为10位,最大转换率为2.5MHz A/D 转换器时钟下的500 KSPS。A/D 转换器支持片上采样-保持功能和掉电模式的操作。在常见的设计中,一般AIN4,AIN5,AIN6,AIN7被用作四线电阻触摸屏的YM、YP、XM、XP通道,剩余的AIN0AIN3被引出,其中AI0外接一个可调电阻。ADC的配置流程如下:1、 ADCDLY(P446)rADCDLY=50000; /Normal conversion mode delay about ( 1/3.

2、6864M)*50000=13.56ms 2、ADCCON(P444)的设置,选择转换通道和设置转换频率 ADCCON0,AD转换开始有效,1转换开始且该位在转换开始后变为0,通过这个特点可以判断是否开始转换。什么意思呢,设为1只是认为地让它转换开始,但是未必开始转换,还必须通过while循环查询方式判断该位是否变为0,变为0表示转换开始。ADCCON1,AD转换通过读取有效,1通过读取操作有效;ADCCON2,备用操作模式选择,0普通操作模式,1,备用操作模式;ADCCON5:3:转换通道选择;000 = AIN 0001 = AIN 1010 = AIN 2011 = AIN 3100 =

3、 YM101 = YP110 = XM111 = XPADCCON13:6,AD转换器预分频器值0255,ADC频率应该小于PCLK的1/5;ADCCON14,AD转换器预分频器使能,1使能;ADCCON15,AD转换结束标志,0:转化过程中,1:转换结束;ADC初始化程序示例如下:#define ADC_FREQ 2500000 /希望的ADC转换频率volatile U32 preScaler;volatile U32 adc_value=0;/在程序开始处声明void adc_init(void)rADCDLY=50000; /Normal conversion mode delay a

4、bout (1/3.6864M)*50000=13.56ms/选择输入通道,AIN0,对应开发板上W1可调电阻int channel=0; /*设置分频时钟*/preScaler = ADC_FREQ;preScaler = 50000000/ADC_FREQ - 1; /PCLK=50M/*AD转换频率设置,最大频率为2.5MHz*/rADCCON = (114)|(preScaler6)|(channel3);/setup channeldelay(1000); 3、ADCDAT0(ADCDAT1)P447,读取转换值ADCDAT09:0,X坐标转换结果值,包括普通模ADC转换结果值;(A

5、DCDAT19:0,Y坐标转换结果;)ADC转换程序示例,通过轮询方式void Main(void) /*时钟初始化*/ Set_Clk(); /*adc初始化*/ adc_init(); while(1) /*读取转换值*/ adc_value=ReadAdc(0);delay(1000) ; int ReadAdc(int channel) /*开始AD转换*/ rADCCON |= 0x01; /start ADC while(rADCCON & 0x1);/check if Enable_start is low /*检查转换是否结束*/ while(!(rADCCON & 0x800

6、0);/check if EC(End of Conversion) flag is high return ( (int)rADCDAT0 & 0x3ff ); ADC通过中断方式读取转换值 注意ADC的中断有两个子中断,INT_ADC_S和INT_TC 需要先处理一下子中断INT_ADC_S ,再处理INT_ADC。void adc_init(void)int channel=0; /选择输入通道,AIN0,对应开发板上W1可调电阻 preScaler = ADC_FREQ; /设置分频时钟preScaler = 50000000/ADC_FREQ - 1; /PCLK=50M rADCC

7、ON = (114)|(preScaler6)|(channel3);ClearSubPending(BIT_SUB_ADC);/清子中断处理寄存器 ClearPending(BIT_ADC); /清中断处理寄存器 pISR_ADC=(U32)adc_ISR; EnableSubIrq(BIT_SUB_ADC); /开AD子中断 EnableIrq(BIT_ADC); /开AD中断delay(1000); void _irq adc_ISR(void) int adc_value; /adc_value应该设为全局变量,这里放这里以便分析 ClearSubPending(BIT_SUB_ADC

8、);/清子中断处理寄存器 ClearPending(BIT_ADC); /清中断处理寄存器 adc_value = (int)rADCDAT0 & 0x3ff;触摸屏工作流程以及程序设计流程:1、 触摸屏初始化: 1、ADCTSC设置(P445),1:0:11设置触摸屏接口为中断等待模式,等待触摸笔按下2: 0 ADC普通转换模式,1自动连续测量X坐标和Y坐标3: 0 XP上拉有效,1 XP上拉无效 2、ClearSubPending(BIT_SUB_ADC);/清子中断处理寄存器 ClearPending(BIT_ADC); /清中断处理寄存器 ClearSubPending(BIT_SUB

9、_TC); 清除源挂起寄存器(SRCPND)、中断挂起寄存器(INTPND)、子源挂起寄存器(SUBSRCPND)。注意有两个中断,触摸屏中断:当触摸笔按下或抬起产生的中断,ADC中断:触摸屏坐标AD转换结束产生的中断。 3、EnableSubIrq(BIT_SUB_ADC); /开AD子中断 EnableIrq(BIT_ADC); /开AD中断 EnableSubIrq(BIT_SUB_TC); /开AD子中断TC 关中断屏蔽寄存器和子中断屏蔽寄存器(INTMSK,INTSUBMSK)。 4、pISR_ADC = (U32)AdcTsAuto;程序入口函数,中断模式和中断优先级默认即可。二、

10、触摸屏中断服务子程序: 一)触摸笔按下中断 4、如果中断发生,设置x,y坐标为自动转换模式 rADCTSC = (13)|(12); 2: 0 ADC普通转换模式,1自动连续测量X坐标和Y坐标3: 0 XP上拉有效,1 XP上拉无效 5、启动AD转换,然后检测AD转换是否启动 rADCCON|=0x1; /start ADC while(rADCCON & 0x1);/check if Enable_start is low 6、检测AD转换是否结束,若结束,获取x,y坐标的值通过轮询方式,也可以是中断方式判断转换结束。while(!(rADCCON & 0x8000); /check if

11、EC(End of Conversion) flag is high, This line is necessary!while(!(rSRCPND & 0x80000000); /check if ADC is finished with interrupt bit/*获取X,Y坐标*/xdata=(rADCDAT0&0x3ff);ydata=(rADCDAT1&0x3ff); 7、对几个寄存器写1清零,防止反复发生中断(这里的中断是笔尖按下中断) ClearSubPending(BIT_SUB_TC); ClearPending(BIT_ADC);/rSRCPND = 0x80000000

12、;rINTPND = 0x80000000; 也可以8、 再次允许中断 允许触摸笔被弹起的中断EnableSubIrq(BIT_SUB_TC);EnableIrq(BIT_ADC); / rINTMSK = 0x7fffffff;2) 触摸笔抬起中断 9、设置触摸屏即可为等待中断模式,等待触摸笔抬起(ADCTSC,关键是要设置触摸笔抬起中断信号) rADCTSC =0xd3; /Waiting for interruptrADCTSC=rADCTSC|(18); / Detect stylus up interrupt signal. 10、如果发生中断,不做任何操作,只打印出一句触摸笔抬起中

13、断信息while(1)/to check Pen-up stateif(rSUBSRCPND & (BIT_SUB_TC)/check if ADC is finished with interrupt bitUart_Printf(Stylus Up Interrupt!n);break;/if Stylus is up(1) state/*stylus up*/Uart_Printf(count=%03d XP=%04d, YP=%04dn, count+, xdata, ydata); 11、触摸笔抬起之后,把得到的x,y坐标值发送给PC机,显示出具体数值 三)再次设置触摸屏为等待中断模式,等待下次触摸屏被按下/*设置触摸屏为等待中断模式,等待下次触摸笔按下*/ rADCTSC =0xd3; /Waiting for interrupt ClearSubPending(BIT_SUB_TC); ClearPending(BIT_ADC); EnableSubIrq(BIT_SUB_TC); EnableIrq(BIT_A

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号