SY8835_For_Demo_Ourself/UsrSrc/adc/adc.c
Alex xu 075256bef7 更改内容:1、优化ADC采样逻辑,更改在ADC中断中采样为在主程序中轮询采样,减小系统开销;
2、更改NTC保护相关逻辑,由ADC电压值更改为ADC码值;
3、优化Boost放电逻辑;
4、更改灯效显示功能;
5、优化双向通讯功能;
6、其它优化。
2024-12-27 11:05:00 +08:00

328 lines
7.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
******************************************************************************
*
* @file adc.c
* @brief adc module
* @ic sy8835
*
* @version 1.0
* @date 2024/11/01 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 2024/11/01 Alex build this file
******************************************************************************/
/*_____ I N C L U D E S ____________________________________________________*/
#include "adc.h"
#include "system.h"
#include "sys_tim.h"
#if ADC_ENABLE
/******************************************************************************\
Macro definitions
\******************************************************************************/
/******************************************************************************\
Variables definitions
\******************************************************************************/
int8_t ADC_Offset_Error = 0; //ADC Offset Error 校准值寄存器
//int8_t ADC_Gain_Error = 0; //ADC Gain Error 校准值寄存器
uint8_t ADC_Chn_Num = 0;
idata uint16_t Vbat_Adc = 0;
idata uint16_t g_Vpmu_Adc = 0;
idata uint16_t g_Vntc_Adc = 0;
#if 0
idata uint16_t g_Vbjt_Adc = 0;
idata uint16_t g_Vp13_Adc = 0;
idata uint16_t g_Vref_Adc = 0;
#endif
uint8_t g_PMU_ADC_Chn = 0;
idata uint16_t g_pmu_Adc_Ivol = 0;
idata uint16_t g_pmu_Adc_Vin = 0;
idata uint16_t g_pmu_Adc_Vpmid = 0;
idata uint16_t g_pmu_Adc_Vor = 0;
idata uint16_t g_pmu_Adc_Vol = 0;
idata uint16_t g_pmu_Adc_Vdd = 0;
idata uint16_t g_pmu_Adc_Ivor = 0;
/******************************************************************************\
Functions definitions
\******************************************************************************/
/*
*******************************************************************************
* void Adc_Init(void)
*
* Description : ADC Initialization. --- 系统初始化调用。
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void Adc_Init(void)
{
SFRADDR = ADC_CTL2; //ADC 2.5V Enable b[7];ADC1 Pullup 100K Enable b[0].
SFRDATA = 0x81;
SFRADDR = MFP_CTL0; //Set P14 As ADC1 For NTC
SFRDATA |= 0x10;
ExtSfr_Write(ADC_CTL0,0xAB); //0B10101001,0xA9--ADC EN;Average time:16; Single mode; ADC CLK divided by 24=460k
// SFRADDR = ADC_IntEn; //Enable ADC Interrupt.b[4:0]:ADC4-ADC0
// SFRDATA |= 0x03;
SFRADDR = ADC_OFFSET;
ADC_Offset_Error = SFRDATA;
#if 0
SFRADDR = ADC_GAIN;
ADC_Gain_Error = SFRDATA;
#endif
// EX6 = 1; //ADC IRQ Enable
}
/*
*******************************************************************************
* void PMU_ADC_Chn_Data(PMU_ADC_CHANNELS_E pmu_Adc_Chn)
*
* Description : 设置相应通道的使能。在主循环中按通道设置各个通道的使能在中断中获取对应的ADC值减少主函数的阻塞。
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void PMU_ADC_Chn_Data(PMU_ADC_CHANNELS_E pmu_Adc_Chn)
{
if( ADC_IntFlag & 0x01 )
{
ADC_IntFlag = 0x01;
g_Vpmu_Adc = ExtSfr_Read(ADC_CH0_L);
g_Vpmu_Adc |= (uint16_t)( ( ExtSfr_Read(ADC_CH0_H) & 0x03 ) << 8 );
g_Vpmu_Adc = ((uint32_t)( g_Vpmu_Adc - ADC_Offset_Error ) * 2500) >> 10 ; //ADC的LSB = 2500mV / 1024 = 2.44mV
/*获取xSen对应的ADC值*/
switch (g_PMU_ADC_Chn)
{
case pmu_ADC_IVOL:
g_pmu_Adc_Ivol = g_Vpmu_Adc >> 2; //采样比例4mV/mA
break;
case pmu_ADC_VBAT:
Vbat_Adc = g_Vpmu_Adc << 1; //vbat的2分压
break;
case pmu_ADC_VIN:
g_pmu_Adc_Vin = g_Vpmu_Adc << 3; //vin的8分压
break;
case pmu_ADC_VPMID:
g_pmu_Adc_Vpmid = g_Vpmu_Adc << 2; //PMID的4分压
break;
case pmu_ADC_VOR:
g_pmu_Adc_Vor = g_Vpmu_Adc << 2; //vor的4分压
break;
case pmu_ADC_VOL:
g_pmu_Adc_Vol = g_Vpmu_Adc << 2; //vol的4分压
break;
case pmu_ADC_VDD:
g_pmu_Adc_Vdd = g_Vpmu_Adc << 1; //vdd的2分压
break;
case pmu_ADC_IVOR:
g_pmu_Adc_Ivor = g_Vpmu_Adc >> 2; //采样比例4mV/mA
break;
default:
break;
}
}
I2cSfr_Write( XSEN_CTRL , (0x08 | pmu_Adc_Chn) );
g_PMU_ADC_Chn = pmu_Adc_Chn;
ADC_CTL1 = 0x80 | ( ADC_PMU_CH0 ); //ADC Start Enable,Set Channel N Enabel.
#if 0
SFRADDR = ADC_IntEn; //Enable ADC Interrupt.b[4:0]:ADC4-ADC0
SFRDATA |= 0x01;
#endif
}
/*
*******************************************************************************
* void ADC_NTC_Data(void)
*
* Description : 获取NTC ADC值
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
void ADC_NTC_Data(void)
{
if( ADC_IntFlag & 0x02 ) //获取NTC ADC 码值
{
ADC_IntFlag = 0x02;
g_Vntc_Adc = ExtSfr_Read(ADC_CH1_L);
g_Vntc_Adc |= (uint16_t)( ( ExtSfr_Read(ADC_CH1_H) & 0x03 ) << 8 );
g_Vntc_Adc = g_Vntc_Adc - ADC_Offset_Error ;
}
ADC_CTL1 = 0x80 | ( ADC_NTC_CH1 ); //ADC Start Enable,Set Channel N Enabel.
#if 0
SFRADDR = ADC_IntEn; //Enable ADC Interrupt.b[4:0]:ADC4-ADC0
SFRDATA |= ( ADC_NTC_CH1 + 1 );
#endif
}
/*
*******************************************************************************
* void EX6_ADC_isr(void ) interrupt Interrupt_Vector_IE6
*
* Description : System External Intterupt 6 adc Interrupt.
*
* Arguments : NONE
* Returns : NONE
* Notes : NONE
*
*******************************************************************************
*/
#if 0
void EX6_ADC_isr(void) interrupt Interrupt_Vector_IE6
{
uint8_t reg_addr_bk = 0;
reg_addr_bk = SFRADDR;
if(ADC_IntFlag & 0x01)
{
g_Vpmu_Adc = ExtSfr_Read(ADC_CH0_L);
g_Vpmu_Adc |= (uint16_t)( ( ExtSfr_Read(ADC_CH0_H) & 0x03 ) << 8 );
g_Vpmu_Adc = ((uint32_t)( g_Vpmu_Adc - ADC_Offset_Error ) * 2500) >> 10 ; //ADC的LSB = 2500mV / 1024 = 2.44mV
/*获取xSen对应的ADC值*/
switch (g_PMU_ADC_Chn)
{
case pmu_ADC_IVOL:
g_pmu_Adc_Ivol = g_Vpmu_Adc >> 2; //采样比例4mV/mA
break;
case pmu_ADC_VBAT:
Vbat_Adc = g_Vpmu_Adc << 1; //vbat的2分压
break;
case pmu_ADC_VIN:
g_pmu_Adc_Vin = g_Vpmu_Adc << 3; //vin的8分压
break;
case pmu_ADC_VPMID:
g_pmu_Adc_Vpmid = g_Vpmu_Adc << 2; //PMID的4分压
break;
case pmu_ADC_VOR:
g_pmu_Adc_Vor = g_Vpmu_Adc << 2; //vor的4分压
break;
case pmu_ADC_VOL:
g_pmu_Adc_Vol = g_Vpmu_Adc << 2; //vol的4分压
break;
case pmu_ADC_VDD:
g_pmu_Adc_Vdd = g_Vpmu_Adc << 1; //vdd的2分压
break;
case pmu_ADC_IVOR:
g_pmu_Adc_Ivor = g_Vpmu_Adc >> 2; //采样比例4mV/mA
break;
default:
break;
}
}
if(ADC_IntFlag & 0x02) //获取NTC ADC 码值
{
g_Vntc_Adc = ExtSfr_Read(ADC_CH1_L);
g_Vntc_Adc |= (uint16_t)( ( ExtSfr_Read(ADC_CH1_H) & 0x03 ) << 8 );
g_Vntc_Adc = g_Vntc_Adc - ADC_Offset_Error ;
}
#if 0
if(ADC_IntFlag & 0x04)
{
g_Vbjt_Adc = ExtSfr_Read(ADC_CH2_L);
g_Vbjt_Adc |= (uint16_t)( ( ExtSfr_Read(ADC_CH2_H) & 0x03 ) << 8 );
g_Vbjt_Adc = g_Vbjt_Adc - ADC_Offset_Error ;
}
if(ADC_IntFlag & 0x08)
{
g_Vp13_Adc = ExtSfr_Read(ADC_CH3_L);
g_Vp13_Adc |= (uint16_t)( ( ExtSfr_Read(ADC_CH3_H) & 0x03 ) << 8 );
g_Vp13_Adc = g_Vp13_Adc - ADC_Offset_Error ;
}
if(ADC_IntFlag & 0x10)
{
g_Vref_Adc = ExtSfr_Read(ADC_CH4_L);
g_Vref_Adc |= (uint16_t)( ( ExtSfr_Read(ADC_CH4_H) & 0x03 ) << 8 );
g_Vref_Adc = g_Vref_Adc - ADC_Offset_Error ;
}
#endif
ADC_IntFlag = 0x0F;
SFRADDR = reg_addr_bk;
}
#endif
#endif