//-------------------------------------------------------// // Project Code : ALE300K03-21-LGE-GEN2.0-ME-CPU1 // File Name : Adc_Driver.cpp // Created on : 2022. 10. 16. // Description : Internal ADC Function // Author : KimJeongWoo // Last modified Date : //-------------------------------------------------------// #include struct sAdc Adc = {0,}; unsigned int StateAdcEOC = 0; unsigned int CntWaitAdcEoc = 0; unsigned int SetWaitAdcEoc = 2000; //clock int Flag_ErrEoc = 0; ADC_Trigger AdcTriggerMode = ADC_TRIGGER_EPWM1_SOCA; // - Acquisition window = (ACQPS + 1)∙(System Clock (SYSCLK) cycle time // - The selected acquisition window duration must be at least as long as one ADCCLK cycle. // - The datasheet will specify a minimum acquisition window duration (in nanoseconds). The user is // responsible for selecting an acquisition window duration that meets this requirement. unsigned int acqps = 50; void InitAdc() { memset(&Adc, 0, (sizeof(Adc) / sizeof(int))); ConfigAdc(); SetupAdcSoc(); } void AdcForceSoc() { ADC_forceMultipleSOC(ADCA_BASE, ADCA_FORCE_SOC_SET); ADC_forceMultipleSOC(ADCB_BASE, ADCB_FORCE_SOC_SET); ADC_forceMultipleSOC(ADCC_BASE, ADCC_FORCE_SOC_SET); ADC_forceMultipleSOC(ADCD_BASE, ADCD_FORCE_SOC_SET); } void ConfigAdc(void) { // Set ADCDLK divider to /2 ADC_setPrescaler(ADCA_BASE, ADC_CLK_DIV_2_0); ADC_setPrescaler(ADCB_BASE, ADC_CLK_DIV_2_0); ADC_setPrescaler(ADCC_BASE, ADC_CLK_DIV_2_0); ADC_setPrescaler(ADCD_BASE, ADC_CLK_DIV_2_0); ADC_setMode(ADCA_BASE, ADC_RESOLUTION_12BIT, ADC_MODE_SINGLE_ENDED); ADC_setMode(ADCB_BASE, ADC_RESOLUTION_12BIT, ADC_MODE_SINGLE_ENDED); ADC_setMode(ADCC_BASE, ADC_RESOLUTION_12BIT, ADC_MODE_SINGLE_ENDED); ADC_setMode(ADCD_BASE, ADC_RESOLUTION_12BIT, ADC_MODE_SINGLE_ENDED); ADC_setInterruptPulseMode(ADCA_BASE, ADC_PULSE_END_OF_CONV); ADC_setInterruptPulseMode(ADCB_BASE, ADC_PULSE_END_OF_CONV); ADC_setInterruptPulseMode(ADCC_BASE, ADC_PULSE_END_OF_CONV); ADC_setInterruptPulseMode(ADCD_BASE, ADC_PULSE_END_OF_CONV); ADC_enableConverter(ADCA_BASE); ADC_enableConverter(ADCB_BASE); ADC_enableConverter(ADCC_BASE); ADC_enableConverter(ADCD_BASE); DEVICE_DELAY_US(1000); } int FactoryOffset[24]; int FactoryScale[24]; void SetupAdcSoc(void) { //ADCA ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER0, AdcTriggerMode, ADC_CH_ADCIN0, acqps); ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER1, AdcTriggerMode, ADC_CH_ADCIN1, acqps); ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER2, AdcTriggerMode, ADC_CH_ADCIN2, acqps); ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER3, AdcTriggerMode, ADC_CH_ADCIN3, acqps); ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER4, AdcTriggerMode, ADC_CH_ADCIN4, acqps); ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER5, AdcTriggerMode, ADC_CH_ADCIN5, acqps); ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER6, AdcTriggerMode, ADC_CH_ADCIN14, acqps); ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER7, AdcTriggerMode, ADC_CH_ADCIN15, acqps); ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER8, AdcTriggerMode, ADC_CH_ADCIN13, acqps); //for MCU Temperature ADC_setInterruptSource(ADCA_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER8); ADC_enableInterrupt(ADCA_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1); //ADCB ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER0, AdcTriggerMode, ADC_CH_ADCIN0, acqps); ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER1, AdcTriggerMode, ADC_CH_ADCIN1, acqps); ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER2, AdcTriggerMode, ADC_CH_ADCIN2, acqps); ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER3, AdcTriggerMode, ADC_CH_ADCIN3, acqps); ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER4, AdcTriggerMode, ADC_CH_ADCIN4, acqps); ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER5, AdcTriggerMode, ADC_CH_ADCIN5, acqps); // ADC_setInterruptSource(ADCB_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER5); // ADC_enableInterrupt(ADCB_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(ADCB_BASE, ADC_INT_NUMBER1); //ADCC ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER2, AdcTriggerMode, ADC_CH_ADCIN2, acqps); ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER3, AdcTriggerMode, ADC_CH_ADCIN3, acqps); ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER4, AdcTriggerMode, ADC_CH_ADCIN4, acqps); ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER5, AdcTriggerMode, ADC_CH_ADCIN5, acqps); // ADC_setInterruptSource(ADCC_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER3); // ADC_enableInterrupt(ADCC_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(ADCC_BASE, ADC_INT_NUMBER1); //ADCD ADC_setupSOC(ADCD_BASE, ADC_SOC_NUMBER0, AdcTriggerMode, ADC_CH_ADCIN0, acqps); ADC_setupSOC(ADCD_BASE, ADC_SOC_NUMBER1, AdcTriggerMode, ADC_CH_ADCIN1, acqps); ADC_setupSOC(ADCD_BASE, ADC_SOC_NUMBER2, AdcTriggerMode, ADC_CH_ADCIN2, acqps); ADC_setupSOC(ADCD_BASE, ADC_SOC_NUMBER3, AdcTriggerMode, ADC_CH_ADCIN3, acqps); ADC_setupSOC(ADCD_BASE, ADC_SOC_NUMBER4, AdcTriggerMode, ADC_CH_ADCIN4, acqps); ADC_setupSOC(ADCD_BASE, ADC_SOC_NUMBER5, AdcTriggerMode, ADC_CH_ADCIN5, acqps); // ADC_setInterruptSource(ADCD_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER5); // ADC_enableInterrupt(ADCD_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(ADCD_BASE, ADC_INT_NUMBER1); } void AdcIntInterruptClear() { ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(ADCB_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(ADCC_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(ADCD_BASE, ADC_INT_NUMBER1); } void AdcIntEocState() { //제일 오래걸리는 체널만 체크 while (ADC_getInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1) != 0x01) { if (CntWaitAdcEoc++ > SetWaitAdcEoc) { //Internal Adc Read Error CntWaitAdcEoc = 0; Flag_ErrEoc = 1; break; } else { Flag_ErrEoc = 0; } } AdcIntInterruptClear(); }