STM32-PWM

이상윤·2022년 8월 30일
1

STM32

목록 보기
3/8

배경지식

PWM에서는 Capture Compare Register가 추가된다.
줄여서 CC 레지스터라고 하는데, 이 레지스터는 0부터 Period사이의 값을 갖는다.

0<=CCregister<=period<=21610 <= CC register <= period <= 2^{16} - 1 라고 정리해볼 수 있을 것 같다.

CC 레지스터의 역할은 Duty 비를 조절하는데 쓰인다.

위 두가지 경우처럼 CC 레지스터의 값과 Count 레지스터의 값이 같아질때 pin state가 토글된다.
따라서 CC 레지스터의 값을 조절하여 Duty 비를 조절한다.

실습

PWM을 통해 LED의 밝기를 조절해보는 실습을 진행했다.

보드에서 LED는 A11핀에 연결되어 있다. STM32CubeIDE의 프로젝트에서 .ioc파일을 열고
Pinout & Configuration 창에서 A11핀을 TIM1의 채널 4번으로 사용한다.

TIM1의 Parameter Settings에서 Prescaler와 Counter Period를 설정해준다.

Counter Register가 1증가하는데 걸리는 시간은 System Clock에 의해 결정된다.
System Clock이 90MHz90MHz라면 1증가하는데 걸리는 시간은 1/90,000,000(sec)1/90,000,000 (sec)이 걸릴 것이다.
Prescaler=20Prescaler = 20 이므로 1/4,500,000(sec)1/4,500,000(sec)이 걸릴 것이라고 생각 할 수 있다.

Period=45,000Period = 45,000 이므로 45,000/4,500,000=1/10045,000/4,500,000 = 1/100 이다.
따라서 한 주기는 1/100(sec)1/100(sec)이므로 100Hz100Hz임을 알 수 있다.

코드를 생성하고 메인함수 내부에 아래와 같이 코드를 작성하였다.

  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
  uint16_t ccR = 0;

  while (1)
  {
	  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, ccR);
	  if(ccR > TIM1->ARR)
	  {
		  ccR = 0;
	  }
	  if(ccR == 0){
		  HAL_Delay(2000);
	  }
	  else{
		  HAL_Delay(1000);
	  }
	  ccR += 10000;

  }

이때 __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, ccR); 함수는 아래와 같다.

#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \
  (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\
   ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\
   ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\
   ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)))

3항연산자를 중첩하여 만든 define 함수이다.
Channel 4를 사용하므로 마지막 줄이 실행되는 것이다.

고찰

코드 작성 뒤 보드에 올려 동작을 관찰해보았다. LED의 밝기가 시간에 따라 변하는 것을 확인하였다.

하지만 ccR의 값을 점점 키웠을 때, duty비 또한 점점 커져 LED가 점점 밝아질 것으로 기대하였는데 실제동작 결과는 LED가 점점 어두워졌다.

따라서 pin의 상태를 장비를 이용해 측정해보았다.

ccR이 0 -> 10,000 -> 20,000 -> 30,000 -> 40,000 총 5단계로 나눠볼 수 있는데,
파형 또한 내가 예상한대로 Duty비가 점점 커지는 것을 확인했다.

답은 회로도에 있었다.

Pin의 state가 Low일때 LED가 켜지고, High일때 꺼진다.
따라서 Duty비가 증가할 수록 어두워지는 것이 맞다.

0개의 댓글