STM32F0 PWM Duty 조절하기

STM32F0 PWM Duty 를 조절하는 예제를 포스팅했습니다.

STM32F091RC PWM목차

  1. STM32F0XX CUBEMX로 PWM클럭 설정하기
  2. STM32F0XX PWM 코드 작성하기
  3. STM32F0XX PWM 설정 부록 설명
  4. STM32F0XX PWM Duty 조절하기 (현재 포스트)

Duty를 조절하는 방법이 아두이노와 달라서 좀 애를 많이 먹었다.

그렇다고 ATmega 사용할 때 처럼 포스팅이 쉽게 되어있는 것도 아닌것 같았다.

제조사에서 메뉴얼 많이 뿌려주니 그거 읽어보고 구현해야겠다고 생각했다.

 

레지스터 살펴보기

메뉴얼을 보면 위와 같이 두 개의 레지스터가 있다.

  • TIMx_CNT : 어떠한 x타이머의 카운터 수를 저장하는 레지스터이다. 내가 사용하는 레지스터는 TIM2_CNT가 될 것이다.
  • TIMx_ARR : auto-reload register라고 해서 자동으로 반복하는 수를 저장하는 레지스터로 오해하기 딱좋다. 상한선을 지정하는 레지스터라고 이해하는 편이 좋다.
    이를테면, TIMx_ARR의 값이 99라면, 99까지 카운터가 진행되고 0으로 다시 되돌아가서 자동 반복하는 것을 의미한다.

 

타이머가 있으면 타이머 안의 채널도 있다. 예를들면, 타이머가 1개라고 가정했을 때, On Off되는 Duty의 정도를 다양하게 설정할 수도 있지 않냐는 것이다. 그래서 채널이 존재하는데, 채널1은 10%의 듀티를 가지고, 채널 2는 20%의 듀티 비를 가지는 식으로 구성이 가능하다. 따라서 타이머 1개로 채널이 6개라면, 6개의 핀의 출력 설정이 가능하다.

그럼 채널의 duty 정도를 지정할 수 있는 레지스터가 있어야하는데, 그것이 바로 TIMx_CCRy이다.

  • TIMx_CCRy : x번째 타이머의 y번째 채널의 출력을 조절할 수 있는 레지스터이다.

 

위 그림처럼, ARR은 고정되어 있지만, CCRx를 조절해 duty조절이 가능하다. OCx의 출력 결과가 위처럼 CCRx의 위로 카운터가 진행되면 ON이 되게끔 설정도 가능하고, 역으로도 가능하다.

 

그러면, 그동안 다른 레지스터는 다 만졌는데 CCR 레지스터를 못만져서 Duty비를 설정 못한 것 아닌가? 레퍼런스 메뉴얼에서 레지스터부터 찾아보자.

2번째 타이머와 1번째 채널이므로 TIM2_CCR1레지스터를 찾아보면 된다.

그냥 ARR처럼 데이터를 적으면 선 지정이 가능한가보다. 바로 코딩으로 넘어가자

참 그전에 아두이노처럼 천천히 밝아졌다가, 느려지게 하기 위해서 아두이노 환경처럼 클럭 세팅을 해두었다. 그냥 감으로 잡았달까.

 

코드 작성하기

이전에 생성한 프로젝트에서 저 데이터만 수정하면된다. Prescaler와 Period만 수정하면 된다.

 

지난 포스팅에서 while문 전에 pwm코드 한줄만 추가했었다. 이젠 while문을 만지면 된다.

위처럼 코드를 작성해 CCR1의 레지스터에 데이터를 넣으면 된다.

 

 

HAL 드라이버로 쉽게 구현하기

HAL드라이버를 사용하는 방법도 있다. 이렇게 제어하는사람은 없는 것같은데(검색해봐도 잘 안나오더라)

드라이버에다가 레지스터 검색해서 찾아보다 알아냈다. 저 코드를 적용시켜보았다.

 

위처럼 코드를 적용시켜 보았더니 위 영상처럼 결과가 나왔다.

(결과가 같으니 영상은 복붙한다.)

댓글 남기기

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.