S5PV210开发之1.0.13------AD转换

目录

1.ADC的一些概念
2.S5PV210的ADC控制器
3.ADC控制器的主要寄存器
4.代码编程实战

1.ADC概念

  1. ADC:模数转换,cpu只能识别数字量,但是外界的电压、温度、等等都是模拟量,所以要将模拟量转换成数字量给cpu进行数据处理。
  2. AD转换器,A只能是电压、所以AD之前还需要接一个传感器、将模拟信号转换成电压信号(模拟)。
  3. 量程:AD输入端的模拟电压要求有一个范围,一般是0~3.3V或0~5V或者是0~12V
  4. 精度:10位AD,表示转出来的数字量有2^10个档次,即1024,每个档次代表数字量的精度,比如量程为:0~3.3V,则每个格子代表的电压值是3.3V/1024=0.0032265V。如果此时AD转换后得到的数字量是447,则这个数字量代表的模拟值是:447×0.0032265V=1.44V。
  5. 转换速率:一般数据手册中描述转换速率用的单位是MSPS(第一个M是兆,S是sample,就是采样;PS就是per second,总的意思就是兆样本每秒,每秒种转出来多少M个数字值),需要额外配置时钟(不是MSPS,但有关),譬如S5PV210中的AD转换器,MSPS = 时钟频率/5。
  6. 通道数:AD转换的模拟量输入通道。

2. S5PV210的ADC控制器

  1. ADC的时钟框图:
    在这里插入图片描述
  2. ADC控制器
    在这里插入图片描述1.电阻式触摸屏本身工作时依赖于AD转换,所以在210的SoC中电阻触摸屏接口本身和ADC接口是合二为一的。或者说电阻触摸屏接口使用了(复用了)ADC的接口。
    2 (1)210一共支持10个ADC通道,分别叫AIN[0]~AIN[9]。理论上可以同时做10路AD转换。
    (2)SoC的引脚至少分2种:digit数字引脚和analog模拟引脚。我们以前接触的GPIO都属于数字引脚,ADC channel通道引脚属于模拟引脚。数字引脚和模拟引脚一般是不能混用的。
    在这里插入图片描述

3. ADC控制器的主要寄存器

  1. Register map
    在这里插入图片描述

1 TSADCCON0 :必要的配置
2 TSDATX0、TSDATY0: 转出来的AD值存在这里,我们读也是读这里
3 ADCMUX 选择当前正在操作的AD通道
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4. 代码编程实战

#include "main.h"

#define TSADCCON0 	0xE1700000
#define TSDATX0 	0xE170000C 
#define TSDATY0 	0xE1700010 
#define ADCMUX 		0xE170001C 

#define rTSADCCON0 	(*(volatile unsigned int *)TSADCCON0)
#define rTSDATX0 	(*(volatile unsigned int *)TSDATX0)
#define rTSDATY0 	(*(volatile unsigned int *)TSDATY0)
#define rADCMUX 	(*(volatile unsigned int *)ADCMUX)

static void delay(void)
{
	volatile unsigned int i,j;
	
	for(i = 0;i<4000;i++)
		for(j = 0;j<1000;j++);
}

static void adc_init(void)
{
	rTSADCCON0 |= (1<<16);  //bit[16] = 1 => 12bit A/D conversion
	rTSADCCON0 |=(1<<14);	//A/D converter prescaler enable
	
	rTSADCCON0 &= ~(0xff<<6); 
	rTSADCCON0 |=(65<<6);	// A/D converter prescaler value
	rTSADCCON0 &= ~(1<<2);
	rTSADCCON0 &= ~(1<<1);
	
	rADCMUX &= ~(0xf<<0);
}

void adc_start(void)
{
	adc_init();
	unsigned int math_val;
	while(1)
	{
		//1. 打开ADC
		rTSADCCON0 |= (1<<0);
		
		//2. 等待ADC结束
		while(!(rTSADCCON0 & (1<<15)));
		//3. 读取ADC数字量、显示数字量
		
		math_val = rTSDATX0&(0xfff<<0);
		printf("x:bit14  = %d\n",(rTSDATX0&(0x1<<14)));
		printf("x:math_val  = %d\n",math_val);
		
		math_val = rTSDATY0&(0xfff<<0);
		printf("y:bit14  = %d\n",(rTSDATY0&(0x1<<14)));
		printf("y:math_val  = %d\n",math_val);
		  
		//4. 延时
		delay(); 	
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值