/** * @copyright None * @file ADC.c * @author Comment Vivre * @date 2025-11-03 * @brief None */ #include /** @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); } uint16_t uCurr, vCurr; /** @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)); // 数据处理 // 测试 uCurr = ADC0_DR; vCurr = ADC1_DR; motorControl.uPhaseCurr = uCurr - mcCurOffset.IuOffset; motorControl.vPhaseCurr = vCurr - mcCurOffset.IvOffset; }