#include "SocAdc.h"
/*----------------------------
Software delay func
tion
----------------------------*/
void Delay(uint16 n)
{
uint16 x;
while (n--)
{
x = 5000;
while (x--){;}
}
}
/*----------------------------
Get ADC result
----------------------------*/
uint16 GetAdcResult(uint8 ch)
{
uint16 tmp = 0; //无符号16位整型变量
ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ch | ADC_START;
_nop_(); //Must wait before inquiry
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
//ADC_CONTR &= ~ADC_FLAG; //Close ADC
tmp = ADC_RES; //A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2 0000,0000
tmp <<= 2; //等价于 tmp = tmp<< 2 ,左移2位
tmp |= ADC_RESL; //等价于tmp= ADC_RESL | tmp 按位或, A/D 转换结果低2位 ADCV.1 ADCV.0 0000,0000
return tmp; //Return ADC result ,即输出一个采样点的二进制表示值
}
/****************************************************************
函数名:AdcInit
参 数:
返回值:
描 述:ADC初始化
****************************************************************/
void AdcInit()
{
P1M1 = 0x0f;
P1M0 = 0x00;
P1ASF = 0x0f; //Open 8 channels ADC function
AUXR1 &= (~0x04);
ADC_RES = 0; //Clear previous result
ADC_RESL = 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDHH;
Delay(2); //ADC power-on and delay
}
/****************************************************************
函数名:GetAdc10bit
参 数:ucChannel = 通道(0~7)
返回值:
描 述:10位采样
****************************************************************/
uint16 GetAdc10bit(uint8 ucChannel)
{
if (ucChannel > 7) {return 0;}
GetAdcResult(ucChannel); //切换后的第1次舍去
return GetAdcResult(ucChannel);
}
/****************************************************************
函数名:GetAdc12bit
参 数:ucChannel = 通道(0~7)
返回值:
描 述:12位采样
****************************************************************/
uint16 GetAdc12bit(uint8 ucChannel)
{
uint16 sum = 0;
uint8 i = 0;
if (ucChannel > 7) {return 0;}
GetAdcResult(ucChannel); //切换后的第1次舍去
for (i=0; i<4; i++) //2^2 //10bit过采样到12bit(0~4095)
{
sum += GetAdcResult(ucChannel);
}
return (uint16)sum;
}
/****************************************************************
函数名:GetAdc14bit
参 数:ucChannel = 通道(0~7)
返回值:
描 述:14位采样
****************************************************************/
uint16 GetAdc14bit(uint8 ucChannel)
{
uint16 sum = 0;
uint8 i = 0;
if (ucChannel > 7) {return 0;}
GetAdcResult(ucChannel); //切换后的第1次舍去
for (i=0; i<16; i++) //2^4 //10bit过采样到14bit(0~16383)
{
sum += GetAdcResult(ucChannel);
}
return (uint16)sum;
}
/****************************************************************
函数名:GetAdc16bit
参 数:ucChannel = 通道(0~7)
返回值:
描 述:16位采样
****************************************************************/
uint16 GetAdc16bit(uint8 ucChannel)
{
uint16 sum = 0;
uint8 i = 0;
if (ucChannel > 7) {return 0;}
GetAdcResult(ucChannel); //切换后的第1次舍去
for (i=0; i<64; i++) //2^6 //10bit过采样到16bit(0~65535)
{
sum += GetAdcResult(ucChannel);
}
return (uint16)sum;
}
能说具体点吗?本身是10位AD采样,12位采样是采集4个数据进行累加,14位采样是采集16个数据进行累加,这是为什么?
一周热门 更多>