디지털 시스템에서는 정보를 표현하기 위해 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 신호를 생성한 것과 같은 효과를 출력하는 방법임.
◎ 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 범위, 주파수 등을 설정)
- Balanced mode(default) : 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 |