Category (Click)
개발보드 덕질하기

[STM32C0316-DK] 온보드 LED PWM으로 밝기 조절

 차완기 - @6/3/2023, 11:49:00 PM
지난 포스팅에서 간단한 LED 점등 예제를 만들어 보았습니다. 나중에 조이스틱 스위치를 사용해볼 때 LED의 밝기로 피드백을 주려 하기 때문에 이번에는 타이머 카운터의 PWM 생성 기능을 이용해 LED의 밝기를 조절해보려 합니다.

CubeMX 설정

핀 설정

LED와 연결된 PA5는 TIM1의 채널 1과 연결되어 PWM을 생성할 수 있습니다. PA5 핀을 클릭해 TIM_CH1을 선택한 후 TIM1 설정에서 Channel1을 PWM Generation CH1을 선택해 주었습니다.

T/C 설정

타이머의 클럭은 APB timer clock을 타이머 프리스케일러로 나누어 결정됩니다. 이때 Counter Period는 타이머가 리셋되는 클럭 수를 설정하며 타이머는 리셋될 때 마다 Pulse로 설정된 펄스 수 만큼 High를 유지합니다.
여기에서는 계산하기 편하게 타이머 클럭은 프리스케일러를 48-1로 해 1MHz로 설정한 후 Counter Period를 1000으로 해주었습니다.
HAL 드라이버에서 입력값에 1을 더하기 때문에 입력할 때 1을 빼주어야 합니다.

led_dimm bsp 모듈 생성

Bsp/bsp.h
기존의 led 모듈은 더 이상 쓸모가 없기 때문에 삭제하고 led_dimm 이라는 이름의 bsp 모듈을 새로 생성하였습니다. 당연하게도 bsp.h를 수정해야겠죠.
Bsp/led_dimm/led_dimm.h
led_dimm.h에는 위와 같이 함수를 선언하였습니다. HAL_TIM_PWM_Start()HAL_TIM_PWM_Stop() 두 함수를 init과 deinit으로 wrapping하고 led의 밝기는 백분율으로 입력받도록 하였습니다.
Bsp/led_dimm/led_dimm.c
소스 파일은 위와 같습니다.
main.c에서 선언된 htim1을 사용하기 위해 extern으로 htim1을 선언하였고 모듈 작동에 필요한 함수를 위에서 먼저 정의해주었습니다. min(), s_map() 두 함수 모두 아두이노의 그것을 그대로 가져왔습니다.
아래에서는 bsp_led_dimm 모듈의 API인 bsp_led_dimm_init()/deinit(), bsp_led_dimm_set() 함수를 정의하였습니다. bsp_led_dimm_set()에서 입력받는 인자값은 혹시나 싶어서 100으로 제한하여 CCR1 레지스터에 Counter Period인 1000을 초과하는 값이 들어가지 않도록 해주었습니다.

APP 레이어 코드 수정 및 테스트

앞에서 만든 BSP계층 함수들을 이용해 1초 간격으로 0, 50, 100 %로 밝기를 조절하게 작성해 보았습니다.
눈으로 확인할때에는 밝기 차이가 잘 나오는데, 영상으로 촬영하니 잘 보이지를 않네요.
다음은 밝기가 부드럽게 변하도록 for문을 작성해 보았습니다.

전체 소스코드

v2.0
tag
이 시점의 소스코드는 위를 참고해주세요.