LED Dimming을 하기 위해서는 먼저 PWM을 생성해야 한다.
PWM이란 무엇인가?
Pulse Width Modulation으로 쉽게 설명하면 펄스를 만들어 제어한다고 생각하면 될 것 같다.
PWM을 사용하려면 타이머를 설정해주어야한다.
먼저 보드에서 PWM을 출력할 수 있는 단자를 확인하자
TIM3의 채널 1번이 CN4의 D4포트를 이용하여 사용할 수 있다는 것을 알 수 있다.
Timers항목의 TIM3의 Channel1을 PWM Generation CH1로 선택한다.
PWM의 주파수와 주기 등을 설정해야하는데 다음과 같은 항목들을 조정하여 가능하다.
먼저 사용한 클럭을 알아야하는데 클럭은 32MHz로 선택을 하였었다. (Clock Configuration 에서 설정 및 확인 가능)
그 다음 Prescaler , Counter Period, Pulse 등을 설정해야한다.
Prescaler란?
단순히 생각하면 우리가 사용하는 타이머 클럭을 적정한 수로 나누어 사용하기 쉬운 값으로 변환하는 값이라고 생각하면 된다.
예를 우리의 타이머 클럭은 32MHz인데 이는 너무 큰 주파수 값이므로
Prescaler를 32로 하면 1MHz , 320으로 하면 1000KHz, 3200으로 하면 100KHz등의 주파수로 변환할 수 있게된다.
Counter Period?
Prescaler를 통해서 낮춘 타이머 클럭 펄스마다 타이머의 Counter가 1씩 증가된다.
설정한 Counter Period에 도달하면 Counter Period는 0이 되고 하나의 PWM 펄스를 출력한다.
이렇게 Counter Period를 증가시키고 0을 만들고 반복하며 PWM 펄스를 만들 수 있다.
클럭이 32Mhz일 때, 1Khz의 PWM을 만들고 싶다면?
1. Prescaler = 32, Counter Period = 1000 인 경우
- 타이머 클럭을 Prescaler로 나누면 32MHz / 32 = 1 MHz, 1/1000000초 마다 Count가 1씩 증가
- Counter Period가 1000이므로 1000까지 도달하는데 걸리는 시간은 1/1000000 * 1000 = 1/1000초
- Counter Period를 0으로 만들고 다시 Count 증가를 반복하며 PWM 펄스 출력
- Counter Period가 1000이되는데 걸리는 시간인 1/1000초
- 1/1000초, 즉 1Khz마다 PWM 펄스를 출력 - > 1Khz의 PWM 생성
2. Prescaler = 3200, Counter Period = 10 인 경우
- 타이머 클럭을 Prescaler로 나누면 32MHz / 3200 = 10khz, 1/10000초 마다 Count가 1씩 증가
- Counter Period가 10이므로 10까지 도달하는데 걸리는 시간은 1/10000 * 10 = 1/1000초
- Counter Period를 0으로 만들고 다시 Count 증가를 반복하며 PWM 펄스 출력
- Counter Period가 1000이되는데 걸리는 시간인 1/1000초
- 1/1000초, 즉 1Khz마다 PWM 펄스를 출력 - > 1Khz의 PWM 생성
등등 Prescaler와 Counter Period를 조정하여 PWM의 주기를 설정할 수 있다.
1번 상황을 이용하여 PWM 세팅을 하였다.
Prescaler와 Count Period 모두 0부터 시작하므로 원하는 값에서 1을 빼주었다.
이제 PWM의 Duty를 설정해야한다.
PWM의 Duty 는 PWM 펄스가 발생하였을 때, 얼마만큼 High의 상태로 유지할 것인가? 라고 생각하면 편할 것 같다.
Pulse 항목에서 조절이 가능한데 Pulse의 범위는 Counter Period를 넘지 않도록 한다.
쉽게 생각해서 타이머 클럭이 Counter Period를 Count할 때, 몇개의 클럭 펄스까지 PWM을 High로 할 것인가? 라고 보면 된다.
즉 Counter Period를 1000, Pulse를 500으로 하면, Duty가 50%가 된다.
Prescaler 32, Counter Period 1000, Pulse 500 으로 실제 Duty비가 50%인 1kHz가 만들어지는지 확인하기 위해서
Code Generation하여 코드를 생성해보자.
타이머를 초기화하고 HAL_TIM_PWM_Start()함수를 쓰면 PWM이 생성된다.
HAL_TIM_PWM_Start 함수
main의 초기화 부분
실제 오실로스코프를 연결하여 확인하여 보자
(TIM3_CH1을 출력하는 CN4의 D3와 GND를 찍어서 확인하자)
1khz의 PWM이 잘 생성된 것을 확인할 수 있다.
이 PWM을 LED에 연결하면...
(저항은 220옴이 없어서 600옴 저항을 병렬로 연결하여 사용하였다)
1khz, 즉 1ms의 주기에 Duty가 50%이므로 0.5ms 간격으로 켜졌다 꺼졌다 하지만 사람 눈에는 계속 켜져있는 것으로 보인다.
이제 PWM을 만들었고, LED에 불도 켰으니...
PWM의 Duty를 요리조리 만지면 LED Dimming을 할 수 있을 것 같다.
언제? 다음글에....
끝