PID loop with a different command and feedback units / types

Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
4 replies · 2K views
btb4198
Messages
570
Reaction score
10
I have a laser and I am adjusting it's position using a motor, and I am reading the laser light intensity at the top and bottom using a sensor.
then I divide the top from the bottom and the goal is to get around 0.97%. This is called delta, if delta is too high, you move the motor lower and if delta is too lower we move it up.

now I coded a PID, the program I have my command is in motor steps(position) but my feed back is in light intensity percent.

so how do I set up my PID ? can I even use a PID this way ?

here is my code:
Code:
  GetValue()
  {
 
    PID_controller PID = new PID_controller(2, 1, 0);
  ****
 
  stepsize = (int)PID.UpdatePID(Convert.ToDouble(stepsize), delta);
                 stepsize = changeStepSize( stepsize);
                
                
    ***
                
                 }
    public PID_controller(int Proportional, int Integral, int differential)
        {
            this.Proportional = Proportional;
            this.Integral = Integral;
            this.differential = differential;
             Istate = 0D;
            error_counter = 0;
             lastposition = 0;
        }        double getPTerm(double command , double position)
        {
            double error = command - position;

            Istate += error;
            error_counter++;
            return error;
        }

        double getITerm()
        {
            double Integralvalue = Istate / error_counter;
            return Integralvalue;
        }

        double getDTerm(double position)
        {
            lastposition = position;
            double differential = lastposition - position;
            return differential;
        }

       public double UpdatePID( double command, double position)
        {
            double error = getPTerm(command, position);
            double perror = getITerm();
            double derror = getDTerm(position);
            command = (Proportional * error) + (Integral * perror) + (differential * derror);
            return command;
        }
 
Engineering news on Phys.org
btb4198 said:
I have a laser and I am adjusting it's position using a motor, and I am reading the laser light intensity at the top and bottom using a sensor.
then I divide the top from the bottom and the goal is to get around 0.97%. This is called delta, if delta is too high, you move the motor lower and if delta is too lower we move it up.
What is attenuating the laser intensity to around 1%? Is that attenuation variable with something in the setup other than just distance?

If the attenuation is fixed except for the distance variation, there is no need for PID control, IMO. Just do a binary search on distance to get your best match to the 0.97% intensity ratio. If the attenuation is variable with some other part of the setup, how fast can it vary, and how fast can the laser position be changed?

EDIT / ADD -- And what kind of motor is it?
 
Sorry, there was a typo. It is 97%, but we are working in decimal form 0.97. The laser beam is going through a expansion lens.
 
btb4198 said:
The laser beam is going through a expansion lens.
Why do you think you need a servo to control the position of the laser? If nothing is varying in the setup after the initial position and attenuation are verified, what are you having to correct for? Maybe thermal expansion? What linear position resolution do you have with your setup?