+ 한국항공대학교 최차봉 교수님의 임베디드 SW 과목 내용을 정리한 글입니다.
PWM (Pulse - Width - Modulation)
디지털 시그널을 이용하여 아날로그 신호를 모방하는 방법이다.
주어진 시간동안 신호가 높은 상태(1)와 낮은 상태(0)을 반복하는 주기가 존재한다.
주기동안 높은 상태(1)의 지속 시간인 Pulse Width를 조절하여 출력을 제어한다.
analogWrite(pin, DutyValue)
+ DutyValue: 0 ~ 255
=> LED 밝기를 제어할 수 있다.
< 첫 번째 실습 - PWM으로 LED 제어하기 1 >
LED가 점점 밝아졌다 꺼졌다를 반복하는 아두이노를 제작하라.
+ LED의 극성에 주의해야한다. (+: 긴 부분, -: 짧은 부분)
void setup() {
pinMode(11, OUTPUT);
Serial.begin(9600);
}
void loop() {
for (int i = 0; i < 255; i++) {
analogWrite(11, i);
delay(10);
Serial.println(i);
}
}
< 두 번째 실습 - PWM으로 LED 제어하기 2 >
첫 번째 실습을 기반으로 LED가 점점 밝아지다가 최대치에 이르면 점점 어두어짐을 반복하는 아두이노를 제작하라.
void setup() {
pinMode(11, OUTPUT);
Serial.begin(9600);
}
void loop() {
for (int i = 0; i < 255; i++) {
analogWrite(11, i);
delay(10);
Serial.println(i);
}
for (int i = 255; i > 0; i--) {
analogWrite(11, i);
delay(10);
Serial.println(i);
}
}
< 세 번째 실습 - PWM으로 LED 제어하기 3 >
두 번째 실습에 스위치를 연결하여 Pause 기능을 추가하라.
- 스위치를 누르면 LED 변화가 정지하고, 다시 누르면 LED 변화가 정지되었던 시점부터 다시 변화한다.
int pause = 0;
int delta = 1;
volatile byte state = LOW;
int n = 0; // pwm value
void sw_pressed() {
state = HIGH;
Serial.println("Interrupt..");
}
void setup()
{
pinMode(11, OUTPUT);
pinMode(2, INPUT);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(2), sw_pressed, RISING);
}
void loop()
{
if (pause == 0) { // pause가 0이 아닐때만 진행
analogWrite(11, n);
n += delta; // PWM 값 변화 (1 or -1)
// PWM값이 1씩 증가해서 255가 되면 다음부터는 1씩 감소
if (n == 255) {
delta = -1;
}
// PWM값이 1씩 감소해서 0이 되면 다음부터는 1씩 증가
if (n == 0) {
delta = 1;
}
Serial.println(n);
}
if (state == HIGH) {
pause = pause ? 0 : 1;
Serial.print("pause= ");
Serial.println(pause);
state = LOW;
}
}
'Computer Science > Embedded Software' 카테고리의 다른 글
[Embedded Software] UART Communications 실습 (0) | 2023.10.11 |
---|---|
[Embedded Software] Serial Communications (0) | 2023.10.11 |
[Embedded Software] Interrupt 실습 (0) | 2023.09.27 |
[Embedded Software] Interrupt (0) | 2023.09.26 |
[Embedded Software] Embedded System 개발 실습 (0) | 2023.09.21 |