分类: 嵌入式
2011-07-15 19:19:31
对于s3c2440来说,实现A/D转换比较简单,主要应用的是ADC控制寄存器ADCCON和ADC转换数据寄存器ADCDAT0。寄存器ADCDAT0的低10位用于存储A/D转换后的数据。寄存器ADCCON的第15位用于标识A/D转换是否结束。第14位用于使能是否进行预分频,而第6位到第13位则存储的是预分频数值,因为A/D转换的速度不能太快,所以要通过预分频处理才可以得到正确的A/D转换速度,如我们想要得到A/D转换频率为1MHz,则预分频的值应为49。第3位到第5位表示的是A/D转换的通道选择。第2位可以实现A/D转换的待机模式。第1位用于是否通过读取操作来使能A/D转换的开始。第0位则是在第1位被清零的情况下用于开启A/D转换。
//======================================================================
// 工程名称: ADC.mcp
// 功能描述: 采样ADC转换值,发送到串口显示
// IDE环境: TX2440A ADS v1.2
// 涉及的库: 无
// 组成文件: main.c uart.c
// 硬件连接: ADC连接两个电位器,拧动电位器即可改变AD值
// 维护记录: 2009-08-14 v1.0
// 2009-10-28 v1.1
//======================================================================
//========================================================
// 函数名称: main
// 功能描述: 通过串口,显示AD值
// 维护记录: 2009-08-14 v1.0
// 2009-10-28 v1.1
//========================================================
#include "2440addr.h"
#include "2440lib.h"
#include "option.h"
#include "uart.h"
#include "ADC.h"
void Main()
{
SetSysFclk(FCLK_400M); //设置系统时钟 400M
ChangeClockDivider(2, 1); //设置分频 1:4:8
CalcBusClk(); //计算总线频
Uart_Select(0);
Uart_Init(0, 115200);
Uart_Printf("\n ---ADC测试程序---\n");
while(1)
{
Test_ADC();
}
}
//====================================================================
// 文件名 : ADC.c
// 功 能 : ADC测试程序
// 维护记录: 2009-08-14 v1.0
// 2009-10-28 v1.1
//====================================================================
#include "def.h"
#include "2440addr.h"
#include "2440lib.h"
#include "uart.h"
#include "ADC.h"
void Test_ADC(void)
{
U8 ch, mode;
Uart_Printf("Select ADC Chanel: 0 or 1");
ch=Uart_Getch();
Uart_Printf("\n%c\n\n", ch);
if (ch!='0' && ch !='1')
{
Uart_Printf("you select wrong chanel!\n");
return;
}
rADCDLY = 100; //ADC转换延时
// rADCTSC = 0; //设置ADC为普通模式
/* 进行ADC模块设置,其中x<
rADCCON = (0 << 0) | // ADC转换设置 未设置
(0 << 1) | // 读AD数据触发AD转换 未使用
(0 << 2) | // StandBy模式选择 为普通操作模式
(ch << 3) | // ADC通道选择 ch
(49 << 6) | // CLKDIV = Fpclk /49+1/5 ,即转换时钟为1MHz Fpclk = 10M ADC转换频率400K
(1 << 14) ; // 使能软件预设值
Uart_Printf("Select ADC Mode: 1.Enable 2.Read");
mode=Uart_Getch();
Uart_Printf("\n%c\n\n", mode);
if (mode!='1' && mode !='2')
{
Uart_Printf("you select wrong model!\n");
return;
}
switch(mode)
{
case '1':
Uart_Printf("ADC Enable-Convert Mode\n");
while(Uart_GetKey() != ESC_KEY)
{
AD_ENABLE();
}
break;
case '2':
Uart_Printf("ADC Read-Convert Mode\n");
while(Uart_GetKey() != ESC_KEY)
{
AD_READ();
}
break;
// default:
// break;
}
}
//=======================================================================
//名称:AD_ENABLE()
//功能:采用置位使能方式启动AD转换
//参数: 无
//返回值: 无
//=======================================================================
void AD_ENABLE (void)
{
int i,j;
int val;
val = 0;
for(i=0;i<16;i++)
{
rADCCON |= 0x1; //使能ADC 转换
while(rADCCON&0x1); //判断是否使能ADC转换
while(!rADCCON&0x8000); //判断ADC转换是否结束
val += (rADCDAT0 &0x03ff); //取出ADC转换值
for(j=0;j<500;j++);
}
val = val/16; //计算ADC平均转换值
Delay(500);
Uart_Printf("ADC val = %d\n", val); //发送到串口显示
}
//=======================================================================
//名称:AD_READ()
//功能:采用读控制器的方式启动AD转换
//参数: 无
//返回值: 无
//=======================================================================
void AD_READ (void)
{
int i,j;
int val,aa;
val = 0;
rADCCON |= 0x2; //ADC转换通过读操作来启动
aa = rADCDAT0 &0x03ff; //启动ADC转换
for(i=0;i<16;i++)
{
while(!rADCCON&0x8000); //判断ADC转换是否结束
val += (rADCDAT0 &0x03ff); //取出ADC转换值
for(j=0;j<500;j++);
}
val = val/16; //计算ADC平均转换值
Delay(500);
Uart_Printf("ADC val = %d\n", val); //发送到串口显示
}
源代码 ADC.rar