반응형

 

여기서는 STM32CubeMX 5.6.1 버전을 기준으로 할 것이다.

(어짜피 버전이 달라도 UI 또는 편의성 정도의 차이일 것이기에 크게 문제될 것은 없을 것 같다.)

 

MCU는 STM32103C8Tx(LQFP 48) 기준으로 작업할 것이다.

이것 또한 MCU가 다르다고 크게 다를 것은 없다.

 

여기서 MCU의 10번 핀을 PWM 핀으로 사용해볼 것이다.

데이타시트에 보면 확인할 수 있듯이 LQFP48에 대한 10번은 TIM2_CH1 기능을 사용할 수 있도록 되어있다.

타이머 채널들은 모두 PWM이 사용 가능하다고 보면 된다.

이제 STM32CubeMX를 실행하여 MCU의 기본적인 세팅을 해준다.(크리스탈, 디버거 설정 등)

나의 경우 8MHZ 크리스탈이 달려있고 ST-LINK를 사용할 것이기에 RCC_OSC 설정을 해주었고,

PA13, PA14쪽의 SWCLK와 SWDIO 설정도 같이 해주었다.

 

이제 10번 핀(PA0)을 PWM 핀으로 설정해보도록 하겠다 해당 핀을 클릭하면 아래와 같은 메뉴가 뜬다.

여기서 TIM2_CH1을 클릭한다.

이와 같이 노란색으로 바뀌었으며 이 상태는 핀을 사용하겠다고는 했지만 디테일한 세팅이 되어있지 않은 것이다.

위와 같이 TIM2에서 Channel1을 선택한 후 PWM Generation CH1을 선택해준다.

 

이와 같이 설정이 완료된 상태로 변경되었다.

이제 가장 중요한 설정을 할 차례다.

원하는 PWM 주파수를 만들기 위해 Prescaler와 주기 값 등을 지정해주어야 한다.

아래 파라미터 설정을 보고 설명하도록 하겠다.

 

가장 중요한 세가지 값이 있다.

Prescaler와 Counter Period로 PWM 주기를 지정하고 Pulse 값으로 Duty를 지정할 수 있다.

먼저 주기를 설정하기 위해서는 나의 타이머가 얼마의 클럭으로 돌아가는가를 알아야 한다.

 

STM32CubeMX의 Clock Configuration 탭을 확인하면 다음과 같이 클럭을 확인할 수 있다.

위와 같이 APB1 Timer clocks과 APB2 timer clocks를 확인하면 된다.

자신이 어떤 타이머를 사용할지에 따라 위, 아래의 클럭 중 어떤 것을 사용하는지가 결정된다.

이 또한 아래의 데이타시트 Clock tree에서 확인할 수 있다.

이는 MCU마다 차이가 있을 수 있으므로 반드시 Datasheet를 확인해야 한다.

TIM1은 APB2를 쓰고 TIM2,3,4는 APB1을 쓴다. 

나는 여기서 TIM2_CH1을 쓸 것이니 APB1 클럭만 신경쓰면 된다.

 

200hz의 50% Duty의 PWM 파형을 만들어보도록 하겠다.

 

Prescaler = 799

Counter Period = 49

PWM Pulse = 99 

이렇게 지정하였다.

여기서 각 값들이 800, 50, 100도 아니고 1씩 떨어져있는 것을 볼 수 있는데,

이것은 각 값들이 0부터 시작하므로 실제 적용할 값에서 -1을 해주어야 한다.

이제 위 값들이 어떻게 계산되는지 알아보도록 하겠다.

 

APB Clock 이 8Mhz였으므로, 먼저 해당 클럭이 프리스케일링된다.

8,000,000 / 800 (Prescaler) = 10,000 Hz(10Khz)

 

여기서 Counter Period에 의해 200Hz로 조정된다.

10,000 Hz / 50 (Counter Priod) = 200Hz

 

이제 200Hz 주기인 PWM의 Duty를 50% 로 지정한다.

200 / 100 (Pulse) = 2 (50% Duty)

 

CubeMX 에서의 모든 설정은 마쳤다고 볼 수 있다.

여기서 모두 값을 지정해주었지만, 얼마든지 코드 상에서 값을 수정할 수도 있다.

이제 우측 상단의 GENERATE CODE를 눌러서 코드를 생성하고 해당 코드를 불러오도록 한다.

PWM 파형을 동작시키는 코드를 작성해보겠다.

 

HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); 한줄만 추가해주면 되므로 매우 간단하다. 

코드를 보면 유추할 수 있듯이 TIM2의 CH1의 PWM을 동작하도록 하는 코드이다.

이제 컴파일 후에 실행하여 결과를 확인해보면 정상적으로 PWM 파형이 발생하고 있을 것이다.

(참고로 Unknown Target 과 같은 컴파일 오류가 발생한다면 프로젝트 옵션에서 Target MCU 설정을 해주어야 한다.)

반응형

+ Recent posts