2019.7.30 stm32 공부

HSI, HSE, PLL, etc.
https://m.blog.naver.com/PostView.nhn?blogId=thumbdown&logNo=220279578853&proxyReferer=https%3A%2F%2Fwww.google.com%2F

Buzzer - TIM3_CH4
Passive type buzzer 원하는 소리를 여러개 만들 수 있다.
Active type buzzer 전원을 인가하면 한가지 소리만 낸다.

TIM3(APB1) => 84MHz로 동작 (HCLK = 168MHz 일 때)
4kHz PWM 생성 => PSC = 1000, ARR = 21
4kHz = 84MHz를 PSC와 ARR로 나눈 값.
원하는 값으로 PSC와 ARR을 설정하면 된다.
50% Duty Cycle => CCR(Capture Compare Register) = 10 ( = ARR / 2 )
duty cycle은 소리의 크기나 높낮이와 상관 없다.

공명주파수 4kHz => 4kHz에서 출력 데시벨이 가장 높다.

PSC(Prescaler) 16bit
ARR(Auto Reload Register) = period
TCNT(Timer Counter)가 1씩 증가하다가 ARR에 저장한 값과 같아지면 업데이트 Interrupt가 발생하고 TCNT 값이 0이 된다.
stm32F407의 시스템 동작 클럭 HCLK = 168MHz
APB(Advanced Peripheral Bus)
APB1 TIM CLK = HCLK / 2 = 84MHz
=> TCNT값이 1 증가하는데 걸리는 시간 = 1/84MHz [s]
APB2 TIM CLK = HCLK = 168MHz
AHB
AMBA


/*--------------------*/
MX_TIM3_Init();

LL_TIM_EnableCounter(TIM3); // 타이머 enable
LL_TIM_CC_EnableChannel(TIM3, LL_TIM_CHANNEL_CH4); // PWM신호 출력 enable

//부저 주파수 바꿔서 음 바꾸기
// PSC나 ARR을 바꾸면 되는데 ARR을 잘못 건드리면
// PWM출력이 멈춰버리는 현상이 있다.

TIM3->PSC = 2000; // TIM3은 구조체 포인터
HAL_Delay(100); // ms 단위
TIM3->PSC = 1500;
HAL_Delay(100); // ms 단위
TIM3->PSC = 1000;
HAL_Delay(100); // ms 단위

LL_TIM_CC_DisableChannel(TIM3, LL_TIM_CHANNEL_CH4);

/*------------------------*/

Comments