본문 바로가기

[TI]/TM4C

TM4C123 - ADC 테스트

TM4C123 - ADC 테스트




TM4C123에는 독릭적으로 동작하는 2개의 12비트 ADC가 있고 16채널 입력이 가능하다.

아래 그림과 같이 각각 인터럽트 처리 가능하고 트리거 입력 받을수 있다.



요즘 MCU들은 대부분 하드웨어 필터를 내장하고 있는데...  TM4C123은 하드웨어 평균필터 (Hardware averaging of up to 64 samples) 가 있다. 성능은 좀더 들여야 봐야 하겠지만 약간은 아쉬운 부분이 아날로그 파트인것 같다.





TM4C123 ADC 블록도

4개의 FIFO와 Sample Sequencer이 있다.

[TM4C123 EVM] 보드에서 ADC0는 PE3 에 연결되어 있고 원하는 ADC 채널 및 Sequencer에서 AD결과값을 읽어올 수 있다.



TM4C123에는 4개의 Sample Sequencer이 있고 아래과 같이 1~8 스텝을 설정 할 수가 있다.





TM4C123 ADC 테스트 예제

 4개의 Sample Sequencer가 있기 때문에 다채널 ADC입력 받을경우 상당히 편리하게 처리할 수 있다.


//sample sequence 1 에 steps 0, 1 , 2를 설정

ADCSequenceStepConfigure(ADC_BASE, 1, 0, ADC_CTL_CH0);

ADCSequenceStepConfigure(ADC_BASE, 1, 1, ADC_CTL_CH1);

ADCSequenceStepConfigure(ADC_BASE, 1, 2, ADC_CTL_CH2 | ADC_CTL_IE | ADC_CTL_END)


//sample sequence 3에  step 0를 설정

ADCSequenceStepConfigure(ADC_BASE, 3, 0, ADC_CTL_TS | ADC_CTL_END);




TM4C123 ADC 핀맵

12개의 ADC입력 채널이 아래와 같이 할당되어 있다.




TM4C123 ADC 초기화 함수

// Function Routine

//ADC Initialize

void AdcInit(void)

{

    //ADC enable 

    SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);


    //ADCProcessorTrigger()에서 ADC 시작. 프로세서 트리거가 일어날때 작동한다.   

    ADCSequenceConfigure(ADC0_BASE, SEQUENCE_NUM, ADC_TRIGGER_PROCESSOR, 0);

    

    //ADC0의 sequence를 구성한다.sequence number 0인 ADC를 single ended mode로 setting   

    ADCSequenceStepConfigure(ADC0_BASE, SEQUENCE_NUM, 0, ADC_CTL_IE | ADC_CTL_END | ADC_CTL_CH0);       


    //ADC를 사용 가능하게 해준다.   

   ADCSequenceEnable(ADC0_BASE, SEQUENCE_NUM);  

   ADCIntClear(ADC0_BASE, SEQUENCE_NUM);

}



TM4C123 ADC 데이터 읽기

//Read ADC Value

unsigned long AdcRead(unsigned char port)

{

unsigned long adc_result[NUM_OF_ADC];

ADCProcessorTrigger(ADC0_BASE, SEQUENCE_NUM);   


//sample sequence 가 완료될때 까지 대기한다.   

while(!ADCIntStatus(ADC0_BASE, SEQUENCE_NUM, false)){}  

    ADCIntClear(ADC0_BASE, SEQUENCE_NUM);


//ADC  Data Read

    ADCSequenceDataGet(ADC0_BASE, SEQUENCE_NUM, &adc_result);

return adc_result[port];

}




TM4C123 ADC 하드웨어 필터 설정


// Enable 8x hardware averaging

ADCHardwareOversampleConfigure(ADC_BASE, 8);





TM4C123 ADC - 온도 센서

TM4C123 칩내부에 온도 센서가 내장되어 있고 이를 이용하여 온도 측정을 할수 있다. 

온도 센서에서 온도 값을 구하는 식은 아래와 







        ADCIntClear(ADC0_BASE, 1);

        ADCProcessorTrigger(ADC0_BASE, 1);

        while(!ADCIntStatus(ADC0_BASE, 1, false))

        {

        }

        ADCSequenceDataGet(ADC0_BASE, 1, ui32ADC0Value);

        ui32TempAvg = (ui32ADC0Value[0] + ui32ADC0Value[1] + ui32ADC0Value[2] + ui32ADC0Value[3] + 2)/4;

        ui32TempValueC = (1475 - ((2475 * ui32TempAvg)) / 4096)/10;

        ui32TempValueF = ((ui32TempValueC * 9) + 160) / 5;

        

        DebugPrint("AIN0 = %d, %d\r", ui32TempAvg, ui32TempValueC);

        

        Led1On();

        Delay(300);

        Led1Off();

        Delay(300);   




반응형