본문 바로가기
임베디드SW/TC275 Lite Kit for 임베디드

PWM을 임베디드 세계에서 바라보자 - 구현편 (3)

by 바이너리 임베디드 2021. 12. 21.
PWM
PWM을 임베디드 세계에서 바라보자 - 구현편 (3)

 

 

PWM을 임베디드 SW 세계로 바라보자 - 구현 편 (3)

 

 

와우 드디어 대망의 PWM 구현편 마지막 글이 될 것 같습니다.
지금까지 GTM_TOM_PWM_1_KIT_TC275_LK에 관한 예제 코드를 천천히 분석해 보았습니다.
1편에서는 GTM_TOM 모듈의 클럭이 어디로부터 왔는지를 살펴보았습니다.
아직 못 보신 분들은 아래 링크를 꼭 확인해주세요.

https://cookbook.tistory.com/29

 

PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1)

저번 편에서는 PWM이 무엇인지 이론 편을 보았다면 오늘은 PWM 구현을 한번 해보도록 하겠습니다. 구현 방법은 Aurix에서 제공해주는 PWM Example Code를 Import 해보고 Code를 분석해보는 ..

cookbook.tistory.com


2편에서는 GTM_TOM 모듈을 iLLD를 통해서 초기화하는 것을 분석해 보았습니다.
이번 글을 이해하시기 위해서는 아래 링크를 통해 꼭 읽고 오시기 바랍니다.

https://cookbook.tistory.com/30

 

PWM을 임베디드 SW 세계로 바라보자 - 구현편 (2)

TC275 Lite Kit를 통해 이론과 실습을 통해 임베디드의 세계를 맛보고 있는 중입니다. 저번 시간에는 GTM 모듈을 통해 PWM을 만들어보고 있었습니다. GTM 클럭이 어디로부터 와서 어떤 클럭을 사용하고

cookbook.tistory.com

 

 

While문안에서의 PWM 동작은 어떻게 하고 있나요??? 

 

 

자 이번 편에서는 이 예제 코드에서 PWM을 사용해서 어떤  동작을 하고 있는지 한번 살펴보도록 하겠습니다.

int core0_main(void)
{
    IfxCpu_enableInterrupts();
    
    /* !!WATCHDOG0 AND SAFETY WATCHDOG ARE DISABLED HERE!!
     * Enable the watchdogs and service them periodically if it is required
     */
    IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());
    IfxScuWdt_disableSafetyWatchdog(IfxScuWdt_getSafetyWatchdogPassword());
    
    /* Wait for CPU sync event */
    IfxCpu_emitEvent(&g_cpuSyncEvent);
    IfxCpu_waitEvent(&g_cpuSyncEvent, 1);
    
    /* Initialize a time variable */
    Ifx_TickTime ticksFor10ms = IfxStm_getTicksFromMilliseconds(BSP_DEFAULT_TIMER, WAIT_TIME);

    /* Initialize GTM TOM module */
    initGtmTomPwm();

    while(1)
    {
        fadeLED();                  /* Change the intensity of the LED  */
        waitTime(ticksFor10ms);     /* Delay of 10ms                    */
    }
    return (1);
}

 

 

while(1) 안에 있는 fadeLED() 함수와 waitTime(ticksFor10ms) 함수만 이해하면 될 것 같군요.

주석을 한번 참고해서 함수의 내용을 파악해보도록 합시다.

fadeLED()는 LED의 강도를 변화시킨다는 것 같고, waitTime(ticksFor10ms)는 10ms Delay를 준다는 것 같습니다.

유추해보면 LED를 점멸하는 것이 아니라 점점 밝아졌다 점점 어두워졌다를 진행하려는 것 같습니다.

그럼 한번 진짜 그런지 살펴보도록 합시다. fadeLED() 함수를 살펴보도록 하겠습니다.

 

 

/* This function creates the fade effect for the LED */
void fadeLED(void)
{
    if((g_fadeValue + FADE_STEP) >= PWM_PERIOD)
    {
        g_fadeDir = -1;                                             /* Set the direction of the fade                */
    }
    else if((g_fadeValue - FADE_STEP) <= 0)
    {
        g_fadeDir = 1;                                              /* Set the direction of the fade                */
    }
    g_fadeValue += g_fadeDir * FADE_STEP;                           /* Calculation of the new duty cycle            */
    setDutyCycle(g_fadeValue);                                      /* Set the duty cycle of the PWM                */
}

/* This function sets the duty cycle of the PWM */
void setDutyCycle(uint32 dutyCycle)
{
    g_tomConfig.dutyCycle = dutyCycle;                              /* Change the value of the duty cycle           */
    IfxGtm_Tom_Pwm_init(&g_tomDriver, &g_tomConfig);                /* Re-initialize the PWM                        */
}

 


PWM_PERIOD값은 50000이며, g_fadeValue값에 FADE_STEP (500) 값을 더한 값이 PWM의 주기 값보다 이상이 되면 g_fadeDir을 -1로 설정하고, g_fadeValue 값에서 FADE_STEP(500)을 뺀 값이 0보다 이하이면 g_fadeDir을 1로 설정한 후 FADE_STEP만큼 g_fadeValue값에 더해주는 코드입니다.

그리고 g_fadeValue값을 duty값으로 설정해주고 있습니다.

 

즉 FADE_STEP은 500/ 50000 *100 = 1% 듀티 사이클을 의미하며, 1% 듀티만큼씩 증가하다 100%가 되면 다시 0%로 듀티가 줄어드는 코드임을 알 수 있습니다.

 

 

PWM 파형을 계측해보자!

 

 

그럼 실제로 듀티가 그렇게 동작하고 있는지 로직 어널라이저로 계측을 해보겠습니다.

while문안에서 10ms Delay후에 듀티를 1%씩 변경하고 있으므로 10ms 단위로 아래 그림은 47%의 듀티를 가지고 있습니다.

그리고 10ms 단위로 잘라 그 뒤에 있는 구간에서는 48%의 듀티를 가지고 있습니다.

실제로 10ms 마다 1%씩 듀티의 변화가 있는 것을 확인할 수 있습니다.

PWM을 임베디드 세계에서 바라보자 - 구현편 (3)
PWM을 임베디드 세계에서 바라보자 - 구현편 (3)


그리고 아래는 연속적인 듀티의 변화를 확인할 수 있는 동영상입니다.

PWM을 임베디드 세계에서 바라보자 - 구현편 (3)

 

 

PWM의 1%에서 99%까지 변화의 의미

 

 

지금까지 저의 PWM의 글을 계속적으로 따라오셨다면 PWM 1%에서 99%까지 계속 변화되고 있는 것이 무엇을 의미하는지 충분히 아시리라 생각됩니다.

그래도 모르시겠다 하시는 분들이 있을 것 같아 정리해보려고 합니다.

임베디드에서 PWM을 사용할 때 대표적으로 많이 사용하는 방법이 전압 레벨 제어입니다.


예를 들어 DC 모터를 사용하게 된다면 DC 모터가 0 ~ 5V의 전압으로 동작하게 된다고 가정해봅시다.
PWM의 Duty를 100%로 출력하게 되면 평균 전압으로 치면 5V가 되게 됩니다.
그리고 PWM의 Duty를 50%로 출력하게 되면 평균 전압이 2.5V가 되게 됩니다.
그래서 PWM의 Duty로 평균 전압을 조정할 수 있게 되며 전압 레벨 제어하는 곳에 사용할 수 있게 됩니다.

그래서 우리는 PWM PIN으로 출력되는 전압이 Low에서 High로 High에서 Low로 변화되고 있다고 분석할 수 있습니다. 

 

PWM을 임베디드 세계에서 바라보자 - 구현편 (3)

 

그럼 현재 EVB에서 사용되고 있는 회로도입니다.

P00.5에 걸리는 전압이 LOW -> HIGH로 HIGH -> LOW로 변화된다면 LED에 걸리는 전압이 변화하며 LED의 강도가 LOW에 가까울 때 약해졌다가 HIGH에 가까울수록 강도가 세지는 것으로 분석할 수 있습니다.

 

 

실제 LED 동작 확인

 

 

PWM을 임베디드 세계에서 바라보자 - 구현편 (3)

LED의 강도가 약해졌다 강해졌다를 계속적으로 반복하는 것을 확인할 수 있습니다.

그럼 오늘 글은 여기까지 쓰고 마무리하도록 하겠습니다.

 

여기까지 진행하시면서 생기는 모든 질문과 답변은 아래 카페에서 해드립니다.

많이 많이 방문하셔서 실력을 업그레이드하세요.

https://cafe.naver.com/binaryembedded

 

임베디드 유니버스 : 네이버 카페

임베디드 유니버스 : 임베디드의 세계로 초대합니다.

cafe.naver.com

https://cafe.naver.com/binaryembedded

 

임베디드 유니버스 : 네이버 카페

임베디드 유니버스 : 임베디드의 세계로 초대합니다.

cafe.naver.com

댓글