AD转换的基本思想呢,就是将规定范围内的电压值转换为某一数值值。比如我这个44b0开发板可以接受的AD转换输入电压范围是0~2.5V,而在某个AIN引脚输入实际的电压为X,我们打算把这个电压值转换成数字值的范围是0~1023,那么经过AD转换,我们得到的值D是
D = X/2.5*1023;
当然由这个数字值D,我们也可以反过来计算出此AIN引脚的电压值:
X = D*2.5/1023。
可惜我没有设备给这几个AIN端口提供0~2.5V的电压,所以实际上实验我没有做,只是研究了下datasheet和实验代码。
废话少说,下面直接贴代码了。
int ReadAdc(int ch)
{
int i;
static int prevCh=-1;
if(prevCh!=ch)
{
rADCCON=0x0|(ch<<2); //setup channel.
for(i=0;i<150;i++); //min. 15us
}
rADCCON=0x1|(ch<<2); //Start A/D conversion
while(rADCCON &0x1); //To avoid The first FLAG error case.
//(The START bit is cleared in one ADC clock.)
while(!(rADCCON & 0x40));
for(i=0;i<rADCPSR;i++); //To avoid The second FLAG error case
prevCh=ch;
return rADCDAT;
}
void Test_Adc(void)
{
int a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0;
rCLKCON=0x7ff8;
rADCCON=0x1|(0<<2); //Enable ADC
Delay(100); //delay for 10ms for ADC reference voltage stabilization.
rADCPSR=1023;
while(Uart_GetKey()==0)
{
SoftDelay(10000);
a0=ReadAdc(0);
a1=ReadAdc(1);
a2=ReadAdc(2);
a3=ReadAdc(3);
a4=ReadAdc(4);
a5=ReadAdc(5);
a6=ReadAdc(6);
a7=ReadAdc(7);
Uart_Printf("0:%04d 1:%04d 2:%04d /n",/*3:%04d 4:%04d 5:%04d 6:%04d 7:%04d/n", a0,a1,a2,a3,a4,a5,a6,a7);
}
}