본문 바로가기
  • 경제적 자유를 얻는 그날까지
엔지니어링/드론

[STM32 - 자작드론개발] PWM생성 및 부저 구동

by 베니스상인 2019. 10. 11.

 

부저는 Active 타입과 Passive 타입 두가지 방식이 있다. 

Active 타입은 High, Low의 상태에 따라 구동되는 방식이고, Passive 타입은 펄스로 구동하는 방식이다.

PWM 펄스의 주기에 따라 다양한 소리를 구현할 수 있기 때문에 Passive 방식을 사용한다.

펄스의 duty는 중요하지 않고 주기를 조정하여 소리를 다르게 만들 수 있다.

 

1. 부저 연결

Revolt FC에서 부저는 PB4에 연결되어 있으면 TR을 통해 외부핀으로 출력된다. 아래와 같이 부저를 연결해주면 된다. 왼쪽이 Buz-, 오른쪽이 Buz+로 연결하면 된다.

 

 

 

2. PWM 생성

부저를 구동하기 위해 PWM을 생성해야 한다.

PWM은 타이머를 이용하여 4kHz의 주기의 PWM을 생성한다. 부저의 공명주파수가 4kHz이기 때문에 가장 높은 소리를 내는 주기로 만든다.

 

TIM3는 APB1 Timer clock을 사용하므로 168Mhz의 절반인 84MHz로 동작한다.

 

PWM을 생생할 때 사용하는 레지스터가 2개가 있는데 Prescaler와 ARR(Auto Reload Register)이다.

Prescaler는 아래 그림에서 하나의 계단을 오르는데 사용되는 횟수이다. 즉 Prescaler가 1000이면 1000clock이 지나야 한 계단 상승하게 된다. 

ARR은 계단의 높이로 보면된다. ARR을 10이라고 하면 10계단 상승하면 다시 0으로 Reset되는 것이다. 

따라서 앞의 예를 가지고 PWM 주기를 계산하면 84MHz/1000/10 = 8400Hz가 된다. 

 

 

PWM 생성에 관해서는 ChrisP님의 STM32 강좌를 참고하면 도움이 된다.

https://www.youtube.com/watch?v=2Y_QoSYBJ0U&t=49s

 

4KHz의 주기를 만들려면 84MHz/1000/21 = 4000이기 때문에 Prescaler를 1000,, ARR을 21로 하면 된다.

입력값은 크기가 아니라 0부터 시작하는 Value이기 때문에  -1을 한 값으로 넣어준다. 

 

STM32CubeIDE의 Pinout&Configuration Tab에서 아래와 같이 입력한다.

 - Timers : TIM3

 - Clock Source : Internal Clock

 - Channel: PWM Generation CH1

 - Prescaler : 999

 - Counter Period : 20

 - Auto-reload preload : Enable

 - Mode : PWM mode 1

 - Pulse : 10

 - Fast Mode : Enable

 

저장하면 PB4번 핀으로 TIM3_CH1의 PWM 채널이 설정된 것을 확인할 수 있다.

그리고 코드를 생성할 때 HAL이 아닌 LL방식으로 코드를 생성한다.

 

 

생성된 코드를 보면 기존의 GPIO 토글 코드가 그대로 남아있는채로 TIM3 초기화 드라이버가 추가된 것을 확인할 수 있다.

 

PWM을 구동하기 위해 User Code Begin 2 부분에 아래와 같이 코드를 추가해준다.

  LL_TIM_EnableCounter(TIM3);
  LL_TIM_CC_EnableChannel(TIM3, LL_TIM_CHANNEL_CH1);

 

4kHz의 PWM은 250us의 주기를 가져야 한다.

디지털 스코프로 확인해보면 한칸이 100us 스케일이므로 5V크기의 250us PWM 펄스가 출력되는 것을 확인할 수 있다. 

 

 

 

 

 

동작이 확인되었으면 소리 변화를 확인하기 위해 아래와 같은 PWM 주기를 변경한다.

  TIM3->PSC = 2000;
  LL_mDelay(300);
  TIM3->PSC = 1500;
  LL_mDelay(300);
  TIM3->PSC = 1000;
  LL_mDelay(300);
  LL_TIM_CC_DisableChannel(TIM3, LL_TIM_CHANNEL_CH1);

 

동작소리를 확인하면 PWM 주기가 빨라지면서 3단음이 나오는 것을 확인할 수 있다.

 

728x90

댓글