#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; }