PWM을 임베디드 SW 세계로 바라보자 - 구현 편 (3)
와우 드디어 대망의 PWM 구현편 마지막 글이 될 것 같습니다.
지금까지 GTM_TOM_PWM_1_KIT_TC275_LK에 관한 예제 코드를 천천히 분석해 보았습니다.
1편에서는 GTM_TOM 모듈의 클럭이 어디로부터 왔는지를 살펴보았습니다.
아직 못 보신 분들은 아래 링크를 꼭 확인해주세요.
https://cookbook.tistory.com/29
2편에서는 GTM_TOM 모듈을 iLLD를 통해서 초기화하는 것을 분석해 보았습니다.
이번 글을 이해하시기 위해서는 아래 링크를 통해 꼭 읽고 오시기 바랍니다.
https://cookbook.tistory.com/30
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의 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로 변화되고 있다고 분석할 수 있습니다.
그럼 현재 EVB에서 사용되고 있는 회로도입니다.
P00.5에 걸리는 전압이 LOW -> HIGH로 HIGH -> LOW로 변화된다면 LED에 걸리는 전압이 변화하며 LED의 강도가 LOW에 가까울 때 약해졌다가 HIGH에 가까울수록 강도가 세지는 것으로 분석할 수 있습니다.
실제 LED 동작 확인
LED의 강도가 약해졌다 강해졌다를 계속적으로 반복하는 것을 확인할 수 있습니다.
그럼 오늘 글은 여기까지 쓰고 마무리하도록 하겠습니다.
여기까지 진행하시면서 생기는 모든 질문과 답변은 아래 카페에서 해드립니다.
많이 많이 방문하셔서 실력을 업그레이드하세요.
https://cafe.naver.com/binaryembedded
https://cafe.naver.com/binaryembedded
'임베디드SW > TC275 Lite Kit for 임베디드' 카테고리의 다른 글
ADC 동작 원리 개념 이해하기 (feat. TC275 Lite Kit) (0) | 2022.01.07 |
---|---|
PWM을 임베디드 SW 세계로 바라보자 - 구현편 (2) (0) | 2021.12.10 |
PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1) (0) | 2021.12.08 |
PWM을 임베디드 SW 세계로 바라보자 (1) | 2021.12.04 |
통합 개발 환경 IDE Tool (Aurix Development Tool) 사용법 (1) | 2021.12.02 |
댓글