Both_Way_Comm_SY8833/TP3310_Demo.si4project/Backup/adc(6650).c

222 lines
5.4 KiB
C

/*
******************************************************************************
*
* @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