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

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

by 바이너리 임베디드 2021. 12. 10.

PWM
PWM을 임베디드 SW 세계로 바라보자


TC275 Lite Kit를 통해 이론과 실습을 통해 임베디드의 세계를 맛보고 있는 중입니다.
저번 시간에는 GTM 모듈을 통해 PWM을 만들어보고 있었습니다.
GTM 클럭이 어디로부터 와서 어떤 클럭을 사용하고 있는지 그 사용하는 클럭은 현재 어떤 Frequency를 갖고 있는지 살펴보았습니다.
생각보다 코드는 몇 줄 되지 않지만 뉴런처럼 연결되어 있는 내부 지도를 파헤쳐 보는 것은 매우 심도 있는 내용이었습니다.
아직 보지 못하신 분들은 아래 글을 꼭 읽어 보시고 오시기 바랍니다.
그래야 이번 글이 이해가 됩니다!!


https://cookbook.tistory.com/29

 

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

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

cookbook.tistory.com



그럼 PWM Example Code에서 남은 부분을 하나씩 하나씩 뜯어 살펴보도록 하겠습니다.
아래 그림에서 initGtmTomPwm() 함수에서 앞에 두줄을 저번 편에서 설명을 한 것입니다.

동그라미 1번은 PWM을 만들어 내기 위한 설정값을 Default 값으로 설정해주는 부분입니다.
그리고 2번에서 Default값으로 선언된 값을 사용자의 입맛에 맞게 재 설정을 해주고 있습니다.
그리고 3번에서는 설정된 g_tomConfig 구조체의 주소값을 넘겨주면서 iLLD에서 GTM_TOM모듈의 레지스터를 세팅해주고 있습니다. 그리고 4번에서는 GTM_TOM 모듈을 동작하라는 명령을 주고 있습니다.
그럼 레지스터 세팅이 어떻게 되어 있는지 그리고 세팅한 값대로 PWM이 어떻게 출력되고 있는지 확인해보도록 하겠습니다.

PWM을 임베디드 SW 세계로 바라보자



1번 코드
IfxGtm_Tom_Pwm_initConfig(&g_tomConfig, &MODULE_GTM);
이 API 안으로 들어가보면 아래와 같은 코드가 있습니다. 한 줄 한 줄 살펴보시죠.

PWM을 임베디드 SW 세계로 바라보자


128번째 줄
PWM Output을 만들어 주기 위해서는 인피니언 TC275 MCU에서 GTM (Generic Timer Module) 페리페럴을 사용해야 합니다.

129번째 줄
GTM 안에는 하위 페리페럴이 존재하는데 그중에서 TOM(Timer Output Module) 페리페럴을 사용하게 됩니다.
그리고 TOM은 0번에서 2번까지 총 3개가 있는데 그중에서 0번을 사용하겠다는 의미입니다.
그럼 이쯤에서 TOM Block Diagram이 어떻게 생겼는지 궁금해지기 시작합니다.
그래서 아래에 준비했습니다.

PWM을 임베디드 SW 세계로 바라보자



130번째 줄
TOM0 모듈에서 TOM_CH0 을 선택하겠다는 의미입니다. TOM_CH0은 TOM_CH0_OUT 쪽으로 TOM모듈 밖으로 PWM을 출력하게 됩니다.

131번째 줄은 저번 편에서 설명이 되었습니다.
아직 저번 편을 보시지 않았다면 지금 바로 가서 확인하신 후에 여기로 다시 오시기 바랍니다:)

132번째 줄
카운터가 20일때의 값을 Period로 하겠다는 의미입니다. 흠 그럼... CMU_FXCLK0의 값이 100 MHz이고 1 tick의 시간은 1/100,000,000 = 10ns입니다. 그렇다면 Period는 10ns * 20 = 200ns 값을 갖게 설정되어 있다고 보면 될 것 같습니다.

133번째 줄
듀티 싸이클을 10으로 하고 있습니다. 그럼 Period가 20이고 듀티 사이클은 절반인 10이므로 50%입니다. 그럼 100ns마다 High구간이 나오고 나머지 100ns에서는 Low구간이 나올 것 같습니다.

PWM을 임베디드 SW 세계로 바라보자



134번째 줄
듀티 싸이클의 High 구간으로 잡겠다는 의미입니다. 예를 들어 80% 듀티 사이클이라면 High 구간이 80%를 차지한다는 의미입니다.

135번째 줄
PWM의 Pulse를 한 번만 내보낼지 연속해서 내보낼지를 선택하는 부분인데 여기서는 FALSE이므로 계속 연속적으로 나오게 될 것입니다.

136번째 줄
PWM을 업데이트 하는 방식을 선택해주는 부분인데 이 부분은 나중에 따로 한 편의 분량의 글이 나올 것 같으므로 자세히 설명은 하지 않겠습니다. FALSE로 설정해 준다는 것은 PWM의 새로운 듀티와 주기를 갱신할 때 최대한 빠르게 해 준다는 의미로 생각하고 넘어가시죠.

137번째 줄
즉시 설정된 값으로 PWM을 출력하라는 설정입니다.

138번째 줄에서 142번째 줄은 인터럽트 설정에 관한 부분이며 현재는 사용하지 않는 것으로 세팅되어 있습니다.

143번째에서 145번째줄은 Pin 설정인데 물리적인 핀은 연결하지 않은 상태이며 Output Mode이면서 Push-pull 모드로 설정해놓기만 했습니다. 현재는 Output 핀을 지정하지 않았습니다.

1번 코드는 어느정도 설명이 된 것 같습니다.

그럼 이제 2번 코드를 살펴볼까요?

PWM을 임베디드 SW 세계로 바라보자


동그라미 2번에 1번째 줄
동그라미 1번 코드에서 Defaul값으로 TOM 모듈을 0번 사용하겠다고 했던 것을 모듈 1번으로 사용하겠다고 다시 재설정을 하고 있습니다.
동그라미 2번에 2번째 줄
동그라미 1번 코드에서 Default값으로 CH0번이던 것을 CH4번으로 다시 재설정해주었습니다.


Ctrl을 누르고 마우스로 클릭하면서 안으로 타고 들어가다 보면 결국에는 아래와 같은 값으로 세팅하고 있다는 것이죠!!

PWM을 임베디드 SW 세계로 바라보자



동그라미 2번에 3번째 줄은 period 카운트 값을 50000으로 설정하고 있네요.
그럼 다시 계산을 해볼까요? 1 tick은 10 ns 였으니까 10 ns * 50000 = 500 us가 Period가 되겠군요.
그럼 Duty 는 Default 값 10을 그대로 사용하고 있으니까 100 ns고 0.1 / 500 *100 = 0.02%의 듀티 사이클을 가질 것 같습니다. 매우 작은 듀티가 나가겠네요.

동그라미 2번에 4번째 줄은 물리적인 output 핀을 P00_5로 연결하고 있습니다. 이 핀은 현재 LED와 연결되어져 있는 핀이군요.
그럼 PWM을 계측해보기 위해서는 P00_5를 찍어보면 현재 어떤 PWM이 출력 되고 있는지 알 수 있을 것 같습니다.

동그라미 2번에 5번째 줄은 Default 값으로 False를 설정했었는데 TRUE로 다시 재설정해주었네요. 이 설정은 PWM 듀티와 주기를 SW로 갱신하게 되면 다음 주기에 반영이 된다는 뜻입니다.

3번 코드와 4번 코드는 지금까지 설정한 부분을 iLLD에서 레지스터에 세팅한다는 것이며 GTM TOM을 동작시키겠다는 뜻입니다.

와우~~ 몇줄 안되는 코드를 살펴보면 참 많은 뜻이 담겨 있습니다. 이것이 임베디드 코딩에 매력이죠!!ㅎㅎ

 

 

 


PWM을 계측해보자!


그럼 지금까지 레지스터 세팅을 해주었고 세팅한 대로 실제로 P00_5핀으로 PWM이 나가고 있는지 계측해 확인해 보도록 합시다!!!


PWM을 임베디드 SW 세계로 바라보자


프로젝트를 빌드하여 디버그 모드로 들어갑니다.
그리고 아래 부분 72번째 줄에 Break를 잡아주고 Core0를 Run 시킵니다.
그럼 우리가 지금까지 분석했던 부분에서 레지스터 세팅을 끝내고 Break 포인트 지점에 멈춰있을 것입니다.


그럼 우리는 이제 계측 장비를 이용해서 우리가 설정해준 대로 PWM이 출력되고 있는지 살펴보도록 하겠습니다. 그럼 회로도에서 X2 핀헤더에서 P00.5번을 손쉽게 연결해보도록 하겠습니다.

PWM을 임베디드 SW 세계로 바라보자


그리고 아래가 바로 측정 결과입니다.
Duty값은 0.02%이고 주기는 500us임을 확인했습니다. 듀티값이 머무 작아 Pulse형태가 잘 보이지 않는군요. 뭐 여튼 우리가 분석한 결과와 똑같은 것을 확인할 수 있습니다.

PWM을 임베디드 SW 세계로 바라보자



그럼 예제 코드를 변경해서 Duty를 50%로 변경해 볼까요? 그래야 Pulse가 눈에 잘 보일것 같습니다.
아래와 같이 변경해서 듀티를 50%로 주기는 여전히 500us로 해보겠습니다.

PWM을 임베디드 SW 세계로 바라보자



아래와 같이 Duty 50%, Period가 500us임을 확인했습니다. 이제 Pulse형태가 잘 보이는군요!!ㅎ

PWM을 임베디드 SW 세계로 바라보자



드디어 PWM 초기화하는 부분을 보았습니다.
그럼 다음 편에서는 PWM 어떤 식으로 사용하고 있는지 Application 부분을 살펴보도록 하겠습니다.

여기까지 진행하시면서 생기는 모든 질문과 답변은 아래 카페에서 해드립니다.
많이 많이 방문하셔서 실력을 업그레이드하세요.

https://cafe.naver.com/binaryembedded

 

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

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

cafe.naver.com

댓글