Mesauring position and speed in a 3 phase BLDC motor?

Hi!
I was wondering if you could help me with a problem. What I want to do is control and measure a 3 phase BLDC motors position and speed prefferably using a PID controller (or two!).
The position part isn't too hard (I think I got it!), but having a PID controller measuring the time from the trigger pulse to the desired position within a desired time is harder. The speed-PID controller should automatically adjust parameters so the next motor rotation will get to the exact position within the desired time.
Can anyone help me with this problem?

Could you please provide some information about the hard- and software that you are using to control the motor?
Thanks,
Jochen

Similar Messages

  • Measuring back emf in a 3-phase BLDC motor

    I am currently trying to determine the back emf generated in the floating coil of a 3 phase BLDC motor (simple RC car motor).  I can currently monitor the current and the voltages supplied to each of the motor phases from the controller but I would like to eliminate the use of Hall sensors from my setup and monitor the back emf instead of the Hall outputs (to use as feedback instead).  I am using a CB-68LP terminal block and the NI 6024E PCI card.  To run the motor at full throttle requiers a 5 volt PWM at 60Hz and 12% duty cycle.  I am no EE, just a lowly ME, so bear with my ignorance and give a girl a hand.   Any suggestions?  Thanks!

    Hi pyrochk247,
    Out of curiosity, are you using a motion controller to control the motor, or are you using the 6024E's counters to do the PWM?  We don't deal with Back-EMF as a method of feedback so you'll have to forgive me if I trip up my understanding of the topic:
    In the way of reading the motor windings for a simple voltage and feedback voltage, that is highly possible.  Using a 6024E card you would be able to read in the analog signals and use the counters as outputs at the same time.  What would be difficult about this is pulling out the Back-EMF signals from the standard motor winding voltage.  I found this article:
    http://www.acroname.com/robotics/info/articles/back-emf/back-emf.html
    So the trick would be developing a method good enough to read the signals we desire well and rejecting the rest.  If you are using PWM from the 6024E then you could do decent feedback to the motor through a PID loop.
    Currently, I'm not trying to suggest anything.  Rather, I'm asking to see if this idea makes sense to you.
    Let me know what you think.
    Justin Louie

  • Serious Help! Handling Sound Position And Speed!

    Take a look at this: https://sites.google.com/site/pardeepgames/Untitled-1.swf. It may take some time to load, sound is 42 seconds, see the second text field for time buffering.
    I recommend reading the Source Code below first.
    Now as you can see the pitch and speed functions are working perfectly, but the problem is that when you move the slider, the songTime text field dosen't work correctly. When you raise the pitch the songTime should just speed up the counting not change it's position, same when you lower the pitch, it should just slow down the counting not change it's position. Well that isn't working for me. The Source Code is there for you below and all the information you need is in the comments in the code. Please help me out. Oh and I recommend focusing on the songTime text field and then moving the slider.
    Source Code:
    Name of the slider: "slider".
    Name of the first text field: "songTime".
    Name of the second text field: "songTotalTime".
    import flash.events.Event;
    import flash.events.SampleDataEvent;
    import flash.media.Sound;
    import flash.net.URLRequest;
    import flash.utils.ByteArray;
    import fl.events.SliderEvent;
    import flash.media.SoundChannel;
    var _playbackSpeed:Number = 2;
    var sound:Sound;
    var sound2:Sound; // Copy of the original sound, to get the right information about the sound because the pitch shifting for the original sound variable ruins it up.
    var myChannel:SoundChannel = new SoundChannel();
    var _loadedMP3Samples:ByteArray;
    var _phase:Number;
    var _numSamples:int;
    var request:URLRequest = new URLRequest("https://sites.google.com/site/pardeepgames/Not%20Afraid%20Instrumental.mp3");
    var songTimeTime:Number = 1000; // The variable that allows the songTime's speed to change accoriding to the value of the slider. See in line 32.
    loadAndplay10(request);
    addEventListener(Event.ENTER_FRAME, enterFrame);
    function enterFrame(event:Event):void
      progressBar.scaleX = myChannel.position / sound2.length;
      _playbackSpeed = slider.value;
      songTimeTime = 1000 / slider.value;
      songTime.text = convertTime(myChannel.position);
      songTotalTime.text = convertTimeLength(sound2.length);
    function loadAndplay10(request:URLRequest):void
      sound = new Sound();
      sound2 = new Sound();
      sound.addEventListener(Event.COMPLETE, mp3Complete);
      sound.load(request);
      sound2.load(request);
    function playLoadedSound(s:Sound):void
      var bytes:ByteArray = new ByteArray();
      s.extract(bytes, int(s.length * 44.1));
      play10(bytes);
    function mp3Complete(event:Event):void
      playLoadedSound(sound);
    function play10(bytes:ByteArray):void
      stop10();
      sound = new Sound();
      sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);
      _loadedMP3Samples = bytes;
      _numSamples = bytes.length / 8;
      _phase = 0;
      myChannel = sound.play();
    function stop10():void
      if (sound)
      sound.removeEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);
      myChannel.stop();
    function onSampleData( event:SampleDataEvent ):void
      var l:Number;
      var r:Number;
      var outputLength:int = 0;
      while (outputLength < 2048)
      // until we have filled up enough output buffer
      // move to the correct location in our loaded samples ByteArray
      _loadedMP3Samples.position = int(_phase) * 8;// 4 bytes per float and two channels so the actual position in the ByteArray is a factor of 8 bigger than the phase
      // read out the left and right channels at this position
      l = _loadedMP3Samples.readFloat();
      r = _loadedMP3Samples.readFloat();
      // write the samples to our output buffer
      event.data.writeFloat(l);
      event.data.writeFloat(r);
      outputLength++;
      // advance the phase by the speed...
      _phase +=  _playbackSpeed;
      // and deal with looping (including looping back past the beginning when playing in reverse)
      if (_phase < 0)
      _phase +=  _numSamples;
      else if (_phase >= _numSamples)
      _phase -=  _numSamples;
    function convertTime(milliSeconds:Number):String
      var Minutes:Number = (milliSeconds % (songTimeTime * 60 * 60)) / (songTimeTime * 60);
      var Seconds:Number = (milliSeconds % (songTimeTime * 60 * 60)) % (songTimeTime * 60) / songTimeTime;
      if (Minutes < 10)
      var displayMinutes:String = "0" + Math.floor(Minutes);
      else
      displayMinutes = Math.floor(Minutes).toString();
      if (Seconds < 10)
      var displaySeconds:String = "0" + Math.floor(Seconds);
      else
      displaySeconds = Math.floor(Seconds).toString();
      return displayMinutes + ":" + displaySeconds;
    function convertTimeLength(milliSeconds:Number):String
      var Minutes2:Number = (milliSeconds % (1000 * 60 * 60)) / (1000 * 60);
      var Seconds2:Number = (milliSeconds % (1000 * 60 * 60)) % (1000 * 60) / 1000;
      if (Minutes2 < 10)
      var displayMinutes2:String = "0" + Math.floor(Minutes2);
      else
      displayMinutes2 = Math.floor(Minutes2).toString();
      if (Seconds2 < 10)
      var displaySeconds2:String = "0" + Math.floor(Seconds2);
      else
      displaySeconds2 = Math.floor(Seconds2).toString();
      return displayMinutes2 + ":" + displaySeconds2;

    this is a public forum.  no one here (or anywhere else that i know of) is obligated to work for you for free.
    your options are to keep working on this yourself or hire someone to help you.  if you can narrow down the problem's location and post the problematic code you could still get free help.
    or just wait.  given enough time maybe someone willing to donate their time to help you will read your post.

  • Chart Error - scroller positions should be positive and integer

    <p>
    Hello Expert
    I have created a flash chart with two filters on the chart region.
    i) &lsquo;Select list with submit' ----- (:P23_TRC)
    ii) &lsquo;Radio button with submit' -----(:P23_IMPACTC)
    The chart should display as per the filters selection.
    However, I get the error message "<strong>scroller positions should be positive and integer</strong>", once, whenever I load this chart page for the 1st time in a new IE window.
    After I change the filter's value it will work perfectly fine.
    In filters default value is one value from respective filter list of value
    </p>
    <p>
    If I remove the filter conditions from chart query, it works perfectly without error.
    <u>Here are my chart series queries</u>
    select null link, V.LOB label, COUNT(TR) "Customer Care"
    from V_PROCESSTRACKING V
    Where V.ProcessArea like '%Customer Care%' and (V.TR = :P23_TRC) AND ((V.IMPACT = :P23_IMPACTC)OR (:P23_IMPACTC = 'ALL'))
    group by V.LOB
    order by V.LOB
    select null link, V.LOB label, COUNT(TR) "Sales"
    from V_PROCESSTRACKING V
    Where V.ProcessArea like '%Sales%' and (V.TR = :P23_TRC) AND ((V.IMPACT = :P23_IMPACTC)OR (:P23_IMPACTC = 'ALL'))
    group by V.LOB
    order by V.LOB
    <u>Customer XML</u>
    &lt;?xml version = "1.0" encoding="utf-8" standalone = "yes"?&gt;
    &lt;root&gt;
    &lt;type&gt;
    &lt;chart type="Stacked Horizontal 3DColumn"&gt;
    &lt;animation enabled="yes" appearance="size" speed="10" /&gt;
    &lt;hints auto_size="yes"&gt;
    &lt;text&gt;&lt;![CDATA[{NAME}, {VALUE}]]&gt;&lt;/text&gt;
    &lt;font type="Verdana" size="10" color="0x000000" /&gt;
    &lt;/hints&gt;
    &lt;names show="no"/&gt;
    &lt;values show="no" prefix="" postfix="" decimal_separator="." thousand_separator="," decimal_places="0" /&gt;
    &lt;arguments show="no" /&gt;
    &lt;column_chart column_space="3" block_space="12"&gt;
    &lt;border enabled="no" /&gt;
    &lt;block_names enabled="yes" placement="chart" position="left" &gt;
    &lt;font type="Verdana" size="10" color="0x000000" /&gt;
    &lt;/block_names&gt;
    &lt;/column_chart&gt;
    &lt;/chart&gt;
    &lt;workspace&gt;
    &lt;background enabled="yes" type="solid" color="0xffffff" alpha="0" /&gt;
    &lt;base_area enabled="no" /&gt;
    &lt;chart_area enabled="yes" x="215" y="50" width="705" height="500" deep="0"&gt;
    &lt;background enabled="no"/&gt;
    &lt;border enabled="yes" size="1"/&gt;
    &lt;/chart_area&gt;
    &lt;x_axis name="Line of Business" smart="yes" direction="horizontal" rotation="-90" position="left_center" &gt;
    &lt;font type="verdana_embed_tf" size="14" color="0x000099" bold="yes" align="center" /&gt;
    &lt;/x_axis&gt;
    &lt;y_axis name="No. of Process" smart="yes" position="center_bottom" &gt;
    &lt;font type="Verdana" size="14" color="0x000099" bold="yes" align="center" /&gt;
    &lt;/y_axis&gt;
    &lt;grid&gt;
    &lt;values /&gt;
    &lt;/grid&gt;
    &lt;/workspace&gt;
    &lt;legend enabled="yes" x="935" y="50"&gt;
    &lt;names enabled="yes"&gt;
    &lt;font type="Verdana" size="9" color="0x000000" bold="yes"/&gt;
    &lt;/names&gt;
    &lt;values enabled="no"/&gt;
    &lt;scroller enabled="no"/&gt;
    &lt;header enabled="no"/&gt;
    &lt;background alpha="0"/&gt;
    &lt;/legend&gt;
    &lt;/type&gt;
    #DATA#
    &lt;/root&gt;
    <strong>Help please!!!!! It's urgent</strong>
    Sagar
    </p>

    Hi Rima,
    I found the solution,
    My graph is dependent on the page items. What I found was when I load the page, item default value was displayed but it was not stored in the memory. Item value only gets stored in memory when the page is submitted.
    Line: -----
    Soultion : - Create a page level before header process and define the default value over here as well. This will resolve your error.
    Hopefully you understood what I am trying to explain. If not let me know and I will trying to put in picture and email you.
    Sagar

  • Adjust position and size of textField and button...

    Dear All,
    I have the following sample program which has a few textFields and a button, but the positions are not good. How do I make the textField to be at the right of label and not at the bottom of the label ? Also how to adjust the length of textField and button ? The following form design looks ugly. Please advise.
    import javax.swing.*; //This is the final package name.
    //import com.sun.java.swing.*; //Used by JDK 1.2 Beta 4 and all
    //Swing releases before Swing 1.1 Beta 3.
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.text.*;
    import javax.swing.JTable;
    import javax.swing.JScrollPane;
    import javax.swing.JPanel;
    import javax.swing.JFrame;
    public class SwingApplication extends JFrame {
    private static String labelPrefix = "Number of button clicks: ";
    private int numClicks = 0;
    String textFieldStringVEHNO = "Vehicle No";
    String textFieldStringDATEOFLOSS = "Date of Loss";
    String textFieldStringIMAGETYPE = "Image Type";
    String textFieldStringIMAGEDESC = "Image Description";
    String textFieldStringCLAIMTYPE = "Claim Type";
    String textFieldStringSCANDATE = "Scan Date";
    String textFieldStringUSERID = "User ID";
    String ImageID;
    public Component createComponents() {
    //Create text field for vehicle no.
    final JTextField textFieldVEHNO = new JTextField(5);
    textFieldVEHNO.setActionCommand(textFieldStringVEHNO);
    //Create text field for date of loss.
    final JTextField textFieldDATEOFLOSS = new JTextField(10);
    textFieldDATEOFLOSS.setActionCommand(textFieldStringDATEOFLOSS);
    //Create text field for image type.
    final JTextField textFieldIMAGETYPE = new JTextField(10);
    textFieldIMAGETYPE.setActionCommand(textFieldStringIMAGETYPE);
    //Create text field for image description.
    final JTextField textFieldIMAGEDESC = new JTextField(10);
    textFieldIMAGEDESC.setActionCommand(textFieldStringIMAGEDESC);
    //Create text field for claim type.
    final JTextField textFieldCLAIMTYPE = new JTextField(10);
    textFieldCLAIMTYPE.setActionCommand(textFieldStringCLAIMTYPE);
    //Create text field for scan date.
    final JTextField textFieldSCANDATE = new JTextField(10);
    textFieldSCANDATE.setActionCommand(textFieldStringSCANDATE);
    //Create text field for user id.
    final JTextField textFieldUSERID = new JTextField(10);
    textFieldUSERID.setActionCommand(textFieldStringUSERID);
    //Create some labels for vehicle no.
    JLabel textFieldLabelVEHNO = new JLabel(textFieldStringVEHNO + ": ");
    textFieldLabelVEHNO.setLabelFor(textFieldVEHNO);
    //Create some labels for date of loss.
    JLabel textFieldLabelDATEOFLOSS = new JLabel(textFieldStringDATEOFLOSS + ": ");
    textFieldLabelDATEOFLOSS.setLabelFor(textFieldDATEOFLOSS);
    //Create some labels for image type.
    JLabel textFieldLabelIMAGETYPE = new JLabel(textFieldStringIMAGETYPE + ": ");
    textFieldLabelIMAGETYPE.setLabelFor(textFieldIMAGETYPE);
    //Create some labels for image description.
    JLabel textFieldLabelIMAGEDESC = new JLabel(textFieldStringIMAGEDESC + ": ");
    textFieldLabelIMAGEDESC.setLabelFor(textFieldIMAGEDESC);
    //Create some labels for claim type.
    JLabel textFieldLabelCLAIMTYPE = new JLabel(textFieldStringCLAIMTYPE + ": ");
    textFieldLabelCLAIMTYPE.setLabelFor(textFieldCLAIMTYPE);
    //Create some labels for scan date.
    JLabel textFieldLabelSCANDATE = new JLabel(textFieldStringSCANDATE + ": ");
    textFieldLabelSCANDATE.setLabelFor(textFieldSCANDATE);
    //Create some labels for user id.
    JLabel textFieldLabelUSERID = new JLabel(textFieldStringUSERID + ": ");
    textFieldLabelUSERID.setLabelFor(textFieldUSERID);
    Object[][] data = {
    {"Mary", "Campione",
    "Snowboarding", new Integer(5), new Boolean(false)},
    {"Alison", "Huml",
    "Rowing", new Integer(3), new Boolean(true)},
    {"Kathy", "Walrath",
    "Chasing toddlers", new Integer(2), new Boolean(false)},
    {"Mark", "Andrews",
    "Speed reading", new Integer(20), new Boolean(true)},
    {"Angela", "Lih",
    "Teaching high school", new Integer(4), new Boolean(false)}
    String[] columnNames = {"First Name",
    "Last Name",
    "Sport",
    "# of Years",
    "Vegetarian"};
    final JTable table = new JTable(data, columnNames);
    table.setPreferredScrollableViewportSize(new Dimension(500, 70));
    //Create the scroll pane and add the table to it.
    JScrollPane scrollPane = new JScrollPane(table);
    //Add the scroll pane to this window.
    getContentPane().add(scrollPane, BorderLayout.CENTER);
    final JLabel label = new JLabel(labelPrefix + "0 ");
    JButton buttonOK = new JButton("OK");
    buttonOK.setMnemonic(KeyEvent.VK_I);
    buttonOK.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
              try {
    numClicks++;
              ImageID = textFieldVEHNO.getText() + textFieldDATEOFLOSS.getText() + textFieldIMAGETYPE.getText();
    label.setText(labelPrefix + ImageID);
              ScanSaveMultipage doScan = new ScanSaveMultipage();
              doScan.start(ImageID);
         catch (Exception ev)
    label.setLabelFor(buttonOK);
    * An easy way to put space between a top-level container
    * and its contents is to put the contents in a JPanel
    * that has an "empty" border.
    JPanel pane = new JPanel();
    pane.setBorder(BorderFactory.createEmptyBorder(
    20, //top
    30, //left
    30, //bottom
    20) //right
    pane.setLayout(new GridLayout(0, 1));
         pane.add(textFieldLabelVEHNO);
         pane.add(textFieldVEHNO);
         pane.add(textFieldLabelDATEOFLOSS);
         pane.add(textFieldDATEOFLOSS);
         pane.add(textFieldLabelIMAGETYPE);
         pane.add(textFieldIMAGETYPE);
         pane.add(textFieldLabelIMAGEDESC);
         pane.add(textFieldIMAGEDESC);
         pane.add(textFieldLabelCLAIMTYPE);
         pane.add(textFieldCLAIMTYPE);
         pane.add(textFieldLabelDATEOFLOSS);
         pane.add(textFieldDATEOFLOSS);
         pane.add(textFieldLabelUSERID);
         pane.add(textFieldUSERID);
    pane.add(buttonOK);
         pane.add(table);
    //pane.add(label);
    return pane;
    public static void main(String[] args) {
    try {
    UIManager.setLookAndFeel(
    UIManager.getCrossPlatformLookAndFeelClassName());
    } catch (Exception e) { }
    //Create the top-level container and add contents to it.
    JFrame frame = new JFrame("SwingApplication");
    SwingApplication app = new SwingApplication();
    Component contents = app.createComponents();
    frame.getContentPane().add(contents, BorderLayout.CENTER);
    //Finish setting up the frame, and show it.
    frame.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    frame.pack();
    frame.setVisible(true);

    Post Author: Ranjit
    CA Forum: Crystal Reports
    Sorry but, i've never seen formula editor for altering position and size. If you know one please navigate me.
    I guess you have updated formula editor beside "Lock size and position" - if yes its not right. There is only one editor beside 4 items and editor is actually for Suppress.
    Anyways, A trick to change size a position is:
    Create 4-5 copies (as many as you expect positions) of the text object. place each at different positions,  right click, Format, Suppress and in formula editor for suppress write the formula: If your condition is true, Suppress=false, else true.
    Position will not change but user will feel; for different conditions -position is changed
    Hope this helps.
    Ranjit

  • Use incremental rotary encoder to measure the absolute position and velocity

    Hi all,
    I faced a problem by using incremental rotary encoder to measure the absolute position of the rotation. 
    I'm not using NI-Daqmx but NI-motion module. In NI-motion module, I use read encoder position.vi to read the position of the encoder. 
    However, the readings is in incremental form. I'm doing the feedback control, so I need the absolute position and velocity.
    Is there any functions or vi in the labview that can be used to transform the information of incremental encoder to the absolute one?
    Thanks
    Jun Wong

    Jun,
    1. The incremental encoder provides incremental position. After switching on the encoder power the encoder counts upwards or downwards. For the absolute position you need the index (R or I) signal. I don't know which type of incremental encoder you have but there should be A, B and (I or R) signals. The index signal should reset the counter to zero setting this way a pseudo-absolute-position (which is lost after the first switch of). Most of the motion controllers have a mode, just after switch on, in which the controller search for the Index. This mode is called Homing. 
    2. Velocity. It's very simple. You sample the position with a fix sampling clock. Let's say: 10kHz. The speed is: (Actual Position - Previous Position) / Sampling Period. Pos[n] = 10.000inc, Pos[n-1] = 9.900inc. Speed = 10.000 - 9.900 / (1/10kHz) = 1.000.000 inc/sec. If one increment is 0.0001mm then the speed is 100mm/sec.
    Paul 

  • Recording of temperature, power and speed at the time of confirmation

    Hi experts,
    My client requires to record the temperature,power and speed of the equipment while doing the phase wise confirmation. I'm planning to put inspection characteristics for the operations. I'm not going to use PI sheet.
    Is this inspection characteristics assignment to record the parameters is correct?
    Any other option to do this apart from PI sheet.
    Anybody help me.
    Naren

    Dear ,
    It will be better  to capature those  parametres as Inspection Characterstic  before confirmation posting .
    However , if you want to capture as activity through certail formula key and activity price , then you can identify them as Satndard Values as like Labour , Machine and Setup .
    Go-to : OP7B "Parameters Overview"
    Define your requirements Eg.  For Power u2013 say ZELECT like that 
    (Short Key work/Keyword u2013 Electricity, Dimension " Energy", Std. Value Unit u2013 KWH)
    Then Go-to : OP19 " Standard Value Key Formula : Overview "
    Select SAP1 u2013 Normal Production and Copy as (F6) and Create new Activity Type Say eg. ZELE
    Then Assign this new Parameter ZELECT and save (handle the transport request)
    For Formula Definition :
    Go-to : OP54 "Formula Definition"
    Select SAP002 u2013 Prod.: Machine Time and Copy as (F6) and Create ur new Formula Say Eg. ZELECT
    And replace SAP_02 with your Parameter u2013 ZELECT
    Then itu2019ll look some thing like "ZELECT * SAP_09 / SAP_08 / SAP_11"
    Assign The Standard Value Key " ZELE" to your Work Center-Basic Data Screen
    Now Go-to Costing Tab Page assign your formula to your Predefined Activity Type for Power.
    (Otherwise u2013 First Create Secondary Cost Element (T.Code KA06), Assign this Sec. Cost Element to your new Activity Type, then KP26 " Change Activity / Price Planning" 
    Assign Activity Type in Work Center Costing Tab & Assign Your Formula)
    You can assign max. 6 Standard Values to your WC, I.e If you want to capture Power & Fuel Consumption for an Operation you can have both parameters set as per above procedure
    Regards
    JH

  • Controling Position and Velocity of trolley

    Hey,
    I am working on an application for a engineering design project that requires me to control the position and velocity of a trolley on a linear track.
    I have done some work in LabWindows before controlling the speed and position of a linear movement but am having some troubles shifting my knowledge from a small application to what I am working on now. This is what my plan is; I currently have a motor (DC 24V 88A), String potentiometer to determine linear distance travelled (there was risk of slip and need of high precission), sufficiently sized power supply and BNC-2110 DAQ.
    My plan (which I am looking for some feedback on ... no pun intended) is to use LabView to create a PWM (which has already been done) to control the speed of the motor via the counter turning on and off a power mosfet completing the Motor's circuit. By varying the time on and off I hope to control the speed. 
    After this has been completed I hope to hook up my string potentiometer to the Trolley and see how it's position changes over time (i.e. determine the speed at which the trolley is moving at for a variety of different % time on and off). This will act as an open loop test, which I was hoping to then figure out a practical transfer function for the motion of the trolley and then somehow use the String Pot as a feedback sensor to complete the loop and create a PI controller. I am having a hard time wrapping my mind around how I am suppose to put the later bit into practice. It all sounds fine on paper but actually approaching an implementation of this idea is boggling my mind.
    Any input or pointers would be greatly appreciated. Am I on the right track or am I looking at something completly wrong... being a student I guess I don't know exactly how things are done in practice in industry, just what is written in books so any help would greatly appreciated.
    Thanks!
    Mac

    Mac,
    starting with an open loop system, determining the transfer function and designing the control algorithm is a reasonable approach albeit a little bit academic.
    A more empiric approach is tuning the closed loop motion control system by means of test functions like white noise or a setpoint step. Here you can find some information about tuning a motion control system by analyzing the step response of the closed loop system (Please note, that this document refers to NI motion control boards, but the general approach of the tuning process is universal).
    This brings me to something very essential. Stable control systems require a deterministic real-time environment. You haven't provided explicit information about the environment that you are intending to use, but it sounds like you are planning to use a Windows based system with LabVIEW. This is not recommended, as such a system can't guarantee stable control loop timing, which is at least as important as the right set of PID parameters.
    So my recommendation here is to use either a motion control board which runs the control algorithm onboard or to run the application with the DAQ board under LabVIEW RealTime (could run on a PXI-system or on desktop PCs that meet certain requirements). If you are going for the second approach, you may also consider using the NI SoftMotion Development Module.
    If there is any kind of campus license of NI-Software available at your university, all the required software components should be already available for you.
    Last but not least here are some considerations about the power circuitry. You have suggested to use a PWM signal that controls a single mosfet. This approach is not feasible in most applications, as it doesn't allow you to control the position and the speed of the motor accurately. To do this, you need to be able to drive the motor in both directions. You could do this by using an H-bridge circuitry, but this requires some more considerations when designing the control algorithm. In fact in most cases you would work with two cascaded control loops. The inner control loop is the current control loop, that generates the signals for the H-bridge, while the outer control loop is the position/velocity control loop.
    Depending on the focus of your project, you may also consider using a commercial motion drive that provides the power circuitry and the current control loop. Those devices typically provide a +/- 10 V input for an external control signal that is provided by the outer control loop.
    I hope this information provides some ideas to getting started.
    Kind regards,
    Jochen Klier
    National Instruments

  • Use DasyLab to measure torque, rotary position, and RPM

    I'm new to DasyLab and am developing an application to measure torque, rotary position, and RPM.  I'll be using an Interface T8 pedestal torque transducer with a built-in rotary encoder capable of measuring angular position, speed, and direction.  The encoder will be outputting 5V TTL at one pulse per degree.  I'm using an MCC 1608GX USB DAQ device capable of reading analog and digital signals.  I'm looking for insight on reading the TTL output from the encoder and converting it to angle and speed.  Any help would be appreciated.

    OK,
    If you want to go directly to the 1608 you need to take the counter input and use it as a frequency input.  This will give you the Frequency of the encoder that you can convert to RPM but I don't think you will be able to detect the direction.
    To my experience the signal is not very stable due to the software pull but good enough if precision is not a question.
    Another oprion is to buy an additional small frequency to analog converter that will take a dirrential output.  This units can usually be programmed for +/- Frequnecy to +/- rpm.
    There are models out there that are designed fo quadrature encoders.  The link below is a good example.
    www.laurels.com/downloadfiles/LTA-manual-pulse-in.pdf
    Tom Rizzo
    InSyS Corp.
    www.insyscorp.com
    Your DASYLab integrator

  • MacBook Pro (13-inch, Mid 2009) - Maximum internal hard drive size and speed?

    What is the maximum size of hard drive and speed for an internal hard drive to my Macbook Pro (13 inch, Mid 2009), please?
    I bought myself a Technics 1TB, 7200 rpm internal hardrive. Made a clone successfully in Super Duper.
    It fits, but It is not available for starting up my Macbook Pro. Not available in System Prefs, but visible and grey in Disc Utility.
    Although it starts up my Mac Pro just fine.. but not my Macbook Pro.
    Is there a limit of hard drive specifics?
    What is the maximum size of hard drive and speed for an internal hard drive to my Macbook Pro (13 inch, Mid 2009), please?

    Thanks for the reply
    I cloned the Technics HDD ( 2,5" HGST Travelstar 7K1000 - 1 TB : HTS721010A9E630) from the MBP.
    I tried to boot it up with my Technincs ( 2,5" HGST Travelstar 7K1000 - 1 TB : HTS721010A9E630) installed in my MBP (as my internal hard drive).

  • Can I use more than one blue-tooth device at the same time on IPhone 4S? Like a wireless headsets and speed and cadence sensor for cycling computer, receive the data and listen music simultaneously

    Can I use more than one blue-tooth device at the same time on IPhone 4S? Like a wireless headsets and speed and cadence sensor for cycling computer, receive the data and listen music simultaneously

    As long as the profiles are different (ex. HID vs AD2P) you will not have any issues. But say if you try to use 2 keyboards at once, it won't work. Or 2 headsets at once. Your scenario seems fine.

  • Can the position and szing of a control element in a View be controlled from the ViewModel?

    Is it possible to change the position of a control, say a label, as a response to some action/operation from the ViewModel?  Like if one response to something is true then place the label in the top left corner.  If false, place the label
    in the lower right corner.  I realize you could have a label in each position and just set the visibility.  But can the position and sizing of said label be controlled from the View Model?  What would be a sample coding of this?  would
    it be in the xaml or combination of a method in the ViewModel and the xaml? 
    Rich P

    First off Rich, say TextBlock to yourself ten times.
    Use a TextBlock rather than a label.
    There are a bunch of different ways to do this and the easiest is to have two controls whose text is bound to the one property.
    Bind the Visibility of each to another 2 properties in the viewmodel.
    Collapse one and Visible the other.
    The reason for that is that it's easier.
    Technically, you could put one textblock in a grid and use margin to control this.  You could animate x y co-ordinates and move the textblock mysteriously across the window if you put your mind to it.
    Or you could put it in a row/column "cell" of a grid and change which cell it goes in - but that would involve some mechanism like messaging from the viewmodel to the view and is not really ideal if you can avoid it.
    I'd have a pair of textblocks, here's one:
    <TextBlock Name="TopLeftMsg"
    Text="{Binding Msg}"
    Visiblity="{Binding TopLeftVis}"
    Both would bind to a public string property msg in the viewmodel.
    They each get their own public visibility property  and that'd be switched between Visibility.Visible and Visibility.Collapsed.
    Sizing of textblocks is best fitted to content because all you see is the text.
    Textboxes are arguably different because you can see the things.
    Hope that helps.
    Recent Technet articles:
    Property List Editing;  
    Dynamic XAML

  • Creation of lsmw for updation of position and pers area

    Hi friends,
    I am tried many time to update position and personnel area through lsmw for all employees ,at time of recording its coming.But once compltion of lsmw preparation i am uploaded my inputs through tabfile that time its updating only personnel number and infotype  and its asking the save the action screen (At the same time its showing one popup below screen like there is no recording for mp000000).Can you tell any one there whats the problem.At the same time is it possible to upload the position and personnel area through lsmw.
    Thanks,
    arjun.

    Hi Arjun
    Are you performing a hiring actions, if you are performing a hiring action, when you start with LSMW, the recording should be correct with hire date or start date, personnel number, reason for hire, position number, personal area, employee group and subgroup.
    The source field you specific should contain the required field name, type, length and field discription.  The field mapping should be done perfectly and assign the specified file in txt format and try to upload.
    If you are facing any problem, let me know.  I think I can help you
    Regards
    Santhosh.S

  • How to check position and length of a field in a structure

    Dear All,
    DATA :  P_DEST TYPE ANY.
    Assuming that the structure (P_DEST ) conatins a field called 'ROUTE', how to find the position and length of field 'ROUTE'.
    Please help!!
    Thank you in advance.
    Sravan.

    Hi,
    you may need to find out the type of a generic interface parameter in a subroutine. To do this, you would use the statement:
    DESCRIBE FIELD <f> [LENGTH <l>] [TYPE <t> [COMPONENTS <n>]]
                       [OUTPUT-LENGTH <o>] [DECIMALS <d>]
                       [EDIT MASK <m>] [HELP-ID <h>].
    The attributes of the data object <f> specified by the parameters of the statement are written to the variables following the parameters.
    Regards
    Sudheer

  • On my canon powershot A3300IS the lense is stuck in the extended position and will not close

    I have a canon powershot A3300 IS  the lense is stuck in the extended position and will not close. How can I fix this myself?

    Forneypamela,
    Please remove the battery from the camera for a few minutes.  Then, put the battery back in the camera and power it on again.  If the lens is still stuck in the extended position, the camera is going to need service.  I apologize for any inconvenience this may cause.
    To start your repair process, you'll need to complete a Repair Request on our website.
    If the camera is more than a year old, you may participate in the Canon Loyalty Program instead.  The Canon Loyalty Program option allows you to replace your current camera for a discounted fee, plus shipping.  The unit offered through this program carries a 90 day warranty.  The original non-functioning camera would then be returned to Canon USA for recycling using a prepaid shipping label that would be provided.
    If you would like to take part in this option, please call our Sales Department at (800) OK CANON (800-652-2666) seven days a week, 8am to Midnight.  Let them know you have been working with online support and the Canon Loyalty Program was offered.  Be sure to have your serial number for your camera at the time of your call.
    If this is a time sensitive-matter, additional support options are available at Contact Us.
    Did this answer your question? Please click the Accept as Solution button so that others may find the answer as well.

Maybe you are looking for