ADC硬件原理
根据图示,我们可知以后程序需要做的事:
- 设置8:1MUX,选择要测量哪个引脚(需要看原理图)
- 设置工作时钟
- 启动
- 读状态,判断ADC成功
- 读数据
ADC编程
本节中做的事情是:
a. 初始化ADC
b. 读数据
c. 在串口上显示出来
根据芯片手册创建adc.c
并添加如下内容:
#include "../s3c2440_soc.h"
void adc_init(void)
{
/* [15] : ECFLG, 1 = End of A/D conversion
* [14] : PRSCEN, 1 = A/D converter prescaler enable
* [13:6]: PRSCVL, adc clk = PCLK / (PRSCVL + 1)
* [5:3] : SEL_MUX, 000 = AIN 0
* [2] : STDBM
* [0] : 1 = A/D conversion starts and this bit is cleared after the startup.
*/
ADCCON = (1<<14) | (49<<6) | (0<<3);
ADCDLY = 0xff;
}
int adc_read_ain0(void)
{
/* 启动ADC */
ADCCON |= (1<<0);
while (!(ADCCON & (1<<15))); /* 等待ADC结束 */
return ADCDAT0 & 0x3ff;
}
添加ADC测试函数:
#include "adc.h"
void adc_test(void)
{
int val;
double vol;
int m; /* 整数部分 */
int n; /* 小数部分 */
adc_init();
while (1)
{
val = adc_read_ain0();
vol = (double)val/1023*3.3; /* 1023----3.3v */
m = (int)vol; /* 3.01, m = 3 */
vol = vol - m; /* 小数部分: 0.01 */
n = vol * 1000; /* 10 */
/* 在串口上打印 */
printf("vol: %d.%03dv\r", m, n); /* 3.010v */
/* 在LCD上打印 */
//fb_print_string();
}
}
电阻触摸屏硬件原理
LCD与触摸屏是两个设备,是两个完全不相同的东西。
触摸屏是由两层膜组成的,他们靠的非常的近,如下图所示。
假设我们用手指将两层膜触摸在了一起,那么我们怎么去算出触点的x,y坐标呢?
测量触点X坐标:
- 让Xp接上3.3V,Xm接地,Yp,Ym不接。
- 测Yp的电压
- 即可测试X坐标
测量触点X坐标:
- 让Yp接上3.3V,Ym接地,Xp,Xm不接。
- 测Xp的电压
- 即可测试Y坐标
使用触摸屏的流程:
- 按下触摸屏,产生触摸屏中断
- 在触摸屏中断中 启动ADC,目的是获得x,y坐标
- ADC完成,产生中断
- 在ADC中断中,读取x,y坐标
- 启动定时器
- 定时器中断发生,判断触摸屏是否仍被按下
- 松开结束一个流程
处理等待中断模式下的等效电路图:
读取X坐标时的等效电路:
读取y坐标时的等效电路:
S3C2440触摸屏接口
触摸屏中断有按下中断和松开中断。
ADC中断和TS中断没有使能,一定会发给中断控制器,由中断控制器判断是否要发给CPU。
ADC中断和TS中断用同一个中断,所以一定会有寄存器去查询是哪一个中断。
罗列出与中断相关的寄存器:
- SRCPND/INTMOD/INTMSK/INTPND:bit31
- SUBSRCPND:[10]:ADC,[9]:TouchScreen 可读状态
- INTSUBMSK可屏蔽中断
具体流程如下图所示:
那么我们怎么写程序呢?
- 初始化ADC/TS
- 设置TS处于等待中断模式
- 设置中断(INTSUBMSK使能中断、INTMSK使能INT_ADC让它能发给CPU)
- 按下:进入TS中断,然后进入自动采集模式 启动ADC
- ADC中断:在里面读数据然后再次进入等待中断模式,等待触摸笔被松开,当然我们还可以启动定时器处理长按。
- 定时器中断:若松开则结束,若按下则重新启动ADC。