4주차 스마트디바이스주차 스마트디바이스 (PWM, ADC) - jungjaeyeol/jyeol03 GitHub Wiki
1. PWM 란?
- PWM(Pulse Width Modulation, 펄스 폭 변조)은 디지털 신호를 사용하여 아날로그 값을 제어하는 기법입니다. 이 방식은 주로 전자공학에서 전압, 전력, 속도, 밝기 등을 조절하는 데 널리 사용됩니다. PWM은 신호의 주기를 일정하게 유지하면서 **펄스의 폭(High 신호가 유지되는 시간)**을 조절하여 평균 출력 전압을 바꾸는 원리로 동작합니다.
1-2 PWM의 주요 활동 분야
- 모터 제어 : 직류 모터(DC Motor)의 속도 및 토크를 제어하는 데 사용됩니다.
- LED 밝기 제어 : LED의 밝기를 조절하여 디밍(dimming) 효과를 구현합니다.\
- 오디오 신호 생성 : PWM 신호로 사운드 신호를 생성하여 스피커 제어에 응용됩니다.\
- 전원 공급 장치 : 스위칭 전원 공급 장치에서 전력 손실을 줄이고 효율을 높이는 역할을 합니다.
1-3 PWM의 장점
- 효율성: 선형 제어 방식보다 열 손실이 적어 효율이 높습니다.
- 정밀 제어: 미세한 듀티 사이클 조정으로 정밀한 제어가 가능합니다.
- 간단한 구현: 마이크로컨트롤러로 구현하기 쉬워 다양한 분야에 적용 가능합니다.
2. ADC 란?
- ADC(Analog to Digital Converter, 아날로그-디지털 변환기)는 아날로그 신호(연속적인 값)를 디지털 신호(이산적인 값)로 변환하는 장치입니다. 전자공학 및 임베디드 시스템에서 센서로부터 받은 아날로그 신호(전압, 온도, 빛 등)를 마이크로컨트롤러나 컴퓨터가 이해할 수 있는 디지털 데이터로 바꾸는 역할을 합니다.
2-1. ADC 주요 특징
1.해상도(Resolution)
- ADC의 비트 수로, 변환 가능한 단계 수를 나타냅니다.
- 예: 8비트 ADC → 2^8 = 256단계, 10비트 ADC → 2^10 = 1024단계
- 해상도가 높을수록 더 작은 변화도 감지 가능
2.샘플링 속도(Sampling Rate)
- 1초에 몇 번 샘플링하는지를 나타냅니다.
- 높은 샘플링 속도는 빠른 신호 변화도 정확히 캡처할 수 있습니다.
3.입력 전압 범위
- ADC가 수용할 수 있는 최소/최대 전압 범위를 나타냅니다.
- 일반적으로 0V ~ 기준 전압(예: 5V 또는 3.3V)
4.양자화 오차(Quantization Error)
- 아날로그 값을 제한된 비트 수로 표현하면서 생기는 오차입니다.
- 해상도가 높을수록 오차가 줄어듭니다.
2-2. ADC의 주요 활동 분야
1.센서 데이터 수집
- 온도, 압력, 빛, 습도 등 아날로그 센서 데이터를 디지털 신호로 변환
2.오디오 신호 처리
- 마이크 입력 신호를 디지털로 변환하여 음성 및 음악 신호 처리
3.전력 관리 시스템
- 전압 및 전류 모니터링
4.의료 기기
- 심전도(ECG), 뇌파(EEG) 등 생체 신호 측정
3. PWM과 ADC의 활용 (실습 1, 2)
3-1. PWM을 이용한 실습
const int ledPin = 4; // LED 핀
const int freq = 5000; // PWM 주파수
const int resolution = 8; // PWM 해상도 (0~255)
void setup() {
ledcAttach(ledPin, freq, resolution);
}
void loop() {
for (int brightness = 0; brightness <= 255; brightness++) {
ledcWrite(ledPin, brightness);
delay(10);
}
for (int brightness = 255; brightness >= 0; brightness--) {
ledcWrite(ledPin, brightness);
delay(10);
}
}
https://github.com/user-attachments/assets/7c2bf63b-7900-4aba-b0e8-b00d8a07cc5c
3-2. ADC를 활용한 실습
const int potPin = 34; // 가변 저항 연결 핀 (ADC 지원 핀)
const int ledPin = 4; // LED 연결 핀 (PWM 출력 핀)
void setup() {
// PWM 설정 (채널 자동 할당)
ledcAttach(ledPin, 5000, 8); // 주파수 5kHz, 8비트 해상도
}
void loop() {
// 가변 저항 값 읽기 (0 ~ 4095)
int potValue = analogRead(potPin);
// 0~4095 → 0~255로 매핑
int brightness = map(potValue, 0, 4095, 0, 255);
// LED 밝기 조절 (핀 기반)
ledcWrite(ledPin, brightness);
delay(10);
}
https://github.com/user-attachments/assets/fbbd1692-6ef1-4e95-afb4-da70f449ffa4
4. 알게된점
void setup() {
ledcSetup(0, 5000, 8);
ledcAttachPin(ledPin, 0);
}
- 이 코드는 3.xx 버전 이후로 지원하지 않는다.
void setup() {
// PWM 설정 (채널 자동 할당)
ledcAttach(ledPin, 5000, 8); // 주파수 5kHz, 8비트 해상도
}
- 위 코드로 바꿔서 사용해야한다.