STM32L432 PWM Piezo Buzzer 학교종
어쩌다 피에조 부저가 있는데 써본적이 없어서 함 써봤다. PWM으로 소리를 내봤다.
배선
배선은 별로 어려울꺼 없이 피에조 부저의 ‘-‘를 GND에 연결하고, ‘+’는 PA5 Pin에 연결한다. PA5는 TIM2 PWM Channel1으로 사용한다.
STM32CubeMX
CubeMX로 그림과 같이 TIM2의 PWM을 설정하고 Code를 생성해준다.
Code
CubeMX에서 생성 된 코드의 main()
함수에 아래 코드를 넣어준다. CubeMX에서 생성 된 코드 중 사용자 코드는 /* USER CODE BEGIN XXX */
이런 식으로 위치가 정해져 있으니 해당 위치에 잘 넣어주면 된다.
/* USER CODE BEGIN 2 */
/* TIM2를 시작 */
HAL_TIM_Base_Start(&htim2);
/* TIM2 PWM Channel 1 시작 */
if (HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
/* TIM2에 공급되는 Clock Speed */
int PCLK1_Freq = HAL_RCC_GetPCLK2Freq();
/* 소숫점을 사용하지 않기 위해 100을 곱한 값 사용 */
enum notes {
C4 = 26163, // 도(261.63Hz)
D4 = 29366, // 래(293.66Hz)
E4 = 32963, // 미(329.63Hz)
F4 = 34923, // 파(349.23Hz)
G4 = 39200, // 솔(392.00Hz)
A4 = 44000, // 라(440.00Hz)
B4 = 49388, // 시(493.88Hz)
C5 = 52325 // 도(523.25Hz)
};
/* 학교종
* 솔 솔 라 라 솔 솔 미 솔 솔 미 미 래
* 솔 솔 라 라 솔 솔 미 솔 미 래 미 도*/
enum notes A[] = {G4,G4,A4,A4,G4,G4,E4,G4,G4,E4,E4,D4,
G4,G4,A4,A4,G4,G4,E4,G4,E4,D4,E4,C4};
while (1) {
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
for (int i = 0 ; i < sizeof(A)/sizeof(enum notes) ; i++) {
__HAL_TIM_SET_AUTORELOAD(&htim2, PCLK1_Freq / A[i] * 100);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, PCLK1_Freq / A[i] * 100 / 2);
HAL_Delay(500);
/* 각 Note 소리 내고 10 Millisecond 끊어주기 */
HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1) ;
HAL_Delay(10);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1) ;
}
/* 음악 끝나면 5초 후 반복 */
HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1) ;
HAL_Delay(5000);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1) ;
}
/* USER CODE END 3 */