2014-08-27 10 views
2

인터럽트 루틴을 구현하지 않고 Arduino에서 디지털 펄스를 카운트하는 방법이 있는지 알고 싶습니다.Arduino - 인터럽트없이 카운트 펄스

추가 설명 : 나는 계산하고자하는 측정 값에 비례하여 디지털 펄스를 출력하는 센서를 가지고 있습니다.

+0

예, 폴링으로 처리 할 수 ​​있지만 프로세서를 사용중인 상태로 유지할 수 있으며 폴링 간격보다 오래 걸릴 수있는 상태가 누락 될 수 있음을 알고 있어야합니다. –

+0

ISR없이 펄스를 카운트하는 방법은 주기적으로 상태를 처리하고 오버 플로우를 방지하기 위해 카운트 제한을 설정하여 하드웨어 카운터를 사용하는 것입니다. – manatttta

답변

3

인터럽트 처리기가 없어도 소프트웨어를 거의 또는 전혀 수행 할 수 없으며 소프트웨어 폴링 또는 인터럽트 계산으로 가능한 빠른 펄스 속도를 처리 할 수 ​​있습니다.

대부분의 Arduinos가 기반으로하는 Atmel AVR은 카운터/타이머 하드웨어를 가지고있어 입력 핀에서 직접 펄스를 카운트합니다. 카운터 작동을위한 하드웨어 구성과 카운터 레지스터 읽기 만하면됩니다. 8 비트 디바이스에서는 16 비트 카운터에 약간의 복잡성이 있지만이를 극복하는 것은 간단합니다. Arduino는 기본 PWM 동작을위한 타이머를 구성하지만 이는 here (자세한 내용은 AVR 사용자 설명서 참조)에서 무시할 수 있습니다. CTC 모드에서 타이머/카운터를 사용해야합니다.

ARM 기반 Arduninos와 거의 모든 다른 마이크로 컨트롤러는 유사한 하드웨어 기능을 갖습니다. 일부는 하드웨어 계산에 핀을 사용할 수있는 유연성이 뛰어납니다.

AVR에는 8 비트와 16 비트 카운터가 있습니다. 더 많은 카운트가 필요하면 오버플로 인터럽트를 처리해야 할 수도 있습니다. 카운터를 정기적으로 폴링하는 경우 인터럽트 없이도 다음 오버플로 전에 오버플로 플래그를 폴링하여 입력 펄스의 속도보다 훨씬 낮고 가능하면 비주기적인 속도로 폴링 할 수 있습니다.

귀하의 경우 최대 예상 펄스 속도로 카운터가 오버플로되는 시간보다 짧은 정기적주기에서 펄스 수를 읽어야합니다. 따라서 예를 들어 8 비트 카운터를 사용하고 최대 펄스 속도가 1KHz라면 256/1000 초마다 또는 그보다 짧은 시간마다 폴링해야하지만 가능하면 기간을 길게 만들어 최대 정밀도를 확보해야합니다. 예를 들어, 당신은 (이되지 실제 코드, 오직 조각입니다) 다음과 같은 뭔가가있을 수 있습니다 그래서 :

for(;;) 
{ 
    delayMS(250) ; 
    frequency = 4 * readCounter() ; 
} 

더 나은 선형 응답하지만 비 결정적 판독을 얻을 것이다 대안은 오버 플로우를 폴링하는 것 플래그를 선택하고 고정 된 수의 펄스를 계산하는 데 걸린 시간을 측정하십시오. 따라서 고정 된 시간에 대한 계수가 아닌 고정 된 계수의 시간에서 측정을 결정하십시오.

for(;;) 
{ 
    int start = getMillisec() ; 

    while(!counterOVF()) 
    { 
     // Do nothing (or something useful but quick) 
    } 

    int t = getMillisec() - start ; 
    frequency = 256 * t/1000 ; 
} 
+0

질문에 감사드립니다. 내가 올바르게 이해했다면, 당신의 첫 번째 아이디어는 펄스를 하드웨어로 보내고, 두 번째는 프로세서를 항상 바쁘게 남겨 둡니다. 문제는 내 마이크로 컨트롤러가 완전히로드되어 (카운팅 변수를 증가시키는 간단한 ISR이 작동하지 않는 이유입니다) 다른 작업을 수행해야하기 때문에 폴링 할 수 없다는 것입니다.또한 하드웨어 카운터를 더 이상 사용할 수 없습니다. 다른 대안이 있습니까? 나는 그것이 아날로그 포트 (PWM과 유사성에 의존)를 사용하여 가능할 수 있다고 들었다. 대단히 감사합니다. – manatttta

+0

두 경우 모두 하드웨어 카운터가 카운팅을하고 있습니다. 두 번째 예제에서는 오버플로 플래그를 폴링합니다.하지만 이는 원리를 설명하기위한 것으로 기본 솔루션은 아닙니다. 그것은 똑같이 인터럽트 핸들러가 될 수 있습니다 - 모든 펄스가 아니라 매 256 펄스 (8 비트 카운터라고 가정)마다 하나의 인터럽트가 발생하므로 인터럽트 오버 헤드가 훨씬 적습니다. – Clifford

+0

센서 출력이 고정 주파수 PWM 인 경우 (그리고 그 주파수보다 다소 낮은 컷오프로 적절한 아날로그 필터링을 추가 한 경우) 아날로그 입력을 사용할 수 있지만 질문은 PWM이 아닌 가변 주파수임을 의미합니다 카운트 펄스가 도움이 될까요?). – Clifford

1

디지털을 앞에두고 아날로그를 사용할 수 있습니다. 입력 최대 주파수가 1kHz 인 경우이 신호를 사용하여 1ms (1/fmax)의 펄스 출력으로 모노 안정 (에지 트리거)을 트리거하십시오. 그런 다음 로우 패스 필터 (직렬 R, C 대 접지, 멀티 폴 반복)를 마친 후 최종 커패시터에서 아날로그 전압을 읽습니다. R * C가 상대적으로 작 으면 아날로그 신호는 빠르게 반응하지만 잔물결이 생깁니다. 크기가 크면 반응 시간이 줄어들지 만 신호가 더 안정적입니다.