#include "1ADC.h"
|
|
|
void Adc_Init(ad_data_s * data_p)
|
{
|
|
CDIF_CR_INTF_EN_Setable(ENABLE); //¿çµçÔ´Óò½Ó¿ÚʹÄÜ
|
VRTC_Init_RCMF_Trim();
|
VRTC_RCMFCR_EN_Setable(ENABLE);
|
VRTC_ADCCR_CKS_Set(VRTC_ADCCR_CKS_RCMF_2); //ADC¹¤×÷ʱÖÓÑ¡Ôñ
|
VRTC_ADCCR_CKE_Setable(ENABLE); //ADC¹¤×÷ʱÖÓʹÄÜ
|
ADC_CFGR_BUFSEL_Set(data_p->ad_ch); //(ADC_CFGR_BUFSEL_ADC_IN9); //ADCÊäÈëͨµÀÑ¡Ôñ
|
|
ADC_CFGR_BUFEN_Setable(ENABLE); //ADCÊäÈëͨµÀbufferʹÄÜ/½ûÖ¹
|
ADC_CR_MODE_Set(ADC_CR_MODE_EXTERNAL); //ADC¹¤×÷ģʽѡÔñÍⲿÀÛ¼ÓÆ÷
|
ADC_CR_RSTCTRL_EN_Setable(ENABLE); //ÔÊÐí»ý·ÖÆ÷Íⲿ¸´Î»
|
ADC_CFGR_ACC_PERIOD_Set(ADC_CFGR_ACC_PERIOD_14BITS); //ÍⲿÀÛ¼ÓÆ÷ÀÛ¼ÓÖÜÆÚÅäÖÃ
|
ADC_CR_HPEN_Set(ADC_CR_HPEN_1MHZ);
|
|
ADC_TRIM_Write(0X7FF); //adcƵÂÊ1M ʱ ¼ÆËãʱ¼ä4ms
|
// ADC_TRIM_Write(0X3FF); //adcƵÂÊ1M ʱ ¼ÆËãʱ¼ä2ms
|
// ADC_TRIM_Write(0X1FF); //adcƵÂÊ1M ʱ ¼ÆËãʱ¼ä1ms
|
|
ADC_CR_ACC_IE_Setable(DISABLE); //ÍⲿÀÛ¼ÓģʽÖжϽûÖ¹
|
ADC_CR_EN_Setable(DISABLE); //ADC¹Ø±Õ
|
|
}
|
|
|
float ADC_vol_cal(uint32_t adc_data)
|
{
|
float Volt = 0;
|
Volt = (adc_data*const_adc_Slope/1000.0)+const_adc_Offset/100.0;
|
|
if(Volt<0) //VoltΪ¸ºÖµ
|
{
|
Volt=0;
|
}
|
return Volt;
|
}
|
|
uint08 ADC_wait_finish(void)
|
{
|
uint32 timeout=0;
|
do
|
{
|
if(SET == ADC_ISR_ACC_IF_Chk()) return 0;//ÍⲿÀÛ¼Ó
|
|
}while(timeout++ < 0xFFFFFFFFU);
|
return 1;//³¬Ê±
|
}
|
|
u16 Temp_GetADCData(void)
|
{
|
volatile int32_t fVlotage = 0;
|
uint32 fTempADC = 0;
|
ADC_CR_EN_Setable(ENABLE); //ADCÆô¶¯
|
|
ADC_ISR_ACC_IF_Clr(); //ÍⲿÀÛ¼ÓÇå³ýÖжϱêÖ¾
|
if(0 == ADC_wait_finish()) //µÈ´ýת»»Íê³É
|
fTempADC = ADC_DR_Read(); //¶ÁÈ¡ADÖµ
|
else
|
return 0;
|
fVlotage = ADC_vol_cal(fTempADC);//ADֵת»»Îªµçѹ,µçÔ´µçѹΪ5V
|
|
return fVlotage;
|
}
|
|
|
uint16 Get_vol_Average(ad_data_s * data_p)
|
{
|
u32 i, j, t;
|
uint16 temp;
|
uint32 temp_vol;
|
|
Adc_Init(data_p);
|
|
for(i = 0; i < data_p->ad_buffer_cnt; i ++)
|
{
|
data_p->ad_get_address_p[i] = Temp_GetADCData();
|
}
|
|
for(i = 0; i < data_p->ad_buffer_cnt; i ++)
|
{
|
for(j = (i + 1); j < data_p->ad_buffer_cnt; j ++)
|
if(data_p->ad_get_address_p[j] < data_p->ad_get_address_p[i])
|
{
|
temp = data_p->ad_get_address_p[j];
|
data_p->ad_get_address_p[j] = data_p->ad_get_address_p[i];
|
data_p->ad_get_address_p[i] = temp;
|
}
|
}
|
temp_vol = 0;
|
for(t = 5; t < (data_p->ad_buffer_cnt - 5); t ++)
|
{
|
temp_vol += data_p->ad_get_address_p[t];
|
}
|
|
temp_vol = temp_vol /(data_p->ad_buffer_cnt - 10);
|
|
|
return (uint16)temp_vol;
|
}
|
|
|
//--------------------------------------------------------------------------------------------------------
|
/******************************************
|
* func: get_alka_bat_voltage
|
* desc: Get alka ADC data
|
* input: none
|
* output: none
|
* return: none
|
*****************************************/
|
float get_alka_bat_voltage(void)
|
{
|
uint32 volt_ret;
|
float sample_vol;
|
ad_data_s data_ins;
|
float battery_vol;
|
|
data_ins.ad_buffer_cnt = AD_ALKA_BAT_CNT;
|
data_ins.ad_ch = AD_ALKA_BAT_CH;
|
|
volt_ret = Get_vol_Average(&data_ins);//10 - channel 3300 - 3.3v vref
|
if(volt_ret > 4096)
|
{
|
return 0;
|
}
|
else
|
{
|
sample_vol = (float)volt_ret * AD_ALKA_BAT_REF_VOL /4096;
|
battery_vol = sample_vol * ALKA_VOL_COE;
|
}
|
return battery_vol;
|
}
|
|
/******************************************
|
* func: get_lith_bat_voltage
|
* desc: Get lith_bat ADC data
|
* input: none
|
* output: none
|
* return: none
|
*****************************************/
|
float get_lith_bat_voltage(void)
|
{
|
uint32 volt_ret;
|
float sample_vol;
|
float battery_vol;
|
ad_data_s data_ins;
|
|
data_ins.ad_buffer_cnt = AD_LITH_BAT_CNT;
|
data_ins.ad_ch = AD_LITH_BAT_CH;
|
|
volt_ret = Get_vol_Average(&data_ins);//10 - channel 3300 - 3.3v vref
|
if(volt_ret > 4096)
|
{
|
return 0;
|
}
|
else
|
{
|
sample_vol = (float)volt_ret * AD_LITH_BAT_REF_VOL /4096;
|
battery_vol = sample_vol * LITH_VOL_COE ;
|
}
|
return battery_vol;
|
}
|