I never considered that people would be embedding my class into another class. COOL!

The reason I didn't go with a default constructor is that for the pid to run correctly, it HAS to have the things specified in the current constructor (input, output, setpoint, tuning parameters.) I figured that would be a gentle way to get people to specify them.

maybe a middle of the road option would be to include a default constructor but have it commented out? if you're writing a new class you'll likely have the know-how to find/ uncomment. if you're the standard Arduino user you'll notice no change. thoughts?

psyber is using the library in a way I never even considered. Most people will take the pid library and use it right in their Arduino program, the way my example illustrates.

the way I understand it, psyber encountered a problem trying to embed a pid within a library of his own creation. On the library creation side, the rules are a little different. To make it work, he needed to -very lightly- massage the pid library code. His suggestion was aimed at saving the next guy some trouble.

Here is another vote for making it easier to embed the PID library in another class. I was in the process of creating a motor control class which would embed a PID controller to set the PWM signal to the motor when I saw psyber's post.

Edit:It may not be necessary to add a default constructor. I haven't tested this yet but it does compile.

I want to make a motor controller that uses distance as the target but is able to accelerate until reaches a certain speed (sometimes is max speed), continue with that speed until almost at destination and decelerate until it reaches the target distance and stops. Sometimes I need to make small adjustments and speed never reaches the set speed and needs to decelerate because it reaches the destination. Any advices on how to do that? Thanks.

Can this PID library include a function to accelerate from 0 to SetSpeed and continue at that speed until the SetPoint is reached (because it will automatically decelerate before reaching the SetPoint)?

I have tried to do a function that accelerates until Speed = SetSpeed and only then activate the PID controller, but sometimes I need to make small corrections so the Speed never reaches SetSpeed. Can this be done in the PID controller?

I don't think so. the pid is a "simple" control element whose job is to make Input = Setpoint. once you want to do more complicated things, you'll need to make the pid part of a larger control strategy. it sounds like that's what you're trying to do anyway, so let's talk about that.

First, I'm not sure I completely understand your application. You use both SetSpeed and SetPoint in your question. I'm would assume that Speed is the output from the pid, and Setpoint is the value you want the PID Input to achieve. I'm not sure though.

I don't want to give you bad advice at this point. Could you give a description of what it is you're trying to do in the real world (i.e. "I've got this thermonuclear jetpack, and I'm tyring to control take-off velocity. my inputs and outputs are...") I'll be able to give better advice once I know what it is you're trying to do.

I had to look up initialization lists, in my real life I've never used them. In another environment I'd include a pointer to a PID object in my class and use new to create it in the constructor.

Nice! I figured there was some way to do it without monkeying around with the original library. I just wish there was a more intuitive method as my C/C++ is extremely rusty. I don't think this is covered in any of my old textbooks either.

br3ttb:As for the middle ground solution, I see no difference between you adding the code and then commenting it out, and having a developer simply add the code. In either case someone still has to edit the class and rebuild the library.

I hate to resurrect this old thread, but it is a good one, and the PID software looks really good.

Before finding this thread, I wrote my own. I was particularly interested to see how wind-up was handled. I saw that the Integral term was not incremented when the output was maxed.

This seems like a great idea, but doesn't it cause a bit of a glitch when the output drops down from max? Maybe the integral term is well below the value resulting in maximum output due to some other factor such as the differential.

Is this really going to make much of a glitch under these circumstances? I suspect that a "properly" tuned loop will not have such odd behaviour that the differential can push the output that far up/down.

I attempted to limit wind-up by not allowing the integral term to exceed the value that results in full output on its own. Is this not good enough?

I've actually decided to ditch the idea of a lite version. Instead I'm working on reducing the footprint of the full version. The next revision of the library is almost done. it uses integer math throughout, so it's about half the size and 10X faster.

Brett

[edit]On second thought I may be able to add some preprocessor flags to remove a lot of the extra functionality, resulting in a lite library. I'll see what I can do[/edit]