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비트 해상도
} 
  • 위 코드로 바꿔서 사용해야한다.