본문 바로가기
  • SpokeHouse
Microchip

Attiny202 - ADC 데이터 확인하기

by SpokeHouse 2024. 7. 16.
728x90
728x90

안녕하세요 스포크하우스 오토입니다.

지난번에는 GPIO 관련 포스팅 이었으니 이번에는 ADC 데이터 확인을 위한 방법에 대해 메모 포스팅 진행하겠습니다.

GPIO부터 확인하고 싶으시면 아래의 링크 확인하시면 됩니다.

2024.06.28 - [Microchip] - Attiny - GPIO - control(High_Low)

 

Attiny - GPIO - control(High_Low)

- 지난포스팅 2024.06.03 - [Microchip] - 마이크로칩 MPLAB - 프로젝트 생성 마이크로칩 MPLAB - 프로젝트 생성안녕하세요 스포크하우스 오토입니다.이번에는 마이크로칩사의 IDE 인 MPLAB프로젝트 생성에

spokehouse.tistory.com

먼저 ATtiny202핀을 확인하면

이렇게 나와있습니다. 저는 이미 구성되어있는 회로가 있어서 PA2번 핀을 사용하도록 하겠습니다.

포트는 8pin 특성상 A포트 하나뿐이고 다운로드할 때 필요한 PA0을 제외하고 다른 핀들 모두 ADC 가 가능할걸로 표시되고 있습니다.

아래는 전체 코드 내용입니다. 급하신 분들은 해당 코드 바로 사용하시면 될듯합니다.

#include <avr/io.h>
#include <stdbool.h>

uint16_t adcVal;

void ADC0_init(void);
uint16_t ADC0_read(void);
void ADC0_start(void);
bool ADC0_conversionDone(void);

void ADC0_init(void)
{
    /* Disable digital input buffer */
    PORTA.PIN2CTRL &= ~PORT_ISC_gm;
    PORTA.PIN2CTRL |= PORT_ISC_INPUT_DISABLE_gc;

    /* Disable pull-up resistor */
    PORTA.PIN2CTRL &= ~PORT_PULLUPEN_bm;

    ADC0.CTRLC = ADC_PRESC_DIV4_gc /* CLK_PER divided by 4 */
               | ADC_REFSEL_VDDREF_gc; /* Internal reference */

    ADC0.CTRLA = ADC_ENABLE_bm /* ADC Enable: enabled */
               | ADC_RESSEL_10BIT_gc; /* 10-bit mode */

    /* Select ADC channel */
    ADC0.MUXPOS = ADC_MUXPOS_AIN2_gc;

    /* Enable FreeRun mode */
    ADC0.CTRLA |= ADC_FREERUN_bm;
}

uint16_t ADC0_read(void)
{
    /* Clear the interrupt flag by writing 1: */
    ADC0.INTFLAGS = ADC_RESRDY_bm;

    return ADC0.RES;
}

void ADC0_start(void)
{
    /* Start conversion */
    ADC0.COMMAND = ADC_STCONV_bm;
}

bool ADC0_conversionDone(void)
{
    return (ADC0.INTFLAGS & ADC_RESRDY_bm);
}

int main(void)
{

    ADC0_init();
    ADC0_start();

    while (1)
    {

        if (ADC0_conversionDone())
        {
            adcVal = ADC0_read();
         
        }
    }
}

코드에 대한 전반적인 이해를 위해 잘라서 메모 진행하겠습니다.

void ADC0_init(void)
{
    /* Disable digital input buffer */
    PORTA.PIN2CTRL &= ~PORT_ISC_gm;
    PORTA.PIN2CTRL |= PORT_ISC_INPUT_DISABLE_gc;

    /* Disable pull-up resistor */
    PORTA.PIN2CTRL &= ~PORT_PULLUPEN_bm;

//adc 핀에 대한 init 부분입니다

    ADC0.CTRLC = ADC_PRESC_DIV4_gc /* CLK_PER divided by 4 */
               | ADC_REFSEL_VDDREF_gc; /* Internal reference */

    ADC0.CTRLA = ADC_ENABLE_bm /* ADC Enable: enabled */
               | ADC_RESSEL_10BIT_gc; /* 10-bit mode */

    /* Select ADC channel */
    ADC0.MUXPOS = ADC_MUXPOS_AIN2_gc;

    /* Enable FreeRun mode */
    ADC0.CTRLA |= ADC_FREERUN_bm;
}

전체적인 adc에 대한 핀 init 부분과 디비젼, voltage 레퍼런스 조정에 대한 사항들입니다.

ADC_REFSEL_VDDREF_gc 해당 부분은 측정해야하는 voltage에 따라 변경되야합니다.

꼭 참고하셔서 변경하여 사용해야합니다.

사용할 수 있는 옵션은 아래와 같습니다.

ADC_REFSEL_INTREF_gc = (0x00<<4),  /* Internal reference */
ADC_REFSEL_VDDREF_gc = (0x01<<4)  /* VDD */

Resolution 선택에 대한 부분도 옵션을 아래와 같습니다.

    ADC_RESSEL_10BIT_gc = (0x00<<2),  /* 10-bit mode */
    ADC_RESSEL_8BIT_gc = (0x01<<2)  /* 8-bit mode */

 

기본적으로 10bit이고 8bit로도 변경이 가능합니다.

나머지는 mux설정이니 뭐 특별할건 없을것같습니다.

    /* Enable FreeRun mode */
    ADC0.CTRLA |= ADC_FREERUN_bm;

마지막 부분은 계속 프리런 진행인지.. 혹은 싱글 컨버전인지 등등 설정하는 부분입니다.

아시다시피 adc는 컨버젼을 하는 시간이 필요합니다.

그래서 main문에서 볼수 있듯이 if 조건문을 통해 adc conversionDone에 대한 return값을 받아 adc 데이터를 read하는것을 확인할 수 있습니다.

이로써 간단하게 adc read에 대한 메모를 마치겠습니다.

감사합니다.

그럼 오늘도 대단히 맛있는거 많이 드세요

728x90
728x90

댓글