Chinaunix首页 | 论坛 | 博客
  • 博客访问: 631559
  • 博文数量: 1008
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5175
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-31 09:44
文章分类
文章存档

2012年(1008)

我的朋友

分类:

2012-08-01 11:11:51

原文地址:s3c2440的A/D转换 作者:luozhiyong131

A/D转换,又称为模数转换,是将模拟信号转换为计算机能够处理的数字信号。s3c2440集成了8通道10CMOS A/D转换器。

 

       对于s3c2440来说,实现A/D转换比较简单,主要应用的是ADC控制寄存器ADCCONADC转换数据寄存器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);      //设置分频 148

    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<表示第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);  //发送到串口显示

 

 }

 

源代码 ADC.rar   

阅读(199) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~