
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
//-------------------------------------------------------//
// 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 <CommonLib.h>
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();
}