STM32_Tutorial_10 - 8BitsCoding/RobotMentor GitHub Wiki


PWM(Pulse Width Modulation) :

  • ์ฒ˜์Œ ๊ณต๋ถ€ํ•˜๋Š” ๋ถ„๋“ค์—๊ฒŒ๋Š” ์ข€ ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ๋Š” ์ฃผ์ œ์ธ PWM์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ๋‹ค. pulse width modulation ์„ ํ•ด์„ํ•ด๋ณด๋ฉด ์•„๋‚ ๋กœ๊ทธ pulse(ํŒŒ์žฅ,ํŒŒํ˜•)๋ฅผ ๋””์ง€ํ„ธ ์‹ ํ˜ธ์˜ ๋„ค๋ชจํŒŒ์žฅ์„ ๋ชจ๋“ˆํ™” ํ•ด์„œ ํ‰๋‚ด๋‚ธ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

  • ์‰ฝ๊ฒŒ๋งํ•ด ๋””์ง€ํ„ธ ์‹ ํ˜ธ๋ฅผ ๊ฐ€์ง€๊ณ  ์•„๋‚ ๋กœ๊ทธ ์‹ ํ˜ธ๋ฅผ ํ‰๋‚ด๋‚ธ๋‹ค๋Š” ๋œป์ด๋‹ค.

์ด๋ฏธ์ง€

์ฃผ๊ธฐ๋ฅผ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค๋ฉด 2.5V๋ฅผ ์ฃผ๋Š” ํšจ๊ณผ๊ฐ€ ๋‚˜๊ฒŒ ๋œ๋‹ค.

์ด๋ฏธ์ง€

์ฃผ๊ธฐ๋ฅผ 1/4์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค๋ฉด ์•ฝ 1V๋ฅผ ์ฃผ๋Š” ํšจ๊ณผ๊ฐ€ ๋‚˜๊ฒŒ ๋œ๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ์ œ์–ดํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค.

๋ชจํ„ฐ์˜ ์†๋„, LED์˜ ๋ฐ๊ธฐ ๋“ฑ์„ ์ปจํŠธ๋กคํ• ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.


์šฐ์„ , ํƒ€์ด๋จธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ณด์ž.

์ด๋ฏธ์ง€

ARR(Auto Reload Register)์— ํŠน์ • ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ํƒ€์ด๋จธ ํด๋Ÿญ์— ๋”ฐ๋ผ ์นด์šดํŠธ๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ๊ทธ ํด๋Ÿญ๊ณผ ARR์ด ๊ฐ™๊ฒŒ ๋˜๋ฉด ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ Prescaler๋Š” ํƒ€์ด๋จธ์˜ ํด๋Ÿญ์ด ๋†’๊ธฐ์— ๊ทธ ํด๋Ÿญ์„ ์กฐ์ ˆํ•ด์ฃผ๋Š” ์ˆ˜์น˜์ด๊ณ 

APB1, 2๋Š” ์‹œ์Šคํ…œ ํด๋Ÿญ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋‚˜๋ˆ„์–ด ์‚ฌ์šฉํ•˜๋Š”์ง€ ํด๋Ÿญ ํƒ€์ด๋จธ์˜ ์„ธํŒ…์ด๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€ ์ดํ•ดํ–ˆ์œผ๋ฉด PWM์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฏธ์ง€

PWM์—ญ์‹œ ํด๋Ÿญ์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ CCR(Capture Compare Register)๋ฅผ ๋“ฑ๋ก ํ›„ ํƒ€์ด๋จธ๊ฐ€ CCR์— ๋™์ฐฉ์‹œ ๋‹ค์šด์—ฃ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ์ปจํŠธ๋กค์„ ์ง„ํ–‰ํ•˜๊ฒŒ๋œ๋‹ค.

์ด๋ฏธ์ง€

๋˜ํ•œ STM32 ํƒ€์ด๋จธ ํ…Œ์ด๋ธ” ์ค‘ Channels์€ PWM์˜ CCR์„ ๋ช‡๊ฐœ๊นŒ์ง€ ์„ธํŒ…์ด ๊ฐ€๋Šฅํ•œ์ง€์— ๊ด€ํ•œ ๊ฐ’์ด๋‹ค.

STM32F4์˜ ๊ฒฝ์šฐ Channels๊ฐ€ 4์ด๋‹ˆ 4๊ฐœ๊นŒ์ง€ ์„ธํŒ…(CCR1 ~ CCR4)์ด ๊ฐ€๋Šฅ


์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž

CubeMX ์‹คํ–‰

์ด๋ฏธ์ง€

LED๋ฅผ Timer12 CH1๋กœ ์„ค์ •

์ด๋ฏธ์ง€

Timer12์˜ ์„ธํŒ…์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊พผ๋‹ค.

์ด๋ฏธ์ง€

Configure -> Control -> TIM12๋ฅผ ๋ˆ„๋ฅธ๋‹ค.

์ด๋ฏธ์ง€

Project -> Generate Code


์ฝ”๋“œ๋ถ„์„

// main
HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1);
// ์š”๊ฑธ๋กœ ์ดˆ๊ธฐํ™”๋งŒ ํ•ด์ฃผ๋ฉด ์‚ฌ์šฉ์ด๊ฐ€๋Šฅ!

ํŽ„์Šคํญ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด??

while(1)
{
    uint16_t ccr = 0;
    __HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, ccr);
}