manymany-2440裸机篇之8 ADC模数转换


//***************************************************
//为了对温度,压力,流量,速度,位移等物理量进行测量和控制,都是通过各种
//传感器把上述物理量转换成模拟物理量的电信号,即模拟电信号,然后经过模数
//转化器转换成数字量,送进处理器处理
//目的:掌握ADC的使用
//***************************************************
//Designed by:
http://blog.ednchina.com/Manymany/
//2009-07-10
/****************************************************************

功能:
AD函数主要实现对模拟通道的转换,通过调节接在通道上的可调节电阻来
改变模拟量的输入,通过串口将回显的数据显示到终端。
*****************************************************************/

#include "2440addr.h"
#include "2440lib.h"

void Test_Adc(void);

void xmain(void)
{
 ChangeClockDivider(3,1);   //1:3:6
 ChangeMPllValue(127,2,1);   //405MHZ
 Port_Init();
 Isr_Init();
 Uart_Init(0, 115200);
 Uart_Select(0);
 Uart_Printf("the main is running\n");
 
 Test_Adc();   //AD测试函数
}

//==================================================================================  
int ReadAdc(int ch)   //读ADC函数,ch决定那个通道被选择,通道数(ch为0-7
{
    int i;
    static int prevCh="-1";

    //ADC设置使能端
    //设置数分频值为49
    //选择通道位,选中的通道上的电压被连接到AD
    rADCCON = (1<<14)|(49<<6)|(ch<<3); 

    if(prevCh!=ch)
    {
     for(i=0;i<1000;i++); //delay to set up the next channel
     prevCh="ch";
    }
    rADCCON|=0x1;   //使能ADC

    while(!(rADCCON & 0x8000)); //判断转换是否完成,如果完成跳到下一个语句,
                                //否则死循环,直到完成为止。
       //ADCCON[15]位:转换结果标志位,是只读位,如果值为0则表示在
       //模数转换过程中,如果为1则表示模数转换已完成。

    return ( (int)rADCDAT0 & 0x3ff );   //返回的数即为ADC转换的数字量。
}

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

void Test_Adc(void)
{
    int adcdata="0"; //定义一个变量,用来存放转换后的数字量
    Uart_Printf( "\nADC INPUT Test, press ESC key to exit !\n" ) ;
    while( Uart_GetKey() != ESC_KEY )
    {
        adcdata="ReadAdc"(ADC_CH);
     Uart_Printf( "AIN%d: %04d\n", ADC_CH,adcdata );   //终端的显示
  Delay( 2000 ) ;
    }
 }

posted @ 2009-12-31 11:53  clara  阅读(451)  评论(0编辑  收藏  举报