Speeding up Quadrature Encoder Implementation in cRIO FPGA

Hi All,
I've got a bit of FPGA code here that I've been running on the cRIO 9073. We've been using 250/500 count quadrature encoders just fine with it, but have recently moved up to a 2000 count encoder and it seems to be missing counts. I'm not using a machine to rotate the encoder, just my hands. Is there anything I can do to speed up the operation of this loop in the FPGA?
Regards,
Ken
Attachments:
quad_encoder.png ‏51 KB

Ken,
What if you tried using a single-cycle timed loop instead of a while loop and set the speed of the loop with an FPGA derived clock? Also, have you tried using the FPGA wizard to generate Quad Encoder code? To do this, right-click on the FPGA target in your project and select "Start FPGA Wizard". You can select a timing engine for Single Point Continuous and then a functions for Quadrature Counter. 
Hope that helps!

Similar Messages

  • Speeding up quadrature encoder read out

    Hi,
    I`m using a quadrature encoder together with a 6259 DAQ Card and BNC2110 Terminal Block.
    I managed to have it working with the DAQ-Assistent at 80Mhz using the Counters and reading one value at a time. Before the DAQ-Assistent I used a DAQmx command to connect PFI10 and PFI9 as the BNC2110 Terminal only outputs PFI0-9. This works but it is really slow, the distance between each measurement point is around 6 us. The VI is in the attachement (AquadB_one_value.vi)
    So I thought I might use the n-values version with the DAQ-Assistent but this does not work and I dont see any reason why, it is complaining about that connection between PFI10 and PFI9 which it didnt do before in the one-value-version. The VI is also in the attachement (AquadB_n_values.vi)
    I also tried another method using a VI I was given some time ago and modified it but here the distance between each measurement point is also around 6us. This VI is also in the attachement (Counter - Read Encoder.vi)
    Or am I missunderstanding something? The minimum achievable time distance between measurement points should be 1/80.000.000 s where of course the value can only differ 1/0/-1 because it has only calculated one new change in the A and B Signals right? I thought with using the n-values it is storing all the calculated values in the memory and I am transferring them afterwards for doing all the "post-processing"?
    If I am wrong, how can I spped up the read-out of the calculated values any other way?
    Best regards
    Attachments:
    AquadB_n_values.vi ‏56 KB
    AquadB_one_value.vi ‏49 KB
    Counter - Read Encoder.vi ‏98 KB

    Hi Dani_munich,
    I just realized that you asked the same question in our Service request. In the service request, I was missing out more information which I found them here by chance . I will further assist you in the SRQ you have created. I also sent you an email.
    Regard
    Anoj
    Anoj Mubarak
    National Instruments

  • Binary to Voltage Conversion of encoder data on cRio 9073 using FPGA

    I am using FPGA with a cRio 9073 to acquire torque and absolute quadrature encoder values. It says in the FPGA instructions that the documentation for the 9073 should include the binary to voltage conversion, but when I looked at the documentation, it wasn't there. Where can I find the conversion value or function to convert binary encoder data back to voltage? The encoder is hooked up to an analog converter and is acquired with a 9215 AI (+-10V differential). Thanks

    There are individual formulas for one or a group of modules.
    LabView examples path:
    LabVIEW 2010\examples\CompactRIO\Basic IO\Analog Raw Host Calibration\AI Raw Host Calibration
    LabView help topic 
    Converting and Calibrating CompactRIO Analog Input Values (FPGA
    Interface)
    Best regards
    Christian

  • FPGA programming for motor control using free downloadable IP cores for PWM and Quadrature encoder interfacing

    Hi,
    I have a cRIO-9014 with a NI9505 DC brushed servo drive module, and I would like to program the FPGA for PWM and Quadrature encoder interfacing using the intellectual property IP functions mentioned in the "CompactRIO Motor Control Basics Tutorial":
    Quadrature Encoder dX Method (FPGA, Use in SCTL).vi
    Pulse Width Modulation (FPGA, Use in SCTL).vi
    I made a search at ni.com/ipnet but I couldn't find them.
    Where can I find free downloadable IP cores for PWM and encoder blocks to include them in my FPGA interface program?
    Thanking you in advance,
    Manuel
    Solved!
    Go to Solution.

    Found by myself (google search!) at:
    https://lumen.ni.com/nicif/us/codepowelecguide/content.xhtml

  • 2-Bit Quadrature Encoder without counters

    I've noticed that the internal help in LabVIEW only mentioned Quadrature Encoders in terms of reading them with the counter inputs of a device that supports that type of reading. In case your DAQ does not support those counter inputs, such as the NI USB-6008, here is a LabVIEW VI that reads the output of a 2-bit encoder such as the Grayhill 61C22-01-04-02 optical encoder, and also reads its pushbutton output. Note that this would be called an "X4 decoding" in LabVIEW terms when referring to the decoding operation that it implements.
    Datasheet: http://eceserv0.ece.wisc.edu/~morrow/ECE315/ARM7-FPGA/datasheets/grayhill_61C.pdf
    Wire the encoder up with the load resistors listed in second page of the datasheet, and tie one of the pushbutton pins to 5V.
    The VI labels the physical channels that you should wire up to. Example:
    DAQmx Device Name: Dev1
    Encoder 5V Supply Channel: /port0/line0
    Note that I delete the device name from the channel selector, so "Dev1/port0/line0" becomes "/port0/line0". I only break the Device and channel names into 2 selectors because I swap DAQs often and I prefer to write my programs to just take a single "DAQmx Device" input that I can change in one place, then leave all the other lines the same. Just a little quirk of mine I guess.
    The "X4 Quadrature Encoder (SubVI).vi" and its subVIs are the ones doing the work, the parent VI is just an example of how to use them.
    I hope this helps somebody.
    Ryan R.
    R&D
    Attachments:
    Rotary Encoder Example.llb ‏100 KB

    This was very helpful actually, thanks!

  • How do I use a quadrature encoder as an external clock (PCI 6229)

    Hello, ( a similar post has been placed on DAQ forum apologies as I did not know best place)
    I have a PCI 6229 M Series data acquisition card. I want to use a quadrature encoder to be the external clock driving the acquisition of a number of signals. I have set up reading 24 signals each time a clock pulse is received using the DAQ assistant and set my external clock to pin pfi8 (I think) this is then connected to an encoder output. This works well enough until the encoder is run too fast when it appears I am either missing pulses or getting bounce.
    How can I set up to clock using a quadrature encoder? I have seen a number of questions on this forum regarding quadrature encoders and reverse counting but not on using them as an external clock.
    Basically I want to have the stability and "bounceless" nature of using two outputs from a quadrature encoder whilst still using an external clock. Is this just a case of configuring controls to certain pfi's? If so how is it done?
    Any help or pointers would be helpful. So far I have managed very nicely by simply using the DAQ assistant and the interface it has would suggest that if configured for a certain pfi pin I could actually still use it.
    Thanks in advance.
    Kevin

    Hi,
    Well I've had alook into this for you and I'm not quite sure I understand what you are looking for.
    Is it possible for you to phone back in to support?
    The reason you are seeing bounce at high speeds, or indeed loss of points, is due to the sampling rate that you have set up.
    What you will find is that the trigger will start an aquisition of a number of points at a certain rate.  If your sampling rate is too low then you will not finish that sample batch before the next set of samples is recorded.
    It is possible to use an external clock into a trigger or digital line, however this will limit the number of samples you can take to the speed of your encoder.
    If you increase your sampling rates, and then configure a start trigger from a single input from the encoder you will be able to record a number of samples after a rising/falling edge.  (Set the clock as an internal clock)
    Hope this helps
    AdamB
    Applications Engineering Team Leader | National Instruments | UK & Ireland

  • Can I use the 'Export Signal Property Node' on a quadrature encoder?

    Hi,
    So I don't know which counter board I'd be using yet for this (it's used in conjunction with a PCI-6280--the PCI-6280's counter inputs are all taken and so I need another board), but assuming this is possible at all in DAQmx I wouldn't mind knowing whether, say, the PCI-6601 (or any other timer board for that matter) could do this. I'm programming this in LabVIEW 2010 by the way. 
    I want to have a counter which counts the number of pulses on one channel (I'll call this the 'clock' channel) between when another channel goes from low to high (which I'll call the trigger). It's basically a pulse width measurement, but I only care if there are more than n clock pulses between triggers. I need to have a hardware-timed digital signal which goes from low to high if there are ever more than n pulses between trigger changing state from low to high. 
    What I am planning to do is this: 
    Wire 'trigger' to the z-input of the quadrature encoder, and set the z-input value to some arbitrary large value such that, at the quadrature encoder counter task's settings, the counter reaches terminal count in n pulses.
    Configure the quadrature encoder counter using DAQmx Export Signal Property Node (tutorial I was looking at is here: http://zone.ni.com/devzone/cda/tut/p/id/5387 ) to toggle a digital channel ('counter event output') from low to high if the counter reaches terminal count (ie, if the encoder reads n pulses).
    If the encoder ever reads n pulses on 'clock' between two rising pulses on 'trigger', it sets counter event output high.
    Is this possible? Reading through the manual of M series PCI-62xx devices, the index pulse loads the counter with a particular value so it seems like you could conceivably set the counter to the terminal count if you wanted. My only real problem is whether DAQmx Export Signal Property Node works on all counter tasks or just on edge counting tasks. 
    Thanks in advance for your help. If this isn't possible, I can reply with more details on the problem this is supposed to solve so that you can help me figure out an alternate method.
    Solved!
    Go to Solution.

    There is probably a way to do it, but it it may be easier to use an X-series board for the job.   They support a new counter capability for count reset on a digital edge without needing to be configured in encoder position mode.  I am not sure exactly how that feature's been implemented however, so maybe it won't make things easier after all.
    The plan based on the hoped-for behavior: 
    1. Configure an X-series counter for pulse generation based on "ticks" of your clock channel.
    2. Set both initial delay and low time to the critical # of ticks.
    3. Configure for count reset on a digital edge (if possible in pulse generation mode)
    4. Configure the count reset value to be the critical # (or possibly 1 less, if possible in pulse generation mode)
    5. If you want the output to remain high indefinitely, configure the counter task to use its own output as a
    pause trigger, and pause while high.
    The way pulse generation works is to preload a # of "low time" ticks into the count register.  Then every source edge will decrement the count.  When the count reaches terminal count (0), the counter's output is toggled (or can be configured to pulse).  The register is then loaded with the # of "high time" ticks and the process continues.
    You would be perpetually interrupting the count-down process as long as you got your triggers in time.  The count would keep getting reset to the # of low counts, keep decrementing toward 0 without reaching it, and so on.  If ever you did reach 0, the output state would toggle high, then the high state would prevent subsequent clock signals from decrementing the count.
    You can conceivably do a similar thing with a 6601, but I'm pretty sure you'd need 2 counters working together to get it working.
    -Kevin P

  • Simulate quadrature encoder output without hardware

    I am brand new to Labview and have not had any training other than youtube and this fine forum. I am a mechanic trying to solve a problem using labview. I am posting this new question because I don’t have any hardware so I can’t use the examples I’ve seen others pointing to.
    I’m trying to simulate the output of a quadrature rotary encoder. Once I have done that I want to use Labview to program an instrument that reads that signal and makes mathematical calculations to it but I need the signal first. The encoder will attach to a shaft that will rotate clockwise and then counterclockwise at a rate of about 122 times a minute.  The total shaft rotation will be between 0 - 18 degrees. It is important to me to know the direction of the shaft. The quadrature encoder will send out 2 square waves with one wave behind the other. The way I’ve tried to do this is by using 2 Simulate Signal modules each sending out a square wave at 2 Hz. I’ve connected a single knob controller to the both frequency inputs of the signal modules to simulate the speed the shaft rotates back and forth. I’ve done the exact same thing to the amplitude input to simulate the degrees the shaft turns before changing directions. My problem is the changing directions. I can delay the phase, which is what I want to do, but I can’t do it in real time and I can’t do it in a single 180 degree step. What I would like is a switch to change the B channel from +90 to -90 when it is toggled. If I could then toggle the switch when the amplitude reaches 18 degrees or less I will have an encoder signal. Thanks for any help you can provide.
    steve
    Attachments:
    Rotory Encoder.vi ‏59 KB

    Steve,
    From what I understand, you want to make a 180 degree phase shift every N intervals?  I modified your code to do this.  Let me know if that gets at what you are doing.
    Cheers,
    Chris LS
    National Instruments
    Applications Engineer
    Visit ni.com/gettingstarted for step-by-step help in setting up your system.
    Attachments:
    Rotory EncoderEdit.vi ‏61 KB

  • 6602 quadrature encoder with c code

    I need to implement a quadrature encoder on the 6602 board usinng c language.
    I found some good function, for example  DAQmxBaseCreateCIAngEncoderChan, but i think this function is only for DaqmxBase,
    is there some similar function for Daqmx, or have i to do it myself?
    From where can i start?
    Thank you in andvance
    There are 10 kinds of people. Those who understand binary notation, and those who do not.

    Solved my problem.
    I installed the daqmx version on CD and it was old.
    Now i installed the new version daqmx 9.0 , that i toke from the site.
    This version has the function i need  DAQmxCreateCIAngEncoderChan,
    it compiles , now i have only to attach my encoder.
    Thank you lo stesso
    Message Edited by blacksocket on 02-08-2010 05:32 AM
    There are 10 kinds of people. Those who understand binary notation, and those who do not.

  • RPM Measurement using Quadrature Encoder and PXI 6602 counter

    Hi,
    I am on a project at work where I need to verify the speed (in RPM) of an unloaded motor which can operate up to 1400 rpm.  After doing some research, i determined that a quadrature encoder could be used to make the measurement.  I am looking at this encoder  http://sine.ni.com/nips/cds/view/p/lang/en/nid/205321.
    I have a PXI 6602 counter/timer module in which I would like to interface to the quadrature encoder.  I would like to create a VI that allows me to calculate the speed using the encoder.  Can someone provide me with details of what needs to be in the VI or an example which can do this?  At the most basic level, i want to calculate the speed on demand.  After doing this, i would like to figure out how to quickly calculate the speed so that i can determine response time of the speed changing within sub-millisecond resolution (1 ms resolution max).
    Further, i created a VI that allows me to change the pulse width of a 100 Hz pulse train at run-time which tells the motor controller the desired speed.  I would like to be able to use this VI to change the speed of the motor and the first VI (that I am seeking help about) to calculate the response time (time between the initial speed and settling at the new setpoint).
    I am familiar with the NI example finder, but have not been able to find an example that I can use.
    Thanks,
    Gary

    Hey Gary,
    I think for you setup, you should try using the Meas Dig Frequency - Low Freq 1 ctr. You can find it by searching example finder with 'low freq'. This vi tells you the frequency of a digital signal by sampling between two pulses and inverting the time between pulses. If you hook up your encoder to a counter and have that counter specified in the vi, it will be able to give you on demand readings of frequency (you can do some multiplication to get the rpm value, freq*60/pulses per revolution of encoder). A simple way to take continuous readings is to put a while loop around the daqmx read and the data output of the read. You can also replace the numeric indicator to a waveform chart to graphically display the change of frequency or rpm readings over time.
    You should be able to integrate this as two separate tasks with the pulse train vi you created earlier.
    Hope this helps
    Luke W

  • Quadrature encoder, velocity

    Hi,
    I am using DAQ 6062E, with BNC 2120. I have a quadrature encoder, and I need to get the position, and velocity. I have modified BNC2120_Quadrature_Encoder vi from NI. I can compute the velocity (delta position/time loop) easily, however this is not very accurate. I need to have a high accuracy velocity, and I think I have to use the second counter to measure the frequency of channel. However, I am not able to calculate the velocity with this method. I have attached my vi. I appreciate if somebody can help.
    My encoder is connected to CTR Source 0 (PFI8), and UP_DOWN (P0.6)
    I have connected CTR Source 0 (PFI8) to CTR 1 Gate (PFI4)
    Thanks!
    Attachments:
    try encoder_with frequency.vi ‏58 KB

    I get reasonably accurate velocity from quad encoders by connecting the source of my counter to the internal 20MHz clock then gating said
    counter with my index pulse(Z) or either A or B, depending on the speed at which I am running. This will give you a count of time between
    revolutions if gating with Z, or it will yield time between X degrees if gating with A or B.

  • Quadrature encoder frequency division dotNet Net VB C#

    Hello,
    following a long search on this forum, I have decided to start this thread for dotNet developper.
    I have a PCI-6602 with a quadrature encoder (A,B,Z). The pulse frequency is average (10kHz).
    I am only using A and B channels.
    The function I have to implement is to generate an output every N pulses in the forward direction. N being an integer and ranging from 1 to let say 100.
    I have no constraint on the output. I am it can be a bit toggling or a pulse generation.
    What functions shall I call in MeasurementStudio.Net to implement this ?
    How many counters should I use ?
    On the register basis, my guess is that I have to pre-load a value in the register.
    Then when downcounting the counter reaches 0 this in turn does 2 things:
    reloads the counter to its preset value
    triggers the output generation (TerminalCount)
    Thanks for any help you may bring 
    NOTEs FOR NI guys:
    By the way, in the NI samples, quadrature doesn't work all the way.  I nthe sample  "CountDigEvents" with CountDirection set to "Externally controlled",  backward motion is never displayed. This is because the counter is read as a UInt32.
    Solved!
    Go to Solution.

    Hi,
    Your first ideas are pretty good, it should be a good way to implement a solution for your problematic.
    I am not used to work with MeasurementStudio, but this is few links which you could use or which could help you with theoretical points:
    http://zone.ni.com/devzone/cda/tut/p/id/3167
    <link no longer exists>
    http://zone.ni.com/devzone/cda/epd/p/id/2999#0requirements
    Hope it could help
    Mathieu B
    National Instruments France
    #adMrkt{text-align: center;font-size:11px; font-weight: bold;} #adMrkt a {text-decoration: none;} #adMrkt a:hover{font-size: 9px;} #adMrkt a span{display: none;} #adMrkt a:hover span{display: block;}
    Forum Aéronautique, Spatial et Défense. Avec la participation exceptionnelle de Bernard DUPRIEU, Res...

  • Using more than 4 quadrature encoder input for MyRIO

    Hello,
    I am doing a project where I need to drive 6 motors, each with quadrature encoder feedback to control position. 
    Currently, I've been using the MyRIO Encoder VI's, but there's a limit to 4 encoders. What is the best way of reading 6 encoders simultaneously with the MyRIO?
    Thanks,
    Timothy
    Solved!
    Go to Solution.

    If you need to modify the myRIO FPGA personality you have a few options.
    The best option is to start with the myRIO FPGA sample project, add and remove components as needed and then build your bitfile.  Any registers (LV FPGA controls / indicators) you don't modify will still work with the Advanced IO VIs and Express VIs.  In order to use the new bitfile (FPGA Personality) you'll need to update the Open FPGA VI Reference in myRIO v1.1 Open.vi (LabVIEW 2013\vi.lib\myRIO\Common\Instrument Driver Framework\myRIO v1.0\myRIO v1.1 Open.vi).
    After doing this any time you use a myRIO Express VI or Advanced IO VI it will use your custom bitfile.  Any peripheral channels you've left in place will continue to work.  Any channels you've removed will still show up in the VIs, but will not work (they will probably throw errors at runtime) and any new channels you added will not show up in the VIs.  For new channels you'll need to use the FPGA Read / Write nodes to read and write the configuration and data register you created in the FPGA personality.  These changes will persist on that computer until you change the Open FPGA VI Reference back to the original bitfile.
    Let us know if you have questions about any of this.
    Thanks!
    -Sam K
    LabVIEW Hacker
    Join / Follow the LabVIEW Hacker Group on google+

  • Does Stop task reset a quadrature encoder counter?

    I am using an M-Series PCI-6280 board, with one of its onboard counters wired as a quadrature encoder.
    1)I start the counter task, take a set of measurements with the counter, and then stop the task.
    2) The encoder which the encoder counter is monitoring continues to output quadrature encoder signals into the PCI board's counter.
    3) I start the task again, and perform another set of measurements.
    Which of the following occurs?
    Upon starting the task again, the counter's previous value was wiped and the measurements taken in (3) start at 0 counts. 
    The counter keeps the value it had before it was stopped and subsequently started, and the measurements in (3) cumulate on top of the measurements taken in (1). 
    The counter keeps the value it had before it was stopped, continues to increment/decrement position in (2) even after the task is stopped, and when the task is started in (3) the counter value is cumulative with the quadrature encoder pulses in (1) and (2). 
    Thanks in advance for the help. 
    Solved!
    Go to Solution.

    Hello acmap,
    In this case The behavior will be the following:
    Upon starting the task again, the counter's previous value was wiped and the measurements taken in (3) start at 0 counts.
    However, you can specify the initial count value of the counter on the Initial Count terminal of the DAQmx Start Task VI, so it doesn't have to start at zero, and you can implement the behavior described in your second option.
    Daniel

  • How to route Quadrature Encoder signal to CC1 using PCIe 1429 + IO extension card

    Hi there,
    i am currently trying to interface the Basler L304kc to the NI PCIe 1429 + Cameralink IO extension board
    I want to operate the camera in Ex-SYNC level controlled mode. I would like to route external Quadrature Encoder signals (connected to the IO extension board) to the CC1 cameralink control of the camera
    Currently, I cannot find this option either in MAX or the Camera File Generator.The L304kc camera file only provides pre-defined pulses, or MAX only offers "External","ISO","RSTI" options for the CC1 sources.
    Is it possible to route the encoder signal from the IO extension board directly to the CC1 of the camera? Or is there a work-around?
    Thanks!
    Derek Chan
    Application Engineer
    Basler Asia Pte Ltd

    Hi Alex,
    I posted the following (similar) text to the support center but I think it is of common interest:
    A) CL-card with ext. board. One can use the ISO, ext. and RS422 encoder inputs and also output cannels ISO and external.
    There is also a SMB connector corresponding to the ext. channel 0.
    B) with MAX one can define what kind of signals should be routed to CC1 to CC4. As I learned from
    this side one cannot use MAX or the Camera File generator but has to do this manually in order to use RS422 encoder triggering!!!
    C) on the other side there exists function to route and control signals explicitely, for example
    * imgSessionLineTrigSource2 -> what is this good for then? All your manuals are saying that this is done in MAX or the camera file by defining what signal drives the correspondung CC ine?? On the other side there is an example in CVI that does not work ("Trigger Each Line From Encoder") (at least it does not work with the PCIe1430).
    D) Can one implement the CC routing from MAX or the camera file manually with the following functions
    * imgSessionLineTrigSource2
    * imgPulseCreate2
    * imgSessionTriggerDrive2
    or does MAX use hidden functions ore mechanism to control the CL Cards?
    E) I can use one single line to setup scaled encoder triggering
    * imgSessionLineTrigSource2(iLS_ZK1_SessionID, IMG_SIGNAL_SCALED_ENCODER, 0, IMG_TRIG_POLAR_ACTIVEH, 0);
    but this only starts to work if I reset the encoder position to zero by sending this to the CL card, i.e.
    * imgEncoderResetPosition(SessionID);
    AND only in positive counting direction!
     If I just run though the zero position without a position reset I do not get ExSync on CC1????
    Is the information where to route the Scaled encoder to coming from the camera file? Why cannot I simply and explicitely route the scaled encoder
    signal to a certain CC line? Why using all those different approaches?
    F) now if in addition to E) i use
    * imgSessionTriggerDrive2(iLS_ZK1_SessionID, IMG_SIGNAL_EXTERNAL, 0, IMG_TRIG_POLAR_ACTIVEH, IMG_TRIG_DRIVE_SCALED_ENCODER);
    to drive ext. 0 (SMB connector) I can see exactly this behavior on the scope. No signal until I reset the encoder counter. Then I get signals as long as the image sequence is running. After the recording the signal disappears.
    kind regards, Holger h.baur(at)ivisso.com

Maybe you are looking for

  • Uploader doesn't show "My Documents" folder

    I am unable to upload a file to the PDF converter service; the uploader doesn't show "My Documents folder..?? Help!! Regards, Marshall

  • Why can't i use my $30 on my account?

    Why can't i use my $30 on my itunes account?????

  • BAPI_DOCUMENT_CREATE2 cv01n, cv03n, cv04n

    I have a problem my program execute correctly the BAPI_DOCUMENT_CREATE2 without a return message but no document is created and I am using the bapi_transaction_commit. But documents are created correctly in CV04N. They are nonexistent in CV03N. Edite

  • Export Panel and Droplets

    After running a droplet through the Export Panel in Lightroom the action is not save to the image, whereas before the 'upgrade' it did, same action/droplet as before... Why is it not saving now?

  • Button Widget - Need it to jump to next slide, not simply continue

    I'm new to Cp 5.5. I was an expert in Cp4 and prior versions, but due to work changes I've not worked with Captivate in a few years and am just getting back into it. Definitely things have changed! I setup a master slide and at the top-right I placed