#include "AI8051U_ADC.h"
#include "AI8051U.h"
#include "intrins.h"


void adc_init()
{
    ADCCFG = 0x20+BAT_ADC_DIV;/* 设置ADC时钟分频，默认为8(18分频，计算为(n+1)*2分频)，转换结果右对齐 */
    ADCTIM = 0x3f;/* 设置最长的采样时间，保证ADC采样窗口足够大，保证ADC采样保持电容的充电 */
	ADC_CONTR = 0x80 + 0;    //ADC on + channels
}

//========================================================================
// 函数: u16	Get_ADCResult(u8 channel)
// 描述: 查询法读一次ADC转换结果.
// 参数: channel: 选择要转换的ADC通道.
// 返回: ADC转换结果.
// 版本: V1.0, 2012-10-22
//========================================================================

uint16_t get_ADC_12bit_result(uint8_t channel)    //channel = 0~15
{
    ADC_RES = 0;
    ADC_RESL = 0;

    ADC_CONTR = (ADC_CONTR & 0xf0) | channel; //设置ADC转换通道
    ADC_START = 1;//启动ADC转换
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    while(ADC_FLAG == 0);   //wait for ADC finish
    ADC_FLAG = 0;     //清除ADC结束标志
    return (((uint16_t)ADC_RES << 8) | ADC_RESL);
}

uint16_t ADC_convert(uint8_t chn)
{
    uint16_t j;
    uint8_t  k;        //平均值滤波时使用

    get_ADC_12bit_result(chn);    //参数i=0~15,查询方式做一次ADC, 切换通道后第一次转换结果丢弃. 避免采样电容的残存电压影响.
    get_ADC_12bit_result(chn);    //参数i=0~15,查询方式做一次ADC, 切换通道后第二次转换结果丢弃. 避免采样电容的残存电压影响.
    for(k=0, j=0; k<SUM_LENGTH; k++)
	{
		j += get_ADC_12bit_result(chn);    // 采样累加和, 参数0~15,查询方式做一次ADC, 返回值就是结果s
	}    
    j = j / SUM_LENGTH;        // 求平均
	return j;
}

