2016-11-02 3 views
0

STM32L 마이크로 컨트롤러를 사용하여 기계식 수량계에서 펄스 수를 계산하고 싶습니다. 유량계의 출력은 2 개의 리드 스위치에 있습니다. 두 개의 리드 스위치가 "ON"OR 레지스터에서의 주행시 포인터 또는 기어에 장착 된 자석을 각각 "OFF"동작 될두 개의 입력이있는 기계식 유량계의 펄스 계산

  • 다음과 같이

    스위치의 동작을 설명한다 , 동시에 "켜짐"하지 마십시오.

  • 두 개의 리드 스위치는 포인터의 한 라운드에서 두 개의 "ON"및 두 개의 "OFF"를 작동하며 기어는 한 개의 신호 출력을 의미합니다.

어떻게 두 개의 입력을 읽고 C의 펄스 수를 계산할 수 있습니까? 참고 : 1 펄스 = 100 리터.

+0

하나의 스위치가 닫히면 플래그를 설정하십시오. 다른 스위치가 닫히면 플래그를 지우십시오. 플래그가 지워진 횟수를 세십시오. 나는 문제가 무엇인지 여기에서 알지 못한다. –

+1

두 개의 스위치 상태에 대한 타이밍 다이어그램을 그릴 수 있습니까? 당신의 설명은 이해하기 어렵습니다. –

+0

명확하지 않습니다. 스위치를 읽도록 하드웨어를 구성하는 방법에 관심이 있습니까? 아니면 이미 스위치를 읽고 알고리즘 처리에 관심이 있습니까? –

답변

0

당신이 물어 보는 것처럼 보이기 때문에 당신이 실제로 묻는 것이 확실하지 않습니다. 당신이 폴링하거나 에지 트리거 인터럽트를 사용하든간에 간단합니다. 주요 문제는 스위치 신호를 디 바운스하는 것입니다. 디 바운싱의 경우 유량계의 최대 유량을 결정해야합니다.이 유량계는 직접 신경 쓰지 않아도되지만 최대 전환 시간을 계산할 수 있습니다. 귀하의 디 바운스를 수행하기 위해 최소 온/오프 시간의 상당 부분을 사용하십시오.

+0

분명히 요점은이 시스템으로 디버깅 할 필요가 없다는 것입니다. 기계식 시계 탈진 기와 같습니다. 당신은 B 펄스가있을 때까지 다른 A 펄스를 세지 못합니다. A와 B는 동시에 둘 다 만들어지지 않습니다. 따라서 알고리즘의 관점에서 디 바운스는 무의미합니다. A 펄스를 받으면 B 펄스를 기다립니다. B 펄스를 받으면 100L을 더 기록하고 A 펄스를 기다립니다. –

+0

@WeatherVane : 갈대 근처에서 자석을 돌리는 흐름 단위가 발생하면 리드가 뒤집어 질 수 있지만 자석이 뒤로 조금씩 갈 수 있습니다 (100 % 완벽한 래칫이 없음). 이것은 실제 전환이 되기에는 너무 짧기 때문에 계산해서는 안되는 펄스입니다. 또한 전환을 감지하기 위해 인터럽트를 사용하는 경우 스위치의 합법적 인 상태에 실제로 도달했는지 여부를 결정하는 것으로 구성됩니다. – nategoose

+0

다른 스위치가 180도 떨어져 있고 잘못된 결정의 기회가없는 경우 한 개의 리드 스위치에서 얼마나 많은 펄스를 내리지 않아도 상관 없습니다.나는 이것이 하나가 아닌 두 개의 스위치를 가지고있는 전체 지점이라고 생각했을 것입니다 - 디버깅 할 필요성을 없애기 위해서입니다. –

0

한 번에 하나의 스위치 만 만들 수 있도록 180도 간격으로 두 개의 스위치가있는 지점은 스위치 디 바운싱이 필요하지 않습니다. 실제로

코드가 더 정교해야하지만, 기본 알고리즘이로 표현 될 수있다 : 가까운 경우 펄스, 리드 스위치에서 오는 얼마나 많은 문제가되지 않습니다

while(1) { 
    while(switchA() == 0);   // wait for switch A to be made 
    litres += 100;     // clock up unit volume 
    display(litres);    // tell the user 
    while(switchB() == 0);   // wait for switch B to be made 
} 

자석 - 첫 번째 펄스를 제외한 모든 펄스는 무시됩니다. 알고리즘이 다른 스위치를 조사하기 때문입니다.