利用C语言的位移功能可以快速对采集2N次方数据取平均数
例:
/***********************************************************************
* 函数名称:void ADC_VDD_Sampling(void)
* 功能说明:内部电压读取 ADC=1/4VCC
* 输入参数:无
* 输出参数:ADC_12bit_VDD_Data:1/4VCC电压以12位数据存储,3v基准
* 返回值 :无
* 用法示例:无
* 注意事项:ADC读取时间44us
**********************************************************************/
void ADC_VDD_Sampling(void)
{
ADMD = 0x90 | C_Quarter_VDD; // ADC=1/4VDD 配置内部通道
ADMDbits.START = 1; // ADC开始检测
while(ADMDbits.EOC == 0); // 延时程序等待转换结束
R_ADC_VDD_DATA_HB = ADD; // 寄存器“R_ADC_VDD_DATA_HB”存储VDD的ADC数据位11~4
R_ADC_VDD_DATA_LB = 0x0F & ADR; // 寄存器“R_ADC_VDD_DATA_LB”bit3~0存储VDD的ADC数据位3~0
ADC_12bit_VDD_Data = (R_ADC_VDD_DATA_HB<<4)+R_ADC_VDD_DATA_LB;
}
/***********************************************************************
* 函数名称:void ADC_VDD_Average(void)
* 功能说明:读取多次ADC,求平均
* 输入参数:ADC_12bit_VDD_Data:ADC采集数据
* 输出参数:ADC_VDD_Abergar:16次ADC采集数据平均数
* 返回值 :无
* 用法示例:无
* 注意事项:时间800us左右 44*16=704us
**********************************************************************/
void ADC_VDD_Average(void)
{
ADC_VDD_Abergar=0;
for(j=0;j<16;j++)
{
ADC_VDD_Sampling();
ADC_VDD_Abergar += ADC_12bit_VDD_Data;
}
ADC_VDD_Abergar = ADC_VDD_Abergar >> 4;
ADC_12bit_VDD_Data = 0XFFFF & ADC_VDD_Abergar;
}