학교수업

pwm

Ynghan 2023. 10. 18. 12:43

디지털 시스템에서는 정보를 표현하기 위해 2진수 체계를 사용

"0"과 "1"로 구성된 두 종류의 디지트(digit)를 사용

논리 레벨과 펄스파형

◎ 정논리와 부논리

  • 양논리 또는 정논리
  • 음논리 또는 부논리
  • 정논리와 부논리는 모두 디지털 논리 시스템에서 이용되며, 일반적으로 정논리를 많이 사용
전압 레벨 정논리 부논리
+5V High = 1 High = 0
0V Low = 0 Low = 1

◎ 펄스파형

  • 펄스파형은 Low 상태와 High 상태를 반복하는 전압레벨로 구성
  • 주기 펄스 & 비주기 펄스로 분류

◎ 이상적인 펄스파형

  • 이상적인 주기 펄스는 두 개의 엣지로 구성
  • 상승 엣지, 하강 엣지

실제 펄스파형

주기, 주파수 및 듀티 사이클

  • 주파수(frequency)
    • 주기적인 파형이 1초 동안에 진동한 횟수
    • 단위 : 헤르츠
  • 주기
    • 주기적인 파형이 1회 반복하는데 걸리는 시간
  • 주파수와 주기의 관계

  • Duty Cycle
    • 신호의 한 주기(period)에서 신호가 켜져있는 시간의 비율을 백분율로 나타낸 수치

 

ADC와 DAC

◎ 아날로그-디지털 변환과정의 블록도

표본화(sampling) 사람의 음성인 경우, 1초동안에 8000번의 샘플링 필요
양자화(quantization) 펄스의 진폭의 크기를 디지털 양으로 변환(양자화 잡음 발생)
양자화 잡음은 미리 정한 신호레벨의 수에 의존
신호 레벨의 수를 늘리게 되면 데이터 양이 많아지는 단점이 존재
부호화(coding) 부호화는 양자화한 값을 2진 디지털 부호로 변환
일반적으로 전화음성에서는 8비트로 부호화 수행

 

PWM(Pulse Width Modulation)

  • PWM은 펄스 폭 변조(Pulse Width Modulation)의 약어이다.
  • 한 주기에 있는 High 레벨과 Low 레벨의 비율을 변화시킴으로, Analog 신호를 생성한 것과 같은 효과를 출력하는 방법임.

Duty cycle이 클수록 LED의 밝기는 증가한다.

 

PWM 사용설정

  • pinMode 함수 : GPIO 핀의 모드를 설정하는 함수
void pinMode(int pin, int mode);
  • pin : 핀 번호
  • mode : 해당 핀의 모드 설정
    • INPUT / OUTPUT / PWM_OUTPUT / GPIO_CLOCK
    • PWM0(GPIO 12, GPIO 18), PWM1(GPIO 13, GPIO 19)

 

PWM 출력 값 설정

  • pwmWrite 함수 : PWM의 Duty를 조절하는 함수
void pwmWrite(int pin, int value);
  • pin : 핀 번호
  • value : 해당 PWM 핀의 Duty 값을 설정(0 ~ 1024)

 

◎ 임의의 PWM 신호 생성

  • 라즈베리 파이에서는 2가지의 PWM 생성 모드를 지원함
    • Balanced mode(default) : PWM 주파수가 유동적으로 변화됨.
      • 모드를 변경하지 않을 경우 Balanced mode로 구동됨.
    • Mark-Space mode : 전통적인 PWM 생성 방법임.(PWM 범위, 주파수 등을 설정)

 

PWM 모드 설정

  • pwmSetMode 함수 : 출력 모드를 설정하는 함수
void pwmSetMode (int mode);
- mode : 해당 PWM 핀의 모드를 설정
    - PWM_MODE_BAL(default) : PWM 주기가 유동적으로 변화
    - PWM_MODE_MS : mark-space 모드로 설정 ( PWM 주기와 범위를 임의로 조정가능)

 

PWM 범위 설정

  • pwmSetRange 함수 : PWM의 범위(range)를 설정
void pwmSetRange(unsigned int range);
- range : PWM의 범위 값 (default : 1024)

 

PWM 나눗수 설정

  • pwmSetClock 함수 : PWM의 주파수를 설정하기 위한 나눗수를 설정하는 함수
void pwmSetClock(int divisor);

 

 PWM 설정 예시

  • PWM은 19.2MHz의 기본 주파수를 보유( µP 의존적 )
    • 1초에 파형이 19200번 진동한다.
    • 목표
      • PWM의 주파수 (1/T)를 200Hz 설정
      • PWM의 범위 (range)를 100으로 설정(PWM 분해능이라고 생각)
  • PWM의 주파수 = 19.2MHz / (Divisor(나눗수) × Range(범위))
  • 200Hz = 19.2MHz / (Divisor × 100)
  • Divisor = 19.2MHz / 200Hz × 100 = 19200000 / 20000 = 1920 / 2 = 960 
// PWM 주파수를 1kHz로 설정 : f(pwm) = 1000Hz
// PWM 범위는 200으로 설정 : Range = 200

// 1000Hz = 19.2MHz / D * 200
// D = 19200000Hz / 1000Hz * 200 = 96

//PWM 모드 설정 : void pwmSetMode(int mode);
//PWM 범위 설정 : void pwmSetRange(unsigned int range);
//PWM 나눗수 설정 : void pwmSetClock(int divisor);

//f(pwm) = 19.2MHz / Divisor * Range

#include <wiringPi.h>
#include <stdio.h>

#define PWM0 18
#define PWM1 19

int pwmControl()
{
    int duty = 0;

    pinMode(PWM0, PWM_OUTPUT);
    pwmSetMode(PWM_MODE_MS);
    pwmSetRange(200);
    pwmSetClock(96);
    
    while(1) {
        for(duty = 0; duty <= 1024; ++duty) {
            pwmWrite(PWM0, duty);
            delay(2);
        }
    }
    return 0;
}

int main()
{
    printf("PWM Example with wiringPi\n");
    wiringPiSetupGpio();
    pwmControl();
    return 0;
}

softPWM

◎ softPWM

  • wiringPi에서 제공해주는 소프트웨어적 기법의 PWM(software-driven PWM)
    • PWM 핀이 아닌 일반 GPIO도 소프트웨어적으로 PWM 신호를 생성할 수 있도록 도와줌.
  • softPWM.h 헤더 파일의 참조
  • softPwmCreate() 함수와 softPwmWrite() 함수로 쉽게 생성 가능
  • softPWM을 사용하기 위해서는 GPIO의 핀 모드를 OUTPUT으로 설정해야 함.
pinMode (gpio, OUTPUT)

 

◎ softPWM 범위 설정

  • softPwmCreate() 함수 : PWM의 범위 (range)를 설정
int softPwmCreate(int pin, int initialValue, int pwmRange)
  • pin : GPIO 핀 번호
  • initialValue : 초기 펄스 폭 (0 ~ pwmRange)
  • pwmRange : PWM 범위 (주기)
  • f(pwm) = 1 / T = 1 / 100 * 100 * 10^(-6) = 100(Hz)
  • 권장값
    • Divisor : 100 µs
    • Range : 100
    • PWM 주기 : 10ms
    • 기본 PWM 주파수 : 100Hz
    • PWM 주파수를 올리기 위해서는 펄스 시간을 낮추거나, Range를 낮추어야 함.
    • PWM 주파수가 200 Hz가 넘어가면 이상 작동
    • pwmRange 값은 50 이상으로 설정

 

◎ softPWM 범위 설정

  • softPwmCreate() 함수 : PWM의 범위(range)를 설정
int softPwmCreate(int pin, int initialValue, int pwmRange)

 

◎ softPWM 출력 값 설정

int softPwmWrite(int pin, int value)

 

'학교수업' 카테고리의 다른 글

창업 마케팅 기말 정리  (1) 2023.12.20
0315 데이터베이스  (0) 2023.03.15