/**
    @copyright None
    @file      ADC.c
    @author    Comment Vivre
    @date      2025-11-03
    @brief     None
*/
#include <MyProject.h>

/**
    @function     VREF_Config_Init
    @brief        基准电压配置
    @date         2025-11-01
*/
void VREF_Config_Init(void)
{
    // 基准电压配置
    #if (HW_ADC_VREF == VREF3_0)
    SetReg(VREF_VHALF_CR, VRVSEL1 | VRVSEL0, VRVSEL1);
    #elif (HW_ADC_VREF == VREF4_0)
    SetBit(VREF_VHALF_CR, VRVSEL1 | VRVSEL0);
    #elif (HW_ADC_VREF == VREF4_5)
    ClrBit(VREF_VHALF_CR, VRVSEL1 | VRVSEL0);
    #elif (HW_ADC_VREF == VREF5_0)
    SetReg(VREF_VHALF_CR, VRVSEL1 | VRVSEL0, VRVSEL0);
    #endif
    // 基准电压输出滤波控制
    SetBit(P3_AN, PIN5);
    SetBit(P3_OE, PIN5);
    // VHALF 输出滤波配置
    SetBit(P3_AN, P32);
    // 基准电压与VHALF使能
    SetBit(VREF_VHALF_CR, VREFEN | VHALFEN);
}


/**
    @function     ADC_Init
    @brief        ADC端口初始化
    @date         2025-11-01
*/
void ADC_Init(void)
{
    // 母线电压 三相交流电压 模块温度 4-20mA电流采集
    SetBit(P2_AN, PIN4 | PIN5 | PIN6 | PIN7);
    // NTC1 NTC2
    SetBit(P3_AN, PIN3 | PIN4);
    // 通道使能
    SetBit(ADC_MASK,  CH0EN | CH1EN);
    SetBit(ADC_MASK,  CH2EN | CH3EN | CH4EN | CH6EN | CH7EN | CH11EN);
    // 数据左对齐 (自动左移4位)
    SetBit(ADC_CR, ADCALIGN);
    ClrBit(ADC_CR, ADCIE);
    SetBit(ADC_CR, ADCEN);
}

/**
    @function     AMP_Init
    @brief        运放初始化 外部增益 配置AMP1 AMP2
    @date         2025-11-01
*/
void AMP_Init(void)
{
    // AMP1 配置
    SetBit(P1_AN, P16);
    SetBit(P1_AN, P17);
    SetBit(P2_AN, P20);
    // AMP2 配置
    SetBit(P2_AN, P21);
    SetBit(P2_AN, P22);
    SetBit(P2_AN, P23);
    // P23_OE需要强制为0，禁止DA1输出至PAD
    ClrBit(P2_OE, P23);
    // 使能AMP1 AMP2
    SetBit(AMP_CR0, AMP1EN | AMP2EN);
    // 增益为外部配置
    ClrBit(AMP_CR1, AMP0_GAIN2 | AMP0_GAIN1 | AMP0_GAIN0 | AMP_PH_GAIN2 | AMP_PH_GAIN1 | AMP_PH_GAIN0);
}

/**
    @function     Get_ADC_Value
    @brief        读取ADC转换值
    @date         2025-11-03
*/
void Get_ADC_Value(void)
{
    // 使能ADC的DCBUS采样
    SetBit(ADC_CR, ADCBSY);
    
    // 等待转换完成
    while (ReadBit(ADC_CR, ADCBSY));
    
    // 读取数据
    motorControl.DCBus    = LPF_Zero_Update(VDCBUS_ADC, motorControl.DCBus, LPF_K(5.0));
    motorControl.ACBus    = LPF_Zero_Update(VACBUS_ADC, motorControl.ACBus, LPF_K(1.0));
    motorControl.IGBTTemp = LPF_Zero_Update(IGBT_NTC_ADC, motorControl.IGBTTemp, LPF_K(20.0));
    // 数据处理
}
