본문 바로가기
Embedded SW/Embedded SW Introduction

Digital-to-Analog Converter (Pmod DA4)를 SPI를 이용하여 동작 2편 (TC275 MCU)

by 방구석 임베디드 2022. 9. 11.
반응형

안녕하세요.

SPI를 이용하여 Digital-to-Analog Converter를 작동시키는 글을

이어서 써보도록 하겠습니다.

 

우선 1편 글에서 해당 IC의 데이터시트 분석을 하였으니,

참고해 주시면 좋을 것 같습니다.

https://embeddedchallenge.tistory.com/442

 

그러면 이제 이어서 한번 개발을 해보도록 하겠습니다.

먼저 저는 VoutA 채널에 아날로그 전압을 만들어 보고 싶습니다.

그러기 위해서는 Ref 전압이 필요한데요.

먼저 아래 그림을 참고해 보시기 바랍니다.

만일 REF라고 적힌 부분에 5V가 들어가 있다면

0~4095의12비트 데이터를 디지털로 SPI를 통해 IC에 넣어주면

0~5V의 아날로그 전압을 Vout핀을 통해 내보내게 될 것입니다.

 

그런데 pmodDA4의 회로도를 살펴보면

VREFOUT핀인 현재 Open이 되어 아무런 연결이 되지 않은 것을 살펴 볼 수 있습니다.

따라서 5V에 해당하는 External Voltage를 이 핀에 연결하면 됩니다.

하지만 연결을 하지 않더라도

Internal Referene Voltage를 이용하면 1.25V의 내부 전압을 이용할 수 있습니다.

즉, 위의 그림에서 스위치를 REF쪽으로 전환을 시키면 됩니다.

이러할 경우 아래 수식을 따라서 동작을 하게 됩니다.

이 수식을 한번 풀어서 써보도록 하겠습니다.

제가 디지털 데이터 4095를 넣어서 IC에게 전달을 하면

2 x 1.25 x (4095/4095) = 2.5V

즉 IC는 2.5V의 전압을 만들어 내게 됩니다.

그리고 데이터를 2000을 넣으면

2 x 1.25 x (2000/4095) = 1.221V

즉 IC는 1.221V의 전압을 내보내야 합니다.

 

그러면 이제 한번 동작을 시켜 보도록 하겠습니다.

먼저 Command를 살펴보면

제일먼저 Internal REF register 설정을 하는것이 필요합니다.

스위치를 REF쪽으로 옮겨야겠죠!

이러한 행위는

MCU에서 이 명령을 IC쪽에 주어야 합니다.

 

그리고나서, Write to and update DA Channel 이라는 명령어를 이용하여

원하는 디지털전압을 써주면 될것 같습니다. 

 

해당 주소입니다.

명령어와 주소 및 데이터를 아래와 같은 프레임으로 구성하여

32비트로 IC칩에 전달해 주면 될것 같습니다.

그렇다면 이제 Internal Ref를 설정해보도록 하겠습니다.

위와같이 설정해서 IC에게 전달하면 된다고 하네요.

즉 이진수로 아래와 같습니다.

0000 1000 0000 0000 0000 0000 0000 0001

이것을 16진수로 변경하면

0x08000001 입니다.

여기서 0x08은 아래 명령을 의미합니다.

그 후에 이제 주소값을 넣으면 됩니다.

Header 부분을 빨갱색으로 표현해 보았고

데이터부분을 파랭색으로 표현해 보았습니다.

0x030 FFF 00

여기서 데이터 FFF는

1111 1111 1111로서 12비트가 표현할수 있는 최대값을 표현한 것입니다.

4095의 값을 썼네요!

 

그러면 이제 코드로 직접 한번 구현해 보도록 하겠습니다.

참고로, 인피니언 MCU를 이용하여 구현하였고

구현에 대한 기초적인 내용은 다음장에서 추가로 기입해 보도록 하겠습니다.

 

1) SPI Driver에서 추가한 내용

spiMasterChannelConfig.base.mode.dataWidth = 32;

 

32비트로 날려야 하니까 dataWidth를 32비트로 설정하였습니다.

위의 그림은 32비트의 데이터를 MCU에서 IC쪽으로 날리고 있는 부분을 Logic Analyzer로 캡쳐한 그림입니다.

 

2) 그리고 아래와 같이 Test Code를 만들어 보도록 하겠습니다.

void Driver_Spi_TxTest1(void)
{
    static uint8_t u8nuDaStartFlag = 0u;

    if(u8nuDaStartFlag == 0u)
    {
        Driver_Spi_InternalRefStart();
        u8nuDaStartFlag = 1u;
    }
    else
    {
        Driver_Spi_CtlVoutA();
    }
}

static void Driver_Spi_CtlVoutA(void)
{
    uint32 size = SPI_BUFFER_SIZE;
    static uint32_t u32nuTemp = 4095u;

    g_QspiCpu.qspiBuffer.spi1TxBuffer = 0u;
    g_QspiCpu.qspiBuffer.spi1TxBuffer |= 0x03000000u;
    g_QspiCpu.qspiBuffer.spi1TxBuffer |= (u32nuTemp<<8u) & 0x000FFF00u;

    /* Master transfer */
    while (IfxQspi_SpiMaster_getStatus(&g_QspiCpu.drivers.spiMasterChannel)== SpiIf_Status_busy){}

    IfxQspi_SpiMaster_exchange(&g_QspiCpu.drivers.spiMasterChannel, &g_QspiCpu.qspiBuffer.spi1TxBuffer,
        &g_QspiCpu.qspiBuffer.spi1RxBuffer, SPI_BUFFER_SIZE);

}

static void Driver_Spi_InternalRefStart(void)
{
    g_QspiCpu.qspiBuffer.spi1TxBuffer = 0x08000001u;

    while (IfxQspi_SpiMaster_getStatus(&g_QspiCpu.drivers.spiMasterChannel)== SpiIf_Status_busy){}

    IfxQspi_SpiMaster_exchange(&g_QspiCpu.drivers.spiMasterChannel, &g_QspiCpu.qspiBuffer.spi1TxBuffer,
        &g_QspiCpu.qspiBuffer.spi1RxBuffer, SPI_BUFFER_SIZE);
}

이 코드를 분석해 보면

먼저 Driver_Spi_InternalRefStart 함수가 동작하는 것을 볼 수 있습니다.

이것은 Internal REF Voltage 1.25V를 Ref Voltage로 사용하겠다는

내용입니다.

따라서 0x08000001 을 날리고 있습니다.

이것을 날려주면 이제 Internal Ref Voltage를 사용할 수 있습니다.

그리고 나서 Driver_Spi_CtlVoutA를 계속 불리게 하였습니다.

즉, or연산을 수행하면

원하는 adc값 u32nuTemp를 0~4095로 변경하여 아날로그 값을 VoutA

핀을 통해 전압을 조절하게 됩니다.

 

g_QspiCpu.qspiBuffer.spi1TxBuffer = 0u;

g_QspiCpu.qspiBuffer.spi1TxBuffer |= 0x03000000u;

g_QspiCpu.qspiBuffer.spi1TxBuffer |= (u32nuTemp<<8u) & 0x000FFF00u;

한번 Logic Analyzer로 

이 두개이 명령이 잘 전달되고 있는지 살펴 보도록 하겠습니다.

0x08000001u 을 보내고!

그리고 나서 출력하고 싶은 Digtial값 4095를 보내고 있습니다.

그렇다면 이제 VoutA를 한번 멀티미터로 찍어보도록 하겠습니다.

그러면 2.5V가 나오고 있는것을 확인하실 수 있습니다.

 

위에서 제가 미리 말씀드린 내용입니다.

제가 디지털 데이터 4095를 넣어서 IC에게 전달을 하면
2 x 1.25 x (4095/4095) = 2.5V
즉 IC는 2.5V의 전압을 만들어 내게 됩니다.

이렇게 DA를 사용하시면 될것 같네요!

 

해당 프로젝트 코드는 아래 카페에 있으니

참고하실 분들은 참고해 주시기 바랍니다.

https://cafe.naver.com/binaryembedded/144

 

51. SPI 통신을 이용하여 Digital-to-Analog Converter (Pmod DA4) 를 동작시켜 보자! (2편)

이제 SPI를 이용하여 Digital to Analog Converter를 동작시켜 보도록 하겠습니다. 우선 Datasheet를 잘 읽어야 합니다. VoutA 채널에 아날로그...

cafe.naver.com

 

반응형

댓글