S3C2440拥有八通道的十位ADC, 最大转换率为2.5MHz A/D转换器时钟下的500KSPS。A/D转换器支持片上采样-保持功能和掉电模式的操作。
八个通道中有四个通道适用于电阻屏的触摸屏触摸检测,另外四个是模拟输入,分别是A[0:3],
ADC的使用极其简单,选择时钟à选择通道à启动转换à转换完成
主要用到如下几个寄存器
负责选择时钟通道以及启动ADC
这里读取ADC的值
注意这一位,这说明转换完成读取的时候还可以触发转换,也就是相当于连续转换
Adc.c
#include "adc.h" //===================================================================== //名称:ADCSelect(int ch, U32 preScaler) //功能:选择转换通道,转换器预分频值设置 //参数: ch :转换通道 preScaler:预分频值 //返回值:无 //======================================================================= void ADCSelect(int ch, u8 preScaler) { rADCCON=(1<<14)|(preScaler<<6)|(ch<<3); //选择通道,选择分频数 启动转换 } //======================================================================= //名称:ADEnable() //功能:采用置位使能方式启动AD转换,16次采样取平均值 //参数: 无 //返回值: 转换后的值 //======================================================================= u16 ADEnable(void) { int i; int val=0; for(i=0;i<16;i++) { rADCCON |=0x1; //使能ADC转换 while(rADCCON & 0x1); //判断使能ADC转换后被清零 while(!(rADCCON &0x8000)); //等待转换结束 val +=(rADCDAT0 & 0x3ff); //读取ADC转换的值 } val = val>>4; //计算ADC转换值 return val; } //======================================================================= //名称:ADRead() //功能:采用读控制器的方式启动AD转换 //参数: 无 //返回值:转换后的值 //======================================================================= u16 ADRead(void) { int i; int val=0; rADCCON |=0x2; //ADC转换通过读操作来启动 for(i=0;i<16;i++) { rADCCON |=0x1; //使能ADC转换 while(rADCCON & 0x1); //判断使能ADC转换后被清零 while(!(rADCCON &0x8000)); //等待转换结束 val +=(rADCDAT0 & 0x3ff); //读取ADC转换的值 } val = val>>4; //计算ADC转换值 return val; }
Adc.h
#ifndef __ADC_H #define __ADC_H #include "2440addr.h" #include "def.h" void ADCSelect(int ch, u8 preScaler); u16 ADEnable(void); u16 ADRead(void); #endif