스마트디바이스실습 ‐ 4주차 - jiho0419/SmartDevice_2025-1 GitHub Wiki
1️⃣ PWM (Pulse Width Modulation)
*️⃣ 정의
💠 PWM(Pulse Width Modulation)은 전력을 제어하는 방식 중 하나로, 신호의 펄스 폭(듀티 사이클, Duty Cycle) 을 조절하여 출력 전압이나 전류를 조정하는 기법을 말한다.
💠 주로 모터 제어, LED 밝기 조절, 오디오 신호 처리, 전력 변환 등의 분야에서 사용된다.
*️⃣ 기본 원리
💠 PWM은 고정된 주파수 를 가지면서 ON과 OFF를 반복하는 디지털 신호를 말하며 ON 상태인 시간(High 신호)이 전체 주기에서 차지하는 비율을 Duty Cycle(듀티 사이클) 이라고 말한다.
🔸 Duty Cycle (%) = (High Time / Total Period) × 100
🔸 0% → 항상 OFF (출력 0V)
🔸50% → High와 Low의 비율이 동일
🔸100% → 항상 ON (출력 최대)
🔹 예를 들어, PWM 신호의 주파수가 1kHz이고 듀티 사이클이 50%라면, 1ms 동안 0.5ms는 High, 0.5ms는 Low 상태가 된다.
*️⃣ 특징 및 장점
💠 전력 효율이 높음
🔸 PWM 방식은 전력 손실을 최소화하여 효율적으로 에너지를 제어 가능
💠 디지털 방식으로 구현 가능
🔸 마이크로컨트롤러(MCU)나 타이머 회로를 이용해 쉽게 생성 가능
💠 아날로그 신호를 디지털로 대체 가능
🔸 PWM을 이용해 아날로그 출력(예: 전압, 전류)을 제어 가능
💠 다양한 응용 가능
🔸 LED 밝기 조절, DC 모터 속도 제어, 오디오 신호 생성, 스위칭 전원 공급기(SMPS) 등에 활용
*️⃣ 주요 응용 분야
💠 DC 모터 속도 제어
🔶 PWM의 듀티 사이클을 조절하여 모터에 공급되는 평균 전압을 조정하면 모터의 속도를 제어 할 수 있다.
🔸 듀티 사이클이 높을수록 모터가 더 빠르게 회전
🔸 듀티 사이클이 낮을수록 모터 속도가 감소
💡 예) 듀티 사이클 50% → 평균 전압 6V (12V 전원 사용 시)
💠 LED 밝기 조절
🔶 LED에 흐르는 전류를 조절하는 대신, PWM을 사용하면 사람의 눈에는 밝기가 조절되는 것처럼 보인다.
🔸 듀티 사이클이 높을수록 LED가 더 밝음
🔸 듀티 사이클이 낮을수록 LED가 어두워짐
💠 오디오 신호 처리
🔸 PWM을 사용하여 오디오 신호를 생성하거나, DAC(디지털-아날로그 변환기) 없이 오디오 출력을 생성할 수 있다.
💠 스위칭 전원 공급기(SMPS)
🔸 PWM은 스위칭 전원(SMPS) 에서 효율적인 전압 변환을 위해 사용됩니다. 높은 전력 효율을 유지하면서도 출력 전압을 조절 가능하다.
*️⃣ 한계점
💠 고주파 노이즈 발생 가능
🔸 PWM 신호의 빠른 스위칭으로 인해 고주파 노이즈(EMI)가 발생할 수 있으며, 이를 방지하기 위해 필터(인덕터, 커패시터)를 사용할 수 있다.
💠 부하에 따른 반응성 문제
🔸 일부 부하는 PWM 신호를 그대로 사용할 수 없으며, 저역 필터를 사용해 아날로그 신호로 변환해야 한다.
💠 해상도(Resolution) 제한
🔸 MCU에서 PWM을 생성할 때, 해상도가 낮으면 미세한 제어가 어려울 수 있다.
*️⃣ 주요 개념
개념 | 설명 |
---|---|
듀티 사이클 (Duty Cycle) | High 신호가 전체 주기에서 차지하는 비율 (%) |
주파수 (Frequency) | PWM 신호의 반복 속도 (Hz) |
해상도 (Resolution) | PWM 신호를 표현할 수 있는 단계 (8비트 = 256단계) |
PWM 필터링 | PWM 신호를 부드러운 아날로그 신호로 변환 |
*️⃣ 실습
💠 PWM 출력을 이용하여 LED 밝기를 조절하는 실습을 진행
💠 회로 연결
🔸 LED 모듈
🔸 S: D4
🔸 VCC: 3.3V
🔸 GND: GND
🔹 버튼 모듈
🔹 S: D33
🔹 VCC: 3.3V
🔹 GND: GND
💠 코드
const int ledPin = 4;
int brightness = 0;
void setup() {
ledcAttach(ledPin, 5000, 8);
}
void loop() {
for (brightness = 0; brightness <= 255; brightness++) {
ledcWrite(ledPin, brightness);
delay(10);
}
for (brightness = 255; brightness >= 0; brightness--) {
ledcWrite(ledPin, brightness);
delay(10);
}
}
💠 실행 결과
https://github.com/user-attachments/assets/192e265b-ca16-4820-986f-b4edd235f2ea
1️⃣ ADC (Analog to Digital Converter)
*️⃣ 정의
💠 ADC는 아날로그 신호(Analog Signal)를 디지털 신호(Digital Signal)로 변환 하는 장치 또는 기능을 의미한다.
💠 아날로그 신호는 연속적인 값(예: 온도, 소리, 전압 등)을 가지지만, 디지털 신호는 0과 1로 표현되므로, ADC를 통해 디지털 시스템이 이해할 수 있는 형태로 변환해야 하기 때문이다.
*️⃣ 기본 원리
💠 샘플링 (Sampling)
🔸 아날로그 신호에서 일정한 시간 간격으로 값을 측정하여 샘플을 추출한다.
🔸 샘플링 주파수(샘플링 속도, Sampling Rate)는 나이퀴스트 샘플링 이론에 따라 최소한 입력 신호 주파수의 2배 이상이어야 한다.
💠 양자화 (Quantization)
🔸 샘플링된 신호를 디지털 값으로 근사하여 변환한다.
🔸 ADC의 해상도(bits)가 높을수록 더 정밀한 변환이 가능하다.
💠 인코딩 (Encoding)
🔸 양자화된 값을 이진수(0과 1)로 변환하여 출력한다.
*️⃣ 특징
💠 해상도 (Resolution)
🔸 ADC의 해상도는 변환할 수 있는 비트 수를 의미한다.
🔺예: 8-bit, 10-bit, 12-bit, 16-bit 등
🔸N비트 ADC는 2^N개의 서로 다른 값을 표현 가능
🔺예) 8비트 ADC → 2⁸ = 256 단계
🔺예) 12비트 ADC → 2¹² = 4096 단계
🔸해상도가 높을수록 더 세밀한 변환이 가능하지만, 변환 속도가 느려질 수 있다.
💠 참조 전압 (Reference Voltage, Vref)
🔸 ADC가 변환할 수 있는 최대 전압 범위를 결정한다.
🔸 변환 값은 디지털 값 = (입력 전압/참조 전압) * (2N -1) 으로 계산한다.
*️⃣ 종류
💠 플래시 ADC (Flash ADC)
🔸 가장 빠른 ADC 방식
🔸 전압 비교기(Comparator) 를 사용하여 모든 가능한 값과 동시에 비교 후 변환
🔸 단점: 회로가 복잡하고, 해상도가 높아질수록 비용 증가
🔸 용도: 초고속 신호 처리 (오실로스코프, RF 신호 처리)
💠 계단식 ADC (Successive Approximation Register, SAR ADC)
🔸 일반적인 마이크로컨트롤러(예: Arduino, STM32) 에서 가장 많이 사용됨
🔸 이진 탐색 방식 으로 변환 (비교기와 SAR 레지스터 사용)
🔸 장점: 적절한 속도와 높은 해상도를 제공
🔸 단점: 래시 ADC보다 속도가 느림
🔸 용도: 센서 데이터 측정 (온도, 압력, 가속도 센서 등)
💠 시그마-델타 ADC (Sigma-Delta ADC)
🔸 **고해상도 ADC (16-bit 이상)**에 사용됨
🔸 오버샘플링 과 노이즈 제거 필터 를 활용하여 높은 정밀도를 제공
🔸 단점: 변환 속도가 느림
🔸 용도: 초고속 신호 처리 (오실로스코프, RF 신호 처리)오디오 신호 처리, 정밀 계측기
💠 듀얼 슬로프 ADC (Dual Slope ADC)
🔸 **적분기(Integrator)**를 사용하여 입력 신호를 변환
🔸 장점: 노이즈에 강함, 높은 정확도
🔸 단점: 속도가 느림
🔸 용도: 멀티미터, 계측기
*️⃣ 응용 분야
💠 온도 센서 (Thermistor, TMP36, LM35 등)
💠 조도 센서 (LDR, 포토다이오드)
💠 오디오 신호 변환 (마이크 입력 → 디지털 음성 신호)
💠 산업용 계측기 (전압, 전류, 저항 측정 등)
💠 의료기기 (심전도, 혈압 측정 등)
*️⃣ ADC vs DAC 비교
비교 항목 | ADC (아날로그 → 디지털) | DAC (디지털 → 아날로그) |
---|---|---|
변환 방향 | 연속적인 아날로그 신호 → 이진 데이터 | 이진 데이터 → 연속적인 아날로그 신호 |
주요 기능 | 센서 값 읽기, 신호 변환 | 오디오 출력, PWM 생성 |
예제 | 온도 센서, 조도 센서 | 오디오 앰프, 모터 제어 |
*️⃣ 실습
💠 가변 저항 값을 읽어 LED 밝기를 조절하는 실습을 진행
💠 회로 연결
🔸 LED 모듈
🔸 S: D4
🔸 VCC: 3.3V
🔸 GND: GND
🔹 가변 저항 모듈
🔹 S: D34
🔹 VCC: 3.3V
🔹 GND: GND
💠 코드
const int potPin = 34; // 가변저항이 연결된 핀
const int ledPin = 4; // LED가 연결된 핀
void setup() {
// PWM 채널 설정 및 핀 연결
ledcAttach(4, 5000, 8);
}
void loop() {
int potValue = analogRead(potPin); // 가변저항 값 읽기 (0~4095)
int brightness = map(potValue, 0, 4095, 0, 255); // 0~255로 매핑
ledcWrite(ledPin, brightness); // LED 밝기 설정
delay(10);
}
💠 실행 결과
https://github.com/user-attachments/assets/0e8d3441-490b-4cc6-b942-2129c25c6969