/******************* 头文件 *******************/
#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"
/******************* 函数声明 *******************/
void Avg_value(void); //获取ADC转换平均值
void Get_Voltage(void); //获取ADC电压值
void ADC_Inquiry(void); //ADC转换查询
/******************* 变量 *******************/
extern UINT16 xdata SystemData[];
extern UINT8 adc_count; //ADC转换次数计数器
extern UINT16 xdata adc_buf[]; //ADC转换值缓存数组
extern UINT16 adc_avg; //ADC转换平均值
extern UINT16 Voltage; //ADC转换电压值
extern UINT16 xdata Vol_Value[3];
extern UINT8 Vol_Count;
/******************* 函数体 *******************/
void ADC_Inquiry(void) //ADC转换查询方式
{
if(ADCS == 0 && ADCF == 1)
{
clr_ADCF;
adc_buf[adc_count] = (ADCRH<<4)+ADCRL;
adc_count++;
if(adc_count == 10)
{
clr_ADCEN; //还没有处理完数据的时候先将ADC关闭掉,
}
else
set_ADCS; //启动新一轮ADC转换
}
}
void Get_Voltage(void) //获取ADC电压值
{
Avg_value();
if(adc_count == 11)
{
if((ADCCON0 & 0X0F) == 0X05) //VBUS电压
{
Vol_Value[Vol_Count++] = (UINT16)(adc_avg * ((float)3300 / 4096)*SystemData[37]/10000);
if(Vol_Count == 3)
{
Voltage = Vol_Value[1] * 5 + Vol_Value[2] * 6;
Vol_Count = 0;
Enable_ADC_AIN0; //切换到D+电压
SystemData[0] = Voltage; //更新VBUS电压
if(Voltage < 50) SystemData[0] = 0;
}
}
else if((ADCCON0 & 0X0F) == 0X00) //D+电压
{
Voltage = (UINT16)(((float)adc_avg * (float)3330 / 4096));
Enable_ADC_AIN4; //切换到D-电压
SystemData[1] = Voltage; //更新D+电压
if(Voltage < 79) SystemData[1] = 0;
}
else if((ADCCON0 & 0X0F) == 0X04) //D-电压
{
Voltage = (UINT16)(((float)adc_avg * (float)3330 / 4096));
Enable_ADC_AIN5; //切换到VBUS电压
SystemData[2] = Voltage; //更新D-电压
if(Voltage < 79) SystemData[2] = 0;
}
adc_count = 0;
set_ADCEN;
set_ADCS; //启动ADC转换
}
}
void Avg_value(void) //获取ADC转换平均值
{
UINT8 i,j;
UINT16 adc_data; //ADC转换循环索引
if(adc_count == 10)
{
//=== 求10次AD转换平均值,去掉最大值2个,最小值2个,计算余下6个平均值 ===//
for(j=9; j>0; j--)
{
for(i=0; i<j; i++) //ADC转换值从小到大排序
{
if(adc_buf[i] > adc_buf[i+1])
{
adc_data = adc_buf[i];
adc_buf[i] = adc_buf[i+1];
adc_buf[i+1] = adc_data;
}
}
}
//=== 计算平均值 ===//
adc_avg = (adc_buf[2]+adc_buf[3]+adc_buf[4]+adc_buf[5]+adc_buf[6]+adc_buf[7]) / 6;
adc_count = 11;
}
}
|