Quote:
Originally Posted by sircedric4
Does anyone know what it would take to drive the PIDController based on the averagevoltage of the analog input? Would I set it up like:
turretControl = new PIDController(P,I,D, turretPot->GetAverageVoltage, turretMotor)
Or do I have to do something with the other PIDController sub-classes/functions?
|
The PIDController constructor takes floats for P, I, & D, a PIDSource pointer for the 4th argument, and a PIDOutput for the 5th argument. So assuming P, I, D are just placeholders for your constants, the first three look good. I'm also assuming that in your example, turretPot is an AnalogChannel pointer. Look at AnalogChannel.h and you'll see that it derives from PIDSource. You should just pass in your turretPot object, the way you wrote it should cause a compiler error. Again assuming turretMotor is a Jaguar or Victor pointer, the 5th argument looks good.
If you still don't understand exactly how the PIDController class works, here's a rundown of the methods that get called when it runs:
- The PIDController hooks itself to an interrupt via the Notifier class and the Calculate() method gets called periodically
- Calculate() calls m_pidInput->PIDGet(), where m_pidInput is the source that was passed into the constructor, so look at PIDGet() in the AnalogChannel class. That method is a single line that returns GetAverageValue().
- After a bunch of fancy PID math, Calculate() calls m_pidOutput->PIDWrite(), where m_pidOutput is the output that was passed into the constructor, so look at PIDWrite() in the Jaguar or Victor classes. Those methods are just wrappers for Set().
Hopefully that clears up any misunderstandings about the PIDController.