04-09-2013 10:22 AM
Hello,
I am trying to get RPM from a quadrature encoder, and I am seeing some error, and drift in my data. I was hoping someone could point me in the right direction. I am using VB.NEt 2010 with MS 2012, the code from CountDigEvents, has been used as my example.
In my global module I have the following declarations...
'Encoder Friend EncoderInput As Task Friend EncoderReader As NationalInstruments.DAQmx.CounterReader Friend EncoderChannel As String = "CDOT/ctr0" Friend CounterbitRate As Long = 32 Friend CountsperRev As Long = 3000 Friend watch As Stopwatch
I then use the following code to start the reading:
'Encoder Related If EncoderInput Is Nothing Then EncoderInput = New Task End If If EncoderInput.CIChannels.Count = 0 Then EncoderInput.CIChannels.CreateCountEdgesChannel(EncoderChannel, "Encoder On", CICountEdgesActiveEdge.Falling, 0, CICountEdgesCountDirection.Up) EncoderInput.Control(TaskAction.Verify) End If If EncoderReader Is Nothing Then EncoderReader = New CounterReader(EncoderInput.Stream) End If EncoderInput.Start()
This all seems to work fine. I then use a timer with a stopwatch for accurate time measurements. I seem to get "close" readings (+/- 10-15%), but nowhere near what I would expect, and the values seem to drift. I am comparing these values to a NIST calibrated laser tachometer that I know is right.
Dim count As Integer Dim time As Double Dim diff As Integer 'We will use this to Count the number of pulses that have occured 'We will actually determine the time programmatically, since the timer isn't perfectly accurate 'We will use stopwatch for this 'We need to check if this is the first read, if so we need to enable the timer If watch.IsRunning = False Then 'We need to start the stopwatch watch.Start() 'Set the prevcount to 0 PrevCount = 0 'Set the speed data to 0 DataGrid(1, 1) = 0 DataGrid(2, 1) = 0 gaugeRollSpeed.Value = 0 PrevTime = 0 Else Dim newtime As Double 'Now we need to read the counter value from the DAQ device count = EncoderReader.ReadSingleSampleDouble 'Now we must get the elapsed time in milliseconds newtime = watch.ElapsedMilliseconds Debug.Print("Count = " & count & "Time = " & newtime) time = newtime - PrevTime 'Now we must restart the stopwatch PrevTime = newtime 'Since this is a 32 bit counter the counter will read up to the bit's, then reset to 0 'We need to take that into consideration diff = count - PrevCount If diff < 0 Then diff = diff + ((2 ^ CounterbitRate) - 1) End If PrevCount = count 'Now we can actually calculate the rpm during this time frame 'Get the total revs Dim totalrevs As Double totalrevs = diff / CountsperRev 'Now we need to convert the time to minutes Dim minutes As Double minutes = (time / 1000) / 60 'Now we can calculate the rpm RPM = totalrevs / minutes
Any ideas or thoughts on how I should proceed?
Thanks,
04-10-2013 10:21 AM
Hi Matt0316,
I have a few questions to help me understand the issue you're seeing.
1. Could you link me to where you found the example you started from? It would help if I can see what you've built off of.
2. What DAQ device are you working with? Could you tell me the model?
3. You say you're seeing an error. Is there an actual error message, or are you referring to the fact that your values aren't what you expect?
4. What sort of values are you expecting to see? You say there's a 10-15% error, but what is the actual range of that error? What is the range of values you're expecting to see?
This should help us narrow down what might be causing the drift you're seeing. Thanks!
04-15-2013 12:00 PM
Hi Emily,
1) The example in terms of getting the counter data is from the examples installed with Measurement Studio. "C:\Users\Public\Documents\National Instruments\NI-DAQ\Examples\DotNET4.0\Counter\Count Digital Events\CountDigEvents\VB" is the specific example I used. As far as the actual code to calculate RPM, I coded that, but it is pretty simple. How many pulses have occured in how much time...
2) NI USB-6211
3)No actual Error, just unexpected values
4) I can set my motor to turn at a constant speed, again this is verified. So say I have it set at 800RPM, and I measure it using a calibrated tachometer at 800RPM, my program outputs maybe 680 - 710. then for a breif time it will go up to 950, then back down to 680-710.
I hope this helps, and we can find the source of the error.
Thanks,
--Matt
04-16-2013 04:49 PM
Hi Matt,
Could you please try testing in Test Panels? Open MAX, select your USB-6211 device, and click Test Panels along the top. In the Counter I/O tab, set the mode to Edge Counting, and set the Edge Source you're using. If you know your RPM, and count for a set amount of time, can you verify that this gives you the count you're expecting? This could help us determine if the hardware is working as expected.
Thanks!