본문 바로가기
Embedded SW/[Infineon] TC275 Lite Project

ADC 설명 정리 및 인피니언 MCU ADC 설계 요소 정리

by 방구석 임베디드 2021. 12. 2.
반응형

안녕하세요.

오늘은 ADC(Analog-to-digital converter)가 무엇인지 알아보고,

인피니언 MCU를 이용하여 ADC를 설계하여 동작을 확인해 보도록 하겠습니다.

 

참고로 이 글은 개발의 전체적인 내용을 연재하고 있는 글이 중에 하나입니다.

그래서, 앞에쓴 글을 보시면 더욱 도움이 되실것 같습니다.

아래 글을 링크 걸어둘께요. 필요하신 분은 한번 읽어 보세요.

(물론 이 글만 보셔도 크게 문제는 없습니다.)

 

1) 임베디드 SW, MCU에 대한 정리 (feat. 임베디드 SW 비전)

https://embeddedchallenge.tistory.com/210

2) MCU 개발 장비 구매 방법 정리 (인피니언 MCU TC275 Lite)

https://embeddedchallenge.tistory.com/211

3) 임베디드 SW 개발 환경 세팅 방법 정리 (소스코드 편집기, 컴파일러, 디버거 환경 설정 방법)

https://embeddedchallenge.tistory.com/212

4) 인피니언 IDE Tool 사용방법 정리 (프로젝트 생성 및 다운로드 수행)

https://embeddedchallenge.tistory.com/219

5) 인피니언 MCU LED Blinking (TC275 GPIO 설정)

https://embeddedchallenge.tistory.com/225

6) 인피니언 MCU Clock, 오실레이터 에 대한 이해 (TC275 보드에서 확인)

https://embeddedchallenge.tistory.com/226

7) 인피니언 MCU PLL 설정 및 주변기기 Clock 설정 (TC275)

https://embeddedchallenge.tistory.com/227

8) 인피니언 MCU 인터럽트/Interrupt 설정 (TC275 동작 확인)

https://embeddedchallenge.tistory.com/228

9) 스케줄링(scheduling)에 대한 정리, 인피니언 MCU Scheduler 설계 정리

https://embeddedchallenge.tistory.com/229

10) PWM이란 무엇인가? 인피니언 MCU를 이용한 PWM 설계 수행

https://embeddedchallenge.tistory.com/232

11) Motor Driver L298N 사용법 정리 (인피니언 MCU 개발)

https://embeddedchallenge.tistory.com/235

12) DC모터 드라이버 설계, RC카 전진,후진,회전 설계 (인피니언 MCU PWM, GPIO 설정)

https://embeddedchallenge.tistory.com/236

13) UART 통신 정리, UART 통신 MCU 설계 (인피니언 MCU)

https://embeddedchallenge.tistory.com/237

14) Teraterm 시리얼 통신 터미널 프로그램 사용법, 다운로드 방법 (feat 허큘리스)

https://embeddedchallenge.tistory.com/238

15) Logic analyzer 사용법 (saleae 로직 분석기 사용법 정리)

https://embeddedchallenge.tistory.com/239

16) UART 통신 MCU Driver 초기화 설계 및 동작 확인 (Tx, Rx Interrupt)

https://embeddedchallenge.tistory.com/240

 

그럼지금부터 ADC가 무엇이지에 대해서 알아보도록 하겠습니다.

1. ADC란 무엇인가?

ADC를 먼저 위키백과에서 검색해 보도록 하겠습니다.

아날로그-디지털 변환회로는 A/D 컨버터(Analog-to-digital converter) 또는 간단하게 ADC라 하며, 
아날로그 전기 신호를 디지털 전기 신호로 변환하는 전자 회로이다

'아날로그 전기 신호를 디지털 전기 신호로 변환하는 전자회로'라는 부분이 핵심이라고 할 수 있습니다.

아날로그는 무엇을 의미하는 것일까요?

아래와 같이 건전지가 있습니다.

아래와 같이 전압을 측정하면 1.5V라는 전압이 나오는 것을 확인 할 수 있습니다.

이 값이 아날로그 값입니다.

MCU는 0~5V 사이의 값으로 다양한 전압값을 전달 받습니다.

그런데, MCU는 이러한 아날로그 값을 인식할수 있을까요?

MCU는 아날로그 값을 인식할수 없습니다.

그렇기 때문에 컴퓨터가 아는 디지털 값으로 변환을 해서 저장을 해야합니다.

 

이떄 아날로그값을 디지털 값으로 변환하는 모듈이 ADC 모듈이라고 합니다.

 

현재, 우리가 만들고 있는자동차에 탑재된 인피니언 MCU에는

ADC라는 모듈을 탑재하고 있습니다.

그리고 ADC모듈은 아날로그 전압을 디지털 신호로 변경을 해주는 역할을 수행합니다.

현재 인피니언 MCU는 8비트, 10비트, 12비트의 conversion이 가능합니다.

 

예를 들어 우리가 12bit의 conversion을 선택한다면

MCU에는 아날로그값을 12비트의 디지털 값으로 변환하여 저장합니다.

12비트면

(2^12) -1 = 4095

따라서 0~5V의 값을 0~4095로 표현할수 있습니다.

 

예를 들어 1.5V의 경우 아래와 같은 비례식으로 표현할수 있습니다.

1.5 V : 5V = x : 4095

(1.5/5) * 4095 =  1,228로 값을 획득하게 됩니다.

 

그렇다면 ADC의 결과값이 1228로 저장이 될것이니까!

저는 이것을 다시 아래 연산을 수행하여 변수에 저장하면

그 변수는 아날로그의 전압이 되는 것입니다.

(ADC_RAW x 5) / 4095 = 1.499 

*ADC_RAW = 1228

여기서 비트가 클수로 더 많은 값의 표현이 가능해 지기 때문에 분해능이 높다고 할수 있습니다.

다시말해서 8비트를 이용하여 저장할 경우

0~5V를 표현하는 과정에서 0~255의 디지털 수로 표현을 해야 합니다.

따라서 12비트보다 더 정말하게 값을 표현하기가 힘이 듬니다.

 

결국 아래와 같은 연속된 그래프가 있다면

아래와 같이 MCU는 ADC 모듈을 통하여 이산화 하여 값을 저장합니다.

그렇다면 어떠한 원리로 0~5V의 값을 12비트의 값으로 변환하는 것일까요?

 

2. ADC모듈은 어떠한 원리로 이산화를 수행하는 것일까?

아래 그림은 가장 일반적으로 사용하는 계수형 ADC입니다.

 

여기서 DAC는 Digital 값을 Analog 값으로 역으로 변환 시키는 장치입니다.

이 DAC값을 실제 아날로그 값과 Op Amp로 비교연산을 수행하여

DAC의 출력값이 Analog Input과 일치하는 순간의 Counter값을 Digital Output 값으로 획득합니다.

 

하지만 정말 빠른 변환이 필요한 경우에는

 

 

일반적인 경우에 사용이 되면

정말 빠른 ADC 변환이 필요한 경우에는 병렬비교 ADC를 사용합니다.

병렬 비교 ADC는 Voltage Divider를 통해 바로 Vin과 비교를 하여 이산값을 획득함으로

속도면에서 계수 비교 ADC 보다 성능이 좋습니다.

하지만 비싸다는 단점이 있습니다.

 

3. 인피니언 MCU ADC 설계 분석

그렇다면 지금부터 인피니언 MCU를 이용하여 ADC 설계를 수행해 보도록 하겠습니다.

많이 복잡해 보이죠?

먼저 TC275의 ADC는 2개의 독립된 Converter를 가지고 있다는 것을 알 수 있습니다.

그리고 이 Converter에게 요청하는 방법이 3가지가 있다는 것을 알 수 있습니다.

1) Queue Source

2) Scan Source

3) Background Scan Source

한개의 Converter에 이 3가지 소스를 한번에 넣을 수 있습니다.

그러면, ADC 안에 이 3가지 소스중에 중재(Arbitration)하여, 어느것을 먼저 Digital로 변환할지를

결정합니다.

3가지 소스가 일정한 순서를 가지고 변환히 된다는 것을 의미합니다.

예를들어

1) Queue Source (AD 1번 채널, AD 2번 채널)

2) Scan Source (AD 3번 채널, AD 4번 채널, AD 5번 채널)

3) Background Scan Source (AD 6번 채널)

위와 같이 그룹핑이 가능합니다.

 

그룹핑을 하게되어 ADC를 측정하게 된다면,

3가지 경우를 각각 다른 조건에서 Conversion Start가 가능하게 됩니다.

이 부분은 추후 예제를 들어서 설명하도록 하겠습니다.

 

우선, 예제에서는 Scan Source를 이용하여 ADC를 측정해 보도록 하겠습니다.

초기화 코드는 아래와 같습니다.

static void DrvAdc0Init(void)
{
    uint32    chnIx;
    IfxVadc_Adc_ChannelConfig adcChannelConfig[5];    /* create channel config */

    /* VADC Configuration */

    /* create configuration */
    IfxVadc_Adc_Config adcConfig;
    IfxVadc_Adc_initModuleConfig(&adcConfig, &MODULE_VADC);

    /* initialize module */
    IfxVadc_Adc_initModule(&g_VadcAutoScan.vadc, &adcConfig);

    /* create group config */
    IfxVadc_Adc_GroupConfig adcGroupConfig;
    IfxVadc_Adc_initGroupConfig(&adcGroupConfig, &g_VadcAutoScan.vadc);

    /* with group 0 */
    adcGroupConfig.groupId = IfxVadc_GroupId_0;
    adcGroupConfig.master  = adcGroupConfig.groupId;

    /* enable scan source */
    adcGroupConfig.arbiter.requestSlotScanEnabled = TRUE;

    /* enable auto scan */
    adcGroupConfig.scanRequest.autoscanEnabled = TRUE;

    /* enable all gates in "always" mode (no edge detection) */
    adcGroupConfig.scanRequest.triggerConfig.gatingMode = IfxVadc_GatingMode_always;

    /* initialize the group */
    /*IfxVadc_Adc_Group adcGroup;*/    //declared globally
    IfxVadc_Adc_initGroup(&g_VadcAutoScan.adcGroup, &adcGroupConfig);

    for (chnIx = 0; chnIx < 5; ++chnIx)
    {
        IfxVadc_Adc_initChannelConfig(&adcChannelConfig[chnIx], &g_VadcAutoScan.adcGroup);

        adcChannelConfig[chnIx].channelId      = (IfxVadc_ChannelId)(chnIx);
        adcChannelConfig[chnIx].resultRegister = (IfxVadc_ChannelResult)(chnIx);  /* use dedicated result register */

        /* initialize the channel */
        IfxVadc_Adc_initChannel(&adc0Channel[chnIx], &adcChannelConfig[chnIx]);

        /* add to scan */
        unsigned channels = (1 << adcChannelConfig[chnIx].channelId);
        unsigned mask     = channels;
        IfxVadc_Adc_setScan(&g_VadcAutoScan.adcGroup, channels, mask);
    }

    /* start autoscan */
    IfxVadc_Adc_startScan(&g_VadcAutoScan.adcGroup);
}

 

현재 0~4번채널을 Scan Source로 묶은 것을 확인할수가 있습니다.

 

그리고,

아래와 같이 Data를 획득하고

그리고 나서 다시 Conversion 시작을 요청합니다.

위의 예제 파일은 아래 파일을 참고해 주세요.

DrvAdc.h
0.00MB
DrvAdc.c
0.01MB

 

 

이제 전압을 아래 포트로 연결시키도록 하겠습니다.

그러면 다음 포스팅에서 어떻게 전압이 측정되는지를 확인해 보도록 하겠습니다.

반응형

댓글