๋ฐ์ํ
๐ต 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 ๋ฑ ์ถ๋ ฅ ์ฅ์น์ ๊ฒฐํฉ
๋ฐ์ํ