Q&A 게시판

cancel
Showing results for 
Search instead for 
Did you mean: 

두 개 동시 카운트 시 정확도에 관해 질문드립니다.

Solved!
Go to solution
Highlighted

안녕하세요. 고수님들.

랩뷰를 배워가는 단계에 있는 학생입니다.

 

두 개의 디지털 입력에 대해, 동일한 일정 시간(Time)에 대해서 카운팅을 동시에 진행하고 싶습니다.

정확도를 위해 시퀀스 구조가 사용되었습니다.

하지만 1초에 100hz기준 0~+1, 1000hz기준 +3~+7정도의 오차가 발생합니다.

 

동일한 구조로 단일 카운트를 따로 만들어서 측정하였을 때 1000hz는 0~+1의 오차인 걸로 보아,(함수발생기 자체의 오차 안 입니다)

병렬 측정이 되면서 단일 측정보다 시간차가 생겨 오차가 크게 발생하는걸로 추측하고 있습니다.(정확하지 않습니다.)   

johndoe_student_0-1593593252075.png

그래서 더 정확한 동일 시간대 병렬측정(마치 단일 측정을 하는 정도의 정확도)을 위한 팁이 있을까요?

 

감사합니다.

0 Kudos
Message 1 of 11
(304 Views)
Highlighted
Solution
Accepted by topic author johndoe_student

Windows는 실시간 OS가 아닙니다.

그래서 수행 시간에 따라 조금씩 틀려집니다.

여러 번 수행해 보면 알 수 있을 겁니다.

읽는 시점에 따라 조금씩 카운트가 틀려집니다.

 

정확한 측정을 위해서는 실시간 OS를 쓰거나 FPGA를 사용해야 합니다.

 

실시간 OS는 Real Time이라고 하죠. LabView Realtime 또는 CRIO 를 공부하시면 될 듯 합니다.

FPGA도 보면 좋습니다. 제일 정확하죠.

 

Message 2 of 11
(272 Views)
Highlighted
Solution
Accepted by topic author johndoe_student

코드를 보니 크게 두 가지 문제가 있는 것 같습니다.

 

첫번째는 두 카운터의 시작 지점과 카운터 값 읽는 시점이 완전히 같지 않습니다. 수 ms 이내의 오차가 있을 수 있습니다.  

원하시는 정확도를 위해서는 지금처럼 소프트웨어적으로 동기화하는 것이 아닌 물리적 신호를 사용하여 태스크 시작과 값 수집을 동기화 해야 합니다.  

 

두번째는 측정 시간을 정함에 있어 지연 함수를 기준으로 하셨는데 높은 정확도를 위해서 좋은 방법은 아닙니다. 프로세서 상황에 따라 함수 실행에 1-2 ms의 오차가 발생할 수 있고 태스크 시작과 값 읽기 수행 자체에 걸리는 시간도 있기 때문입니다. 또 병렬로 태스크를 늘릴 경우 오차가 더 커집니다. 그냥 카운터 자체의 값을 신뢰하시는 게 더 좋습니다. 

현재 방법은 정확도가 높은 장비를 정확도가 낮은 장비로 측정하려는 것과 유사합니다. 

Message 3 of 11
(259 Views)
Highlighted

CRIONI사의 고성능 측정장비(FPGA를 포함하는), 컨트롤러 하드웨어군 정도로 이해하면 맞을까요? 제가 이해한게 맞다면, 현재 저는 윈도우 환경에서 USB-6343 디바이스를 사용하기 때문에 저한테는 적용되지 못할 것 같습니다. 추가로, 프로세서 상황에 따른 오차를 Real Time 부분으로 해결하려고 시도했으나 저의 부족함으로 잘 안됬습니다. Labview-Real-Time 모듈 부분을 추가로 더 공부해보겠습니다.

정확한 측정을 위해서는 정확한 하드웨어(FPGA)와 정확한 소프트웨어(RTOS)가 요구된다고 이해했습니다.  특히 RTOS와 특히 FPGA라는 것 자체에 놀랐습니다. 간단하게만 봤는데도 굉장히 신기하고 산업분야에 중요한데도 이 부분은 전혀 몰랐던 부분입니다. 좋은 정보 감사합니다.

0 Kudos
Message 4 of 11
(253 Views)
Highlighted

첫번재로 하드웨어적 동기화에 대해  

저는 윈도우 환경에서 USB-6343을 사용하는데,

 https://www.ni.com/ko-kr/support/documentation/supplemental/18/daq-devices-with-hardware-timed-singl...

[지원되지 않는 디바이스] 부분에서 “USB다기능 DAQ 디바이스(63XX)” 이말은 USB-6343은 카운터를 포함한 모든 태스크에 대해 하드웨어 동기화를 사용할 수 없다는 의미인지,

혹은 USB-6343의 매뉴얼 https://www.ni.com/pdf/manuals/377874a.pdf

[General-Purpose Counters]부분에 Internal Base Clock 100MHz, 20MHz, 100kHz라고 쓰여있는데 이 부분이 하드웨어 동기화가 가능함을 의미하는 건지 잘 모르겠습니다.

+랩뷰에서 하드웨어 타이밍 방식의 단일 포인트설정으로 카운터를 만들었을때, 제가 설정값을 잘못 주었을 가능성이 크지만, 설정이 맞지않다는 오류가 떴었습니다. 그래서 하드웨어 동기화가 안되는 디바이스인가?라고 판단했습니다.

 

두번째 프로세서 상황에 따라 오차발생에 대해 이 부분에서 카운터 자체의 값을 신뢰하는게 좋다라는 의미를 잘 이해하지 못했습니다.

혹시 "카운터 자체의 값"에 대한 더 자세한 내용을 알 수 있을까요?

 

감사합니다. 

0 Kudos
Message 5 of 11
(252 Views)
Highlighted
Solution
Accepted by topic author johndoe_student

하드웨어 타이밍 단일 포인트 샘플링은 주로 제어 로직과 함께 쓰이는 아날로그 IO를 위해 필요한 것이지 여기서의 내용(동기화)과는 상관이 없습니다.

동기화라는 것은 작업 시작 시간을 같게 하거나 샘플링 클럭을 동일하게 하는 것을 말합니다.  

여기서는 필요한 동기화는 카운터 작업(task) 시작 및 값 읽기의 동기화입니다. 

동일한 디지털 트리거를 통해 카운터 작업을 함께 시작하는 것입니다. 

카운터 값을 읽을 때는 샘플 클럭을 설정하여 두 태스크에서 동일한 시간에 측정된 카운터 값을 가져오면 됩니다. 

DAQmx 예제 중 Counter - Count Edges (Continuous Clock).vi 를 보시면 조금 도움이 될 것 같습니다. (특히 트리거와 타이밍 세팅 부분)  

물론 예제는 하나의 카운터 기준으로 되어있어 하나의 태스크를 더 만드셔야 할 겁니다. 

그리고 아래 DAQ 매뉴얼에서 카운터 부분 보시면 좀 더 이해를 하실 수 있을 겁니다. 

http://www.ni.com/pdf/manuals/370784k.pdf

 

제가 이해한 랩뷰 코드의 의미는 "내가 정한 시간 동안 카운터의 값이 예측한대로 들어오는지 확인하는 코드" 라고 이해했습니다.

여기서 내가 정한 시간의 resolution이 1ms 단위로 작아지면 내가 정한 시간 자체가 정확하지 않기 때문에 측정된 카운터 값 또한 의미가 없게 됩니다. 

만일 내가 타임을 1000 ms 라 세팅을 했는데 카운터 값이 1005 라고 읽히면 (1000Hz 펄스 기준)

카운터 값이 부정확한 것이 아니라 내가 태스크를 시작하고 1000 ms가 아닌 1005 ms 이 지났을 때 값을 읽었구나 라고 이해를 하시면 됩니다. 

이것이 카운터 자체의 값을 신뢰해라라는 의미입니다.  

Message 6 of 11
(237 Views)
Highlighted

자세한 설명감사합니다. 소스(1000hz)와 카운터(1005)를 신뢰하게되면, 결국 시간(1초가 아니라, 1.x초로 측정되어 5카운트가 더 됨)문제로 인식하라는 뜻이군요.

 

말씀해주신 Count Edge.vi 예제를 살펴보았습니다. 채널 세팅은 맞게 했는데, 타이밍세팅에서부터 오류가 뜹니다. 

johndoe_student_1-1593755727512.png

 

Task.vi:7220001 : External sample clock source must be specified for this application. 즉 외부샘플클럭이 반드시 필요하다라는 것 인데

 

하지만 NI MAX에서 테스트 패널로 카운터 input을 확인하면 

johndoe_student_0-1593754376863.png

채널/모드/소스만 설정해주어도 잘 카운트됩니다. 샘플클럭의 설정문제 같은데 제가 이부분에서 

샘플클럭/타이밍/트리거 세 개의 개념을 제가 헷갈려하는 것 같습니다.

 

제가 이해한 각각의 개념은

1.샘플클럭은, 측정하고싶은 소스 신호와 비교되어, 카운트가 되는 기준입니다. 샘플클럭이 높을 수록 카운트가 정확해지며 최소한 소스 신호와 동일한 주파수를 가져야합니다. 샘플클럭을 따로 설정하지 않으면 소프트웨어 혹은 하드웨어적으로 자동적으로 설정된 값이 사용되며, 외부 클럭을 따로 지정해주면 물리적으로 외부클럭을 연결해야합니다. 이 때 소프트웨어의 샘플클럭보다 하드웨어 샘플클럭이 더 정확합니다.

 

2.타이밍은 지금 생각해보니 샘플클럭,트리거의 의미와 혼용하여 이해하고 있었습니다.  소프트웨어 타이밍은 프로그램 혹은 os가 샘플클럭을 기준으로 카운트를 시작하고, 하드웨어 타이밍은 하드웨어가 생성하는 샘플클럭으로 카운트를 시작한다고 생각했습니다.

 

3.트리거는 실제로 카운트를 시작하는 순간을 정의한다고 이해했습니다. 트리거가 활성화되는 순간 카운트의 0초가 시작되고 DAQmx read가 읽는 순간까지 해서 카운트되는것으로 생각했습니다. 

이 세가지 용어에 대한 저의 개념이 맞나요?

 

 

즉 트리거~read함수 까지가 실제로 측정되는 시간을 만들게 되는데, 프로그램의 프로세스 상 오차를 소프트웨어가 아닌 하드웨어의 기능(하드웨어 타이밍, 하드웨어 샘플클럭)을 사용하면 트리거의 시작이 더 정확해져서 시간이 더 정확하게 측정된다고 생각했습니다.  

 

여기에 병렬로 만들게 되면 타이밍이 트리거를 작동시키는데, 이 타이밍이 동기화가 되지않아 트리거가 동시에 시작되지 않아, 동시에 read를 해도 하나는 0초~로 시작하고 다른하나는 상대적으로 0.x초~로 카운트가 되서, 실제 두 카운트가 되는 시간이 달라서, 카운트 값이 부정확하다고 이해했습니다.

 

즉 1.하드웨어를 바탕으로 제어하면 소프트웨어보다 정확한 제어가 가능하다 2.타이밍을 통해 트리거를 작동시키는데, 이 트리거를 동시에 시작하도록 타이밍을 설정해줘야한다. 두 가지를 통해 정확한 카운트를 만드는 것으로 이해했습니다. 

 

제가 오해하고 있는 부분을 알 수 있을까요?

감사합니다.

0 Kudos
Message 7 of 11
(216 Views)
Highlighted
Solution
Accepted by topic author johndoe_student

MAX에서는 소프트웨어 타이밍으로 측정값을 가져오기 때문에 샘플 클럭을 사용하지 않습니다. 따라서 오류가 안 납니다.  

 

샘플클럭은, 측정하고싶은 소스 신호와 비교되어, 카운트가 되는 기준입니다. 샘플클럭이 높을 수록 카운트가 정확해지며 최소한 소스 신호와 동일한 주파수를 가져야합니다. 샘플클럭을 따로 설정하지 않으면 소프트웨어 혹은 하드웨어적으로 자동적으로 설정된 값이 사용되며, 외부 클럭을 따로 지정해주면 물리적으로 외부클럭을 연결해야합니다. 이 때 소프트웨어의 샘플클럭보다 하드웨어 샘플클럭이 더 정확합니다.

 --> 아닙니다. 여기서 샘플클럭은 카운터 값이 버퍼에 쓰여지는 타이밍을 말합니다. 위의 언급하신 개념은 샘플 클럭이 아니라 타임베이스 클럭입니다. 아래 그림을 잘 이해해보세요. 여기서 counter armed라는 부분이 트리거 신호 발생에 해당합니다. 이 그림에서는 타임베이스 클럭은 따로 나와있지 않습니다. 

 

Capture.PNG

2.타이밍은 지금 생각해보니 샘플클럭,트리거의 의미와 혼용하여 이해하고 있었습니다.  소프트웨어 타이밍은 프로그램 혹은 os가 샘플클럭을 기준으로 카운트를 시작하고, 하드웨어 타이밍은 하드웨어가 생성하는 샘플클럭으로 카운트를 시작한다고 생각했습니다.

--> 타이밍은 특정한 것을 가리키는 용어가 아닙니다. 문맥에 따라 트리거 또는 샘플클럭을 가리킬 수 있습니다. 예) 샘플 클럭 타이밍, 트리거 타이밍. 타이밍이라는 용어에 신경을 크게 안 쓰셔도 됩니다.

 

3.트리거는 실제로 카운트를 시작하는 순간을 정의한다고 이해했습니다. 트리거가 활성화되는 순간 카운트의 0초가 시작되고 DAQmx read가 읽는 순간까지 해서 카운트되는것으로 생각했습니다. 

이 세가지 용어에 대한 저의 개념이 맞나요?

--> 일반적으로 트리거 설정이라 함은 다른 외부신호를 이용하여 작업의 시작 순간을 결정하는 것을 말합니다. 보통 하나의 디지털 라인을 이용하여 라인에서 라이징 엣지가 발생하는 순간을 트리거 신호로 하여 작업 시작을 수행하게 됩니다. 여러 태스크가 이 디지털 라인을 공통의 트리거로 삼는다면 시작을 동기화할 수 있겠죠.

 

4. 카운터 작업의 샘플 클럭으로 아래의 신호를 사용할 수 있습니다. 아래 링크 참고하셔서 아날로그 입력 샘플 클럭을 끌어와서 사용하는게 좋습니다. 

https://knowledge.ni.com/KnowledgeArticleDetails?id=kA00Z000000P7lASAS&l=ko-KR

Capture2.PNG

Message 8 of 11
(208 Views)
Highlighted

계속 제가 카운터에서 잘못을 했던 이유가 바로 sample clock인것 같습니다. 완전히 잘못된 개념을 가지고 생각해서 계속 틀렸던 것 같습니다.

 

샘플클럭에 대한 다른 글도 계속 읽어보았는데, 샘플클럭이 왜 있어야하는지, 카운터의 정확도를 올리는 역할에서 타이밍/트리거에게 무슨 역할을 하는지 잘 이해가 되지않습니다.

1.

샘플클럭은 활성화가 될 때 카운트값을 래치하여 버퍼에 저장합니다.

 

그런데 샘플클럭이 활성화될때마다 저장을 하지 않아도, 트리거가 시작!하면 입력소스의 활성신호마다 카운트를 시작해서, 1,2,3.. 쭉 counter value가 세다가, read함수가 나올 때 한번만  저장하면 동일한 결과를 만들어 내지 않는지 궁금합니다. 

만약 무한한 카운팅을 해야하는 상황이라면, 중간중간 값을 카운트 값을 확인해야 하니 샘플클럭의 활성화마다 버퍼에 저장해서 확인하는 역할은 필요할 것 같지만, 유한한 시간의 카운팅이라면 counter value가 값을 가지고 있다가 마지막에 한번만 반환해주면 샘플클럭은 버퍼만 사용하고 의미가 없는것 처럼 보입니다. 

혹은 트리거를 활성화시키기 위한 역할2이라고 하기에는, 단 한번의 신호만 주면되니까 클럭(반복되는모양)이 필요없어도 되는 것 처럼 보입니다.

2.

트리거가 외부신호의 활성화로 시작점을 주는 것이라면, 만약 두 채널에서 각각 신호1을 카운트하고 신호2를 카운트할 때, 트리거를 신호1로 주어도 개념상 문제가 없나요? 혹은 소프트웨어로 트리거를 사용할 수 없는지,혹은이게 하드웨어에 비해 부정확한지, 궁금합니다. 

 

아주 기초적인 부분에서 질문을 드려 죄송합니다. 

 

 

0 Kudos
Message 9 of 11
(196 Views)
Highlighted
Solution
Accepted by topic author johndoe_student

마지막으로 짧게 답변 드리겠습니다.

 

  1. 애초에 원하던 어플리케이션이 두 개의 카운터를 동기화하는 것이 아니었나요? 작업을 똑같이 시작해서 똑 같은 타이밍에 카운터 값을 가져오는 것 말이죠. 그래서 샘플 클럭을 말씀드렸구요. 샘플 클럭 주기를 조정하여 원하는 측정 시간도 매우 정확히 설정할 수 있습니다.  소프트웨어 타이밍으로는 정확도에 한계가 있습니다. 그래서 애초에 그런 오차가 발생했던 거구요.

 

  1. 소프트웨어적으로도 동시에 트리거를 할 수 있지만(기존에 이미 했던 방식) 하드웨어 트리거에 비해 정확도가 떨어집니다.
Message 10 of 11
(188 Views)