STM32F103RETx 에서 구현 함.
CubeIDE 에서 클럭은 12MHz XTAL로 들어오고 있고
TIM3를 사용해야 하니까 APB1 의 클럭을 보면 된다.
TIM1/TIM8은 APB2에 있네
APB1 Timer clocks는 6MHz
핀에서 TIM3_CH1 / TIM3_CH2 로 할당하고
Timers - TIM3 에 가서
clock source를 internal clock 으로 바꾸고
channel 1과 channel 2를 PWM Generation CH1/2로 지정해 준다.
그리고 prescaler를 5999 (6000-1) 으로 해주면 6MHz / 6000 이니 1msec 를 1tick으로 쓰고
counter Period를 0~9 까지 10을 묶어서 10msec 마다 1번의 pwm을 발생하게 한다
※ 다르게 표현하면 100Hz PWM clock 으로 지정된다.
그리고 PWM Generation Channel 1/2 에서 Pulse (16 bits value) 에는
counter Period 값을 분모로 하는 값을 지정하면 되고 "Pulse / Counter Period"로 Duty Rate이 지정된다.
그러면 50% duty로 100Hz의 PWM 파형이 생성된다.
약간의 꽁수로(?) 아래와 같이 해주면
50ms 마다 1씩 변화되어 20번의 증감을 통해 1초 주기로 점멸하는 LED가 생성된다.
50ms 마다 바꾸는 것도 다른 타이머를 이용하면 메인 쓰레드에서 안해도 되니 정확한 타이밍이 될 듯.
static int pwm_val = 0; static int dir = 1;
if(dir) { if(pwm_val < 10) pwm_val++; else { dir = 0; pwm_val--; } } else { if(pwm_val > 0) pwm_val--; else { dir = 1; pwm_val++; } } // printf("pwm_val[%d] dir[%d]\n", pwm_val, dir); htim3.Instance->CCR1 = pwm_val; htim3.Instance->CCR2 = pwm_val; HAL_Delay(50); |
[링크 : https://pilimage.tistory.com/23]