공대생과 공부하기/전기공학 실험 보고서

[전기전자공학 실험] 아두이노 순차 논리 회로(sequential logic circuit) : 결과보고서

전기과 팡팡이 2019. 9. 24. 14:41
728x90

<실험 결과>

1) 실험에서 작성한 각 ㅍ프로그램의 작성, 실행 및 디버깅 과정을 순서대로 자세히 기술한다.

2) 프로그램 실행 후 회로가 어떻게 동작하는지와, 관련된 측정 결과를 최대한 정확히 묘사해 기술한다.

 

<결과 분석>

3) 위 결과를 얻기 위해 사용한 핵심 함수들과 사용한 이유를 설명하고, 소스코드 각 라인이 어떤 역할을 했으며, 어떻게 실험 결과로 이어졌는지 구체적으로 분석 기술한다.

 

[소프트웨어를 이용한 D 플립플롭]

<코드>

#define D 8
#define Q 13
#define C 7

int bef;

void setup(){

  pinMode(D,INPUT);
  pinMode(Q,OUTPUT);
  pinMode(C,INPUT);
  Serial.begin(9600);
}

void loop(){
  while(digitalRead(C) == 0){
  bef = digitalRead(C);
  }
  while(digitalRead(C) == 1){
    if(bef == 0){
      digitalWrite(Q, digitalRead(D));
    }
    bef = digitalRead(C);
  }
}

 

<결선 및 오실로스코프 파형>

 

1)

 위의 코드와 같이 프로그램 작성을 했으며, 업로드 후 아두이노 IDE에서 먼저 오류를 확인했다. 오류는 없으나 D 플립플롭의 동작 구현에 있어서 정상인지 확인하기 위해 함수발생기와 오실로스코프를 사용하였다. 시간에 따른, 클럭에 따른 출력값과 동작 등을 오실로스코프의 파형을 분석하여 이론과 실제 동작을 비교 관찰하였다.

 

2)

 회로를 동작시키면, 먼저 함수발생기로 만든 클럭이 입력으로 들어가게 된다. 그 후 매 상승엣지 마다 또 다른 입력인 스위치의 현재 상태값을 다음 상승클럭 때까지 LED로 출력한다.

 클럭 입력이 상승엣지일 때, 스위치 신호가 HIGH이라면 다음 상승엣지까지 LED는 ON을 유지하고, 신호가 LOW라면 다음 상승엣지까지 LED는 OFF를 유지한다. LED의 동작이 상승엣지(스위치의 신호가 LOW에서 HIGH로 변화하는 순간)라는 단면적인 시간 동안의 신호 변화로 인해 동작을 하기 때문에, 연속적인 신호값 혹은 스위치 신호가 HIGH에서 LOW로 갈 때에는 동작의 변화가 없다.

 다시 말해, 클럭이 연속적으로 HIGH인 시간대에 스위치의 신호가 변하더라도 LED의 출력은 다음 상승엣지가 오기전 까지는 유지하게 된다. 이를 위 사진과 같이 오실로스코프의 시간-전압 파형으로 확인할 수 있었다. 100Hz의 주파수를 넣었을 때는 한 주기가 10ms가 된다. D 플립플롭 동작 4가지 경우의 출력값을 직접적으로 확인하기에는 주기가 너무 짧아서 확인이 불가능하였다. 동작을 확인하기 위해서 주파수의 크기는 상관이 없으므로, 임의로 주파수의 크기를 1Hz로 변경하여 주기를 1s로 늘렸다. (위 오실로스코프는 클럭 입력 - LED 출력 파형이다. *노이즈 낀 파형이 출력)

위 오실로스코프 사진에서는 노이즈 때문에 LED의 정확한 출력을 확인하기 어렵지만, 상승엣지일 때만 파형이 형성되어 동작한다는 것을 알 수 있었으며 4가지 경우의 동작을 모두 만족하였다.

 <동작 4가지 경우>

- (클럭) = 0 을 유지할 때 : 스위치 신호의 변화를 주더라도 LED 출력의 변화 없음

- (클럭) = 1 을 유지할 때 : 스위치 신호의 변화를 주더라도 ELD 출력의 변화 없음

- (클럭) = (하강엣지) 일 때 : 스위치의 신호값이 0 또는 1일 때 모두 출력의 변화 없음

- (클럭) = (상승엣지) 일 때 : 스위치 신호값이 1이면 LED ON, 0이면 LED OFF

 

3)

<핵심 함수>

pinMode(핀번호, 신호) : 지정한 핀번호를 입력 또는 출력으로 설정한다.

while(조건) {동작} : 소괄호 조건을 만족하는 동안에는 중괄호 동작을 계속해서 반복한다.

if(조건) {동작} else {동작} : if의 소괄호 조건을 만족하면 중괄호 동작을 실행시키며, 소괄호 조건을 만족하지 않는 그 외의 경우에는 else의 중괄호 동작을 실행시킨다.

 

// 코드 상에서 D는 LED 출력, Q는 스위치 입력, C는 클럭 입력이다.

클럭 과거값을 저장하기 위해 int bef; 로 변수를 지정하였다. //

 

 D 플립플롭 구현에서 가장 중요한 것은 클럭의 현재값과 과거값을 비교하여 과거값이 0, 현재값이 1인 순간에만 동작이 되고 그 외의 경우에는 동작하지 않아야 한다.

 위 코드를 void loop() 부터 구어로 설명하면, 첫 번째 while문에서 클럭의 현재값이 0인 동안에는[while( digitalRead( C ) == 0 )] 클럭 현재값을 변수 bef에 과거값으로 저장한다.[bef = digitalRead(C);]

 클럭의 현재값이 1이 되면 while문의 조건을 만족하지 않으므로 중괄호 안의 동작을 실행하지 않는다. 따라서, 변수 bef에 마지막으로 저장되는 신호는 0이 되고, 첫 번째 while문을 벗어난다.

 두 번째 while문에서는 클럭의 현재값이 1인 동안에는[while( digitalRead( C ) == 1 )] 변수 bef 값이 0일 때[if( bef == 0 )], LED에 스위치의 현재값을 출력한다.[digitalWrite( Q, digitalRead( D ));]

 그 후에는 if문을 벗어나며, 클럭의 현재값을 변수 bef에 과거값으로 저장한다.[bef = digitalRead( C );] 클럭 신호가 0이 되면 while문의 조건을 만족하지 않으므로 중괄호 안의 동작을 실행하지 않는다. 따라서, 변수 bef에 마지막으로 저장되는 신호는 1이 되고, 두 번째 while문을 벗어난다.


 

유익하셨다면 좋아요와 구독 꾹 부탁드립니다 ㅎㅎ