mcu_ab568x/app/platform/bsp/bsp_saradc.c
2025-05-30 18:03:10 +08:00

224 lines
5.7 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.

#include "include.h"
adc_cb_t adc_cb AT(.buf.key.cb);
void bsp_qdec_adc_process(u8 adc_val);
AT(.com_text.saradc.process)
bool bsp_saradc_process(u32 auto_en)
{
if (!saradc_is_finish()) {
return false;
}
if (saradc_adc15_is_vrtc()) {
adc_cb.vrtc_val = saradc_get_value10(ADCCH_VRTC);
}
if (saradc_adc15_is_bg()) {
adc_cb.bg = saradc_get_value10(ADCCH_BGOP);
}
if (saradc_adc15_is_mic()) {
adc_cb.mic_volt = saradc_get_value10(ADCCH_MIC);
}
#if TS_MODE_EN
if (saradc_adc15_is_ts()) {
adc_cb.vts = saradc_get_value10(ADCCH_VTS);
}
#endif
#if VUSB_DETECT_EN
if (saradc_adc15_is_vusb()) {
adc_cb.vusb = saradc_get_value10(ADCCH_VUSB);
}
#endif
if (auto_en) {
saradc_adc15_analog_next();
saradc_kick_start(0, 0); //启动下一次ADC转换
}
return true;
}
#define DC_IN() ((RTCCON >> 20) & 0x01)
AT(.com_text.saradc.process)
static void bsp_saradc_kick_process(void)
{
#if CHARGE_VOL_DYNAMIC_DET
if (!DC_IN()) {
saradc_kick_start(0, 0); //每5毫秒启动全部ADC通路转换一次
adc_cb.tmr1ms_cnt = 0;
} else {
if ((adc_cb.tmr1ms_cnt % 5000) == 0) { //充电状态, 每5s采样一次VBAT, 停10ms
adc_cb.tmr1ms_cnt = 0;
if(sys_cb.chg_on){
RTCCON8 |= BIT(1); //charge stop
adc_chstops_flag = true; //转换完成, 中断清变量
}
if(VERSIONID < 2){
saradc_adc15_analog_select(ADCCH15_ANA_VRTC);
}else{
saradc_adc15_analog_select(ADCCH15_ANA_BG);
}
saradc_kick_start(0, 1); //全部ADC通路转换一次
} else {
if((adc_cb.tmr1ms_cnt % 5000) == 4990){
if(sys_cb.chg_on){
RTCCON8 |= BIT(1); //charge stop
}
}
saradc_kick_start_do(saradc_cb.channel & ~(BIT(ADCCH_VBAT)), 0, 0);
}
}
#else
saradc_kick_start(0, 0); //每5毫秒启动全部ADC通路转换一次
#endif
}
AT(.com_text.saradc.process)
void bsp_saradc_tmr1ms_process(void)
{
adc_cb.tmr1ms_cnt++;
#if USER_ADKEY_QDEC_EN
if (bsp_saradc_process(0)) {
if ((adc_cb.tmr1ms_cnt % 5) == 0) {
saradc_adc15_analog_next();
bsp_saradc_kick_process();
} else {
saradc_kick_start_do(BIT(USER_QDEC_ADCH), 0, 0); //仅QDEC ADC每毫秒采样一次
}
bsp_qdec_adc_process(saradc_get_value8(USER_QDEC_ADCH));
}
#else
if ((adc_cb.tmr1ms_cnt % 5) == 0) {
bsp_saradc_process(0);
saradc_adc15_analog_next();
bsp_saradc_kick_process();
}
#endif // USER_ADKEY_QDEC_EN
}
void bsp_saradc_init(void)
{
u32 rtccon8 = RTCCON8;
memset(&adc_cb, 0, sizeof(adc_cb));
saradc_init();
// 0V充电的时候此时停充会影响充电效率
// if (CHARGE_DC_IN() ) { //vusb is online?
//RTCCON8 |= BIT(1); //charge stop
// delay_5ms(4);
// }
//始化时采一次BG电压
saradc_adc15_analog_select(ADCCH15_ANA_BG);
delay_us(600);
saradc_kick_start(0, 0);
while(!bsp_saradc_process(0));
//采集BG对应的VRTC电压
saradc_adc15_ana_set_channel(ADCCH15_ANA_VRTC);
saradc_adc15_analog_select(ADCCH15_ANA_VRTC);
#if TS_MODE_EN
saradc_adc15_ana_set_channel(ADCCH15_ANA_TS);
#endif
#if VUSB_DETECT_EN
saradc_adc15_ana_set_channel(ADCCH15_ANA_VUSB);
#endif
delay_us(600);
saradc_kick_start(0, 0);
while(!bsp_saradc_process(1));
adc_cb.vrtc_first = adc_cb.vrtc_val;
#if VBAT_DETECT_EN
saradc_adc15_ana_set_channel(ADCCH15_ANA_BG);
bsp_vbat_voltage_init();
#endif
RTCCON8 = rtccon8;
}
uint16_t bsp_saradc_exit(void)
{
return saradc_exit();
}
u16 saradc_get_mic_volt_val(void)
{
return adc_cb.mic_volt;
}
u16 saradc_get_bg_volt_val(void)
{
return adc_cb.bg;
}
#if TS_MODE_EN
//----NTC dac table部分
//
#define NTC_ADC_TABLE_MAX 33
static const int ntc_adc_value_table[NTC_ADC_TABLE_MAX][2] ={
{233, -40},
{237, -35},
{241, -30},
{245, -25},
{250, -20},
{255, -15},
{259, -10},
{264, -5},
{269, 0},
{275, 5},
{279, 10},
{285, 15},
{290, 20},
{295, 25},
{300, 30},
{306, 35},
{311, 40},
{317, 45},
{322, 50},
{327, 55},
{332, 60},
{338, 65},
{343, 70},
{348, 75},
{353, 80},
{358, 85},
{363, 90},
{369, 95},
{375, 100},
{379, 105},
{384, 110},
{389, 115},
{395, 120}
};
/**
* NTC ADC 转 温度
* 输入dac值返回实际温度
*/
s16 ts_adc2ntc(int adc_value)
{
int id, temp;
if(adc_value <= ntc_adc_value_table[0][0]){
return ntc_adc_value_table[0][1];
}
if(adc_value >= ntc_adc_value_table[NTC_ADC_TABLE_MAX-1][0]){
return ntc_adc_value_table[NTC_ADC_TABLE_MAX-1][1];
}
for(id=0; id<NTC_ADC_TABLE_MAX; id++){
if(ntc_adc_value_table[id][0] >= adc_value){
break;
}
}
temp = adc_value-ntc_adc_value_table[id-1][0];
temp = temp*5/(ntc_adc_value_table[id][0] - ntc_adc_value_table[id-1][0]) + ntc_adc_value_table[id-1][1];
return temp;
}
#endif