TX2440裸机程序-AD

该文章参考于http://blog.csdn.net/yx_l128125/article/details/7703668,并结合实际情况编写。

一、基本概念

ADC:模/数转换器。

            一种将模拟信号转换成数字信号的装置;

DAC:/模转换器。

           一种将数字信号转换成模拟信号的装置。

模拟信号转换为数值信号的步骤:

1.     取值;

2.     量化;

3.     编码;

二、硬件电路

S3C2440ADC

     S3C2440芯片内部共8A/D转换通道AIN0~AIN7,但是转换器只有一个。转换精度为10位,故转换后的值最小时会接近0,最大时会接近1024.

              

        最大的转换率在2.5MHZ转换时钟下能达到500KSPS(每秒采样5000千次)

      在常见的设计中,如TX2440开发板,一般AIN4AIN5AIN6AIN7被用作了四线电阻触摸的YMYPXMXP通道;剩余的AIN0~3被引出,其中AIN0、AIN1连接采样电路。

                                                                


三、程序

ADC驱动流程

         1.初始化        2.启动          3.转换结束             4.读取转换值;

          

寄存器说明

        

      

读取转换值:

         

源码

  
//======================================================================

//========================================================
//	函数名称:	main
//	功能描述:	通过串口,显示AD值
//	维护记录:	2009-08-14	v1.0        
//========================================================

#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:8:16
	CalcBusClk();           //计算总线频

	Uart_Select(0);
    Uart_Init(0, 115200);
	Uart_Printf("\n ---ADC测试程序---\n"); 
	
	while(1)
	{
		Test_ADC();
	}
 }
//====================================================================
// 文件名  : ADC.c
// 功  能  : ADC测试程序 
//====================================================================
#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<<n表示第n位设置为x(若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);  //发送到串口显示
 
 }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值