/* ****************************************************************************** * * @file adc.c * @brief adc module * @ic TP3102 * * @version 1.0 * @date 2024/03/26 15:00:40 * @author Alex Xu * * Copyright (c) 2013-2099,Tkplusemi Technology Co.,Ltd. * All Rights Reserved * * History: * Revision Date Author Desc * 1.0.0 2022/08/04 Alex build this file ******************************************************************************/ /*_____ I N C L U D E S ____________________________________________________*/ #include "adc.h" #include "system.h" #include "sys_tim.h" /******************************************************************************\ Macro definitions \******************************************************************************/ /******************************************************************************\ Variables definitions \******************************************************************************/ idata uint16_t g_VREF_Value = 0; //IREF 系统上电时采集一次。 /******************************************************************************\ Functions definitions \******************************************************************************/ /* ******************************************************************************* * uint16_t Vref_AdcValue(void) * * Description : Vref Value.获取基准参考电压ADC值。系统上电采集一次。 * * Arguments : NONE * Returns : Iref Value (mA) * Notes : NONE * ******************************************************************************* */ #if ADC_ENABLE uint16_t Vref_AdcValue(void) { uint16_t n_Vref_Data = 0; uint32_t n_ADC_Plus = 0; uint8_t index = 0; SFRADDR = ADC_CTL0; SFRDATA = 0x8B; //0x8B--ADC EN; Single mode; ADC CLK divided by 24=460k for(index=0;index<8;index++) { ADC_CTL1 = (0x06 << 4); //Channel set ADC_CTL1 |= 1; //Start conversion while(ADC_CTL1 & 0x01); //Wait for conversion complete n_Vref_Data = ADC_DATL; n_Vref_Data += (uint16_t)(ADC_DATH<< 8); n_ADC_Plus += n_Vref_Data; n_Vref_Data = 0; } n_Vref_Data = n_ADC_Plus / 8; #ifdef _DEBUG_ADC printf("Get Adc Value,Vref:%d \r\n",(uint16_t)n_Vref_Data); #endif return n_Vref_Data; } #endif /* ******************************************************************************* * void Adc_Init(void) * * Description : ADC Initialization. --- 系统初始化调用。 * * Arguments : * Returns : * Notes : * ******************************************************************************* */ #if ADC_ENABLE void Adc_Init(void) { #if 0 SFRADDR = MFP_CTL0; //Set P01 Pinmux As AD1 Function SFRDATA &= 0xCF; SFRDATA |= 0x20; SFRADDR = MFP_CTL1; //Set P04 Pinmux As AD3 Function SFRDATA |= 0x02; SFRADDR = ADCCS_CTL0; //AD0~AD4 GPIO constant 20uA current source enable. SFRDATA = 0x0A; #endif g_VREF_Value = Vref_AdcValue(); } #endif /* ******************************************************************************* * uint16_t Vbat_Value(void) * * Description : Vbat Value.获取电池电压。 * * Arguments : NONE * Returns : Vbat Value (mV) * Notes : NONE * ******************************************************************************* */ #if ADC_ENABLE uint16_t Vbat_Value(void) { uint16_t n_Vbat_Data = 0; uint32_t n_ADC_Plus = 0; uint8_t index = 0; SFRADDR = ADC_CTL0; SFRDATA = 0x8B; //0x8B--ADC EN; Single mode; ADC CLK divided by 24=460k for(index=0;index<8;index++) { ADC_CTL1 = (0x05 << 4); //Channel set ADC_CTL1 |= 1; //Start conversion while(ADC_CTL1 & 0x01); //Wait for conversion complete n_Vbat_Data = ADC_DATL; n_Vbat_Data += (uint16_t)(ADC_DATH << 8); n_ADC_Plus += n_Vbat_Data; n_Vbat_Data = 0; } n_Vbat_Data = n_ADC_Plus / 4; //Vbat采样值为二分压值。 n_Vbat_Data = (uint32_t)(VREF * n_Vbat_Data / g_VREF_Value); //Vadx = VREF*DATAadx/DATAvref #ifdef _DEBUG_ADC printf("Get Adc Value,Vbat:%d \r\n",(uint16_t)n_Vbat_Data); #endif return n_Vbat_Data; } #endif /* ******************************************************************************* * uint16_t ADC_Chn_Value(ADC_CHANNELS_E adc_chn) * * Description : ADC_Chn_Value. ADC0 ~ ADC4。 * Arguments : NONE * Returns : ADC Value (mV) * Notes : NONE * ******************************************************************************* */ #if ADC_ENABLE uint16_t ADC_Chn_Value(ADC_CHANNELS_E adc_chn) { uint8_t index = 0; uint16_t adc_data = 0; uint16_t Vadx_data = 0; uint32_t adc_plus_data = 0; SFRADDR = ADC_CTL0; SFRDATA = 0x8B; //0x8B--ADC EN; Single mode; ADC CLK divided by 24=460k for(index=0; index<8; index++) { ADC_CTL1 = (adc_chn << 4); //Channel set ADC_CTL1 |= 1; //Start conversion while(ADC_CTL1 & 0x01); //Wait for conversion complete adc_data = ADC_DATL; //Read low byte first! adc_data += (u16)(ADC_DATH << 8); adc_plus_data += adc_data; adc_data = 0; } adc_data = adc_plus_data / 8; Vadx_data = (uint32_t)(VREF * adc_data / g_VREF_Value); //Vadx = VREF*DATAadx/DATAvref #ifdef _DEBUG_ADC printf("Get Adc Value,Adc_Chn:%d,Adc:%d \r\n",ADC_CTL1>>4,Vadx_data); #endif return (uint16_t)Vadx_data; } #endif