224 lines
5.7 KiB
C
224 lines
5.7 KiB
C
#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
|
||
|
||
|