STM32 시리즈 PWM 실습해 보기 - Nucleo-G071RB
안녕하세요.
PWM에 대해서 알아보았습니다. 평가보드(NucleoG071RB)에 장착되어 있는 LED를 PWM기능을 이용해서 밝기조절을 해보겠습니다.
1. NucleoG071RB 하드웨어 확인
평가보드에 LED는 몇 개 있지만, 실제로 제어할 수 있는 LED는 1개입니다. PA5핀에 연결되어 있기 때문에 이 핀을 GPIO에서 PWM 출력으로 바꿔 밝기를 조절합니다. (평가보드마다 제어할 수 있는 LED 개수는 다릅니다.)
평가 보드에 LD4로 해서 SMD 타입으로 장착되어 있습니다.
2. 프로젝트 설정
이전 내용과 크게 변화된 것은 없으므로 새로운 STM32 프로젝트를 만들고 동일하게 RCC 설정합니다. 메인 클럭은 최대 최대 64 MHz로 설정합니다. (G071 최댓값)
1) 핀 설정
GPIO_Output 설정을 TIM2_CH1로 변경합니다.
Timer 설정으로 가서 Pin에서 설정한 TIM2_CH1에 맞게 선택합니다.
Clock Source : Internal Clock
Channnel 1: PWM Generation CH1
주기를 설정하기 위해서 Parameter Setting메뉴를 확인합니다.
이전 글에서 확인한 것처럼 분주(PSC)를 63을 입력해서 1 MHz로 만들고, 1kHz로 주기를 만들기 위해서 999를 입력합니다. 나머지 설정은 기본값으로 합니다.
저장을 해서 초기화 코드가 자동 생성되도록 합니다.
3. 소스코드 추가
주기를 설정했다면, 소스코드에서 듀티 사이클을 조절해서 LED밝기가 변화하도록 합니다.
타이머 2의 CH1을 실행합니다.
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
/* USER CODE END 2 */
점점 밝아지고(Fade In) 어두워지는(Fade Out)를 기능을 구현하기 위해서 While문 안에 __HAL_TIM_SET_COMPARE()함수를 이용해서 CCR 값이 단계별로 변경되도록 합니다.
while (1)
{
// 점점 밝아짐 (0 → 999)
for(int dutyCount = 0; dutyCount < 1000; dutyCount++)
{
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, dutyCount);
HAL_Delay(1);
}
// 점점 어두워짐 (999 → 0)
for(int dutyCount = 999; dutyCount >= 0; dutyCount--)
{
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, dutyCount);
HAL_Delay(1);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
4. 실행 결과
LD3은 전원 LED이기 때문에 최고 밝기이지만, 옆에 LD4는 듀티 사이클을 변화로 밝기가 점점 밝아졌다, 어두워졌다 변화하는 것을 확인할 수 있습니다.
위와 같이 아주 간단한 설정으로 PWM 제어하는 것을 확인해 보았습니다.
앞서 본 ADC 글을 참조해서 ADC 값 혹은 uart로 전송한 값을 dutyCount에 넣으면 사용자가 원하는 값으로 밝기가 변화는 기능으로 변경가능 합니다.
감사합니다.
<참고 자료>
1. 임베디드 컨트롤러 기초 8차시 - STEP 교육과정