Arduino에서 pin2의 두 입력 사이의 시간 간격을 측정하는 방법은 무엇입니까?

바퐁 카르

타이머 인터럽트 방법을 사용하여 Arduino UNO의 핀 2에서 두 입력 펄스 사이의 시간 간격을 측정하고 싶습니다.이 코드를 작성했지만 제대로 작동하지 않습니다.

이 코드는 하나의 시간 만 표시하므로 시간 간격을 측정 할 수 없습니다. 저는 Arduino를 처음 사용하여 인공 호흡기를 만들려고합니다. 어떤 제안이라도 감사하겠습니다. 감사합니다 !

//Three timer interrupts
//timer setup for timer0,timer1 and timer2
//this code will enable all three arduino uno timer interrupts
//timer0 will interrupts at 2 KHz
//timer1 will interrupts at 1 Hz
//timer2 will interrupts at 8 KHz

//storage variables
boolean toggle0=0;
boolean toggle1=0;
boolean toggle2=0;

long count0=0;
long count1=0;
long count2=0;
float t=0;
float iT =0;
float fT =0;
float temp=0;
int switchPin = 2;
int switchState = 0;

void setup() {

    cli(); //stop interrupts

    //set timer0 interrupts at 2 KHz
    TCCR0A = 0;//set entire TCCR0A register to 0
    TCCR0B = 0;
    TCNT0 = 0; //initialize counter value to 0

    //set compare match register for 2KHz increments
    OCR0A = 124;//=(16x10^6)/(2000x64)-1(must be <256)
    //turn on CTC mode
    TCCR0A |=(1 << WGM01);
    //set CS01 and CS00  bits for 64 prescaler
    TCCR0B |= (1 << CS01) | (1 << CS00);
    //enable timer compare interrupt
    TIMSK0 |= (1 << OCIE0A);

    //set timer0 interrupts at 1 Hz
    TCCR1A = 0;//set entire TCCR1A register to 0
    TCCR1B = 0;
    TCNT1 = 0; //initialize counter value to 0

    //set compare match register for 1 Hz increments
    OCR1A = 15624;//=(16x10^6)/(1x1024)-1(must be <65536)
    //turn on CTC mode
    TCCR1B |=(1 << WGM12);
    //set CS12 and CS10  bits for 1024 prescaler
    TCCR1B |= (1 << CS12) | (1 << CS10);
    //enable timer compare interrupt
    TIMSK1 |= (1 << OCIE1A);

    //set timer0 interrupts at 8 KHz
    TCCR2A = 0;//set entire TCCR2A register to 0
    TCCR2B = 0;
    TCNT2 = 0; //initialize counter value to 0

    //set compare match register for 2KHz increments
    OCR2A = 249;//=(16x10^6)/(8000x8)-1(must be <256)
    //turn on CTC mode
    TCCR2A |=(1 << WGM21);
    //set CS21  bits for 8 prescaler
    TCCR2B |= (1 << CS21);
    //enable timer compare interrupt
    TIMSK2 |= (1 << OCIE2A);

    sei();//allow interrupts

    pinMode(switchPin,INPUT);
    Serial.begin(9600);
}

ISR(TIMER0_COMPA_vect){

    //timer0 interrupts 2KHz toggles pin 8
    //generate pulse wave of frequency 2KHz/2 = 1KHz
    if(toggle0){
        digitalWrite(8,HIGH);
        toggle0 = 0;
        count0++;
        t = count0/1000;
    }
    else {
        digitalWrite(8,LOW);
        toggle0 = 1;
    }
}

ISR(TIMER1_COMPA_vect){

    //timer1 interrupts 1Hz toggles pin 8
    //generate pulse wave of frequency 1Hz/2 = 0.5Hz
    if(toggle1){
        digitalWrite(13,HIGH);
        toggle1 = 0;
        count1++;

    }
    else {
        digitalWrite(13,LOW);
        toggle1 = 1;
    }
}

ISR(TIMER2_COMPA_vect){

    //timer2 interrupts 8KHz toggles pin 8
    //generate pulse wave of frequency 8KHz/2 = 4KHz
    if(toggle2){
        digitalWrite(9,HIGH);
        toggle2 = 0;
        count2++;

    }
    else {
        digitalWrite(9,LOW);
        toggle2 = 1;
    }
}

void loop() {

    switchState = digitalRead(switchPin);
    if ((switchState == 1) && (temp == 0)) {
        temp = 1;
    }
    if ((switchState == 1) && (temp == 1)) {
        temp = 0;
    }

    if(switchState){
        if(temp == 0) {
            iT = t;
        }
        if(temp == 1) {
            fT = t;
        }
    }

    //Serial.println(t);
    //Serial.print("Count0 :");
    //Serial.println(count0);

    //Serial.print("count1 :");
    //Serial.println(count1);

    //Serial.print("count2 :");
    //Serial.println(count2);

    // Serial.print("Time : ");
    //Serial.println(t);
    //Serial.println(switchState);
    Serial.print("First Ping Time :: ");
    Serial.println(iT);
    Serial.print("Second Ping Time :: ");
    Serial.println(fT);
    //Serial.print("Temp=");
    //Serial.println(temp);
}

다음을 보여주는 출력 :

Second Ping Time :: 0.00
First Ping Time :: 4.00
Second Ping Time :: 0.00
First Ping Time :: 4.00
Second Ping Time :: 0.00
First Ping Time :: 4.00
Second Ping Time :: 0.00
First Ping Time :: 4.00
Second Ping Time :: 0.00
First Ping Time :: 4.00
Second Ping Time :: 0.00
First Ping Time :: 4.00
Second Ping Time :: 0.00
First Ping Time :: 4.00
Second Ping Time :: 0.00
First Ping Time :: 4.00
Second Ping Time :: 0.00
First Ping Time :: 4.00
Second Ping Time :: 0.00
First Ping Time :: 4.00
Second Ping Time :: 0.00
First Ping Time :: 4.00
Codebreaker007

우선 timer0을 망쳐서는 안됩니다. Arduino는 타이밍에 TIMER0을 사용합니다. 그것을 변경해서는 안됩니다 (따라서 millis ()가 작동하지 않는다는 것을 알았습니다). TIMER1과 TIMER2로 원하는 것을 할 수 있습니다. (일부 라이브러리에서 사용하지만). attachInterrupt ()를 사용하지 않는 이유는 무엇입니까?
방법에 대해서는 여기를 읽고 예제 코드여기를 참조 하십시오 . 긴 코드를 파헤 치지 않아서 죄송합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관