ARM

A31G123ML + Keil uVision : PWM ์ถœ๋ ฅ์œผ๋กœ LED ๋ฐ๊ธฐ/๋ถ€์ € ์Œ ์กฐ์ ˆํ•˜๊ธฐ — TIMER16 ํ™œ์šฉ

๊ฒŒ์ž„๊ต์ˆ˜ 2025. 4. 18. 07:52
๋ฐ˜์‘ํ˜•

๐ŸŽต A31G123ML + Keil uVision โ€” PWM์œผ๋กœ LED ๋ฐ๊ธฐ & ๋ถ€์ € ์ œ์–ดํ•˜๊ธฐ

์ด๋ฒˆ ์‹ค์Šต์—์„œ๋Š” ABOV A31G123ML์˜ TIMER16์„ ์ด์šฉํ•˜์—ฌ PWM(Pulse Width Modulation) ์‹ ํ˜ธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , LED ๋ฐ๊ธฐ ์กฐ์ ˆ์ด๋‚˜ ๋ถ€์ € ์Œ ์กฐ์ ˆ์— ํ™œ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿงฐ ์ค€๋น„๋ฌผ

  • ABOV A31G123ML ๋ณด๋“œ
  • LED or ๋ถ€์ € (Passive)
  • 220ฮฉ ์ €ํ•ญ (LED)

๐Ÿ”Œ ํšŒ๋กœ ์—ฐ๊ฒฐ

  • P1.0 โ†’ LED(์• ๋…ธ๋“œ) โ†’ 220ฮฉ โ†’ GND
  • ํ˜น์€ ๋ถ€์ € + GND ์—ฐ๊ฒฐ (PWM ์ œ์–ด ๊ฐ€๋Šฅ)

๐Ÿ’ป ์ฝ”๋“œ ์˜ˆ์‹œ: PWM ๋“€ํ‹ฐ ๋ณ€๊ฒฝ

#include "A31G123.h"

void pwm_init(void)
{
    // P1.0 = TIMER16_0 PWM ์ถœ๋ ฅ
    PORT1->MODE |= (1 << 0);
    PORT1->OUTEN |= (1 << 0);
    PORT1->AFSR1 |= (1 << 0);  // ALT func
    PORT1->AFSR2 &= ~(1 << 0);

    SYSCON->SYSAHBCLKCTRL |= (1 << 7); // Timer16_0 enable

    TIMER16_0->TCR = 0x02;    // Reset
    TIMER16_0->PR = 0;        // Prescaler
    TIMER16_0->MR0 = 1000;    // ์ฃผ๊ธฐ (PWM ์ฃผ๊ธฐ)
    TIMER16_0->MR1 = 300;     // ๋“€ํ‹ฐ๋น„ (30%)
    TIMER16_0->MCR = (1 << 1); // Reset on MR0
    TIMER16_0->EMR = (1 << 6) | (3 << 4); // PWM mode on MR1
    TIMER16_0->PWMC = (1 << 1); // PWM enable on MR1

    TIMER16_0->TCR = 0x01;    // Enable
}
int main(void)
{
    pwm_init();
    while (1) {
        // ๋”œ๋ ˆ์ด ์—†์ด PWM ์ž๋™ ์ถœ๋ ฅ ์ค‘
    }
}

MR1 ๊ฐ’์„ ์กฐ์ ˆํ•˜๋ฉด ๋ฐ๊ธฐ๋‚˜ ์Œ ๋†’์ด๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์š”.
ex) MR1 = 900; โ†’ ๋ฐ๊ฒŒ / MR1 = 100; โ†’ ์–ด๋‘ก๊ฒŒ

โœ… ํ™•์ธ ํฌ์ธํŠธ

  • LED ๋ฐ๊ธฐ ๋˜๋Š” ๋ถ€์ € ์Œ ๋†’์ด๊ฐ€ ์กฐ์ ˆ๋จ
  • MR0 = ์ „์ฒด ์ฃผ๊ธฐ, MR1 = ๋“€ํ‹ฐ(ON ์‹œ๊ฐ„)
  • MR1 ๊ฐ’ ๋ฐ”๊ฟ”์„œ ์‹ค์‹œ๊ฐ„ ๋ฐ๊ธฐ ๋ณ€ํ™” ๊ฐ€๋Šฅ

๐Ÿ“š ๋งˆ๋ฌด๋ฆฌ

์ด๋ฒˆ ์‹ค์Šต์—์„œ๋Š” A31G123ML์˜ TIMER16์„ ์ด์šฉํ•œ PWM ์ถœ๋ ฅ์„ ๋ฐฐ์›Œ๋ดค์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์€ ์ด PWM ์‹ ํ˜ธ๋ฅผ ์„ผ์„œ๊ฐ’์— ๋”ฐ๋ผ ์ž๋™ ์กฐ์ •ํ•˜๊ฑฐ๋‚˜, LCD/OLED ๋“ฑ ์ถœ๋ ฅ ์žฅ์น˜์™€ ๊ฒฐํ•ฉ

๋ฐ˜์‘ํ˜•