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 ) ;
}
}