MATLAB Answers


How to bound discrete integrator outputs

Asked by Jonas
on 10 May 2019
Latest activity Commented on by Fangjun Jiang on 13 May 2019
Hi all
I am working on a simulation model which eventually needs to get deployed on actual hardware in production. One thing that now worries me is the outputs of some discrete integrator blocks. As an example, I have a discrete integrator that receives rotational speed in rad/s as an input, and provides rotational angle as an output in rad. Afterwards, I use a simple modulus block to bound this angle output between 0 and 2*pi.
The concern I am having, is that the output of the discrete integrator block will build up indefinitely, while it actually just needs to overflow to 0 when it reaches the 2*pi bound. In simulation, the discrete integrator's output data type is a double, so it is allowed to become very large, but since this is going into production hardware I would like to limit variable sizes if possible.
What I have tried is to set 0 and 2*pi as saturation limits, then output the saturation port and feed it back into the external reset port.
This provides me the functionality, but it seems to give a delay each time it executes. I have compared a regular discrete integrator, by inserting the output angle into a cosine and count how many times the cosine goes up and down, and over 3000 cycles, the implementation of the screenshot above has done 27 cycles less...
Does anyone have a suggestion for bounding the output of a discrete integrator, without any delay?
Thanks much!


Sign in to comment.

1 Answer

Answer by Fangjun Jiang on 10 May 2019
 Accepted Answer

When the saturation happends, it should not reset to zero. It should reset to "Value-2*pi".
Don't enable "Limit output" at this "Discrete-time Integrator" block. Instead, Use a Sum block to calculate the difference "Value-2*pi". Compare the difference, if it is great than zero, trig the re-set of the "Discrete-time Integrator" block. Specify the "Initial condition source" as "external" and feed the difference.


Show 1 older comment
One other addition I want to make, is that the initial condition should be initialized on 0 with an 'IC' block, otherwise it initialises on -2*pi.
Also, I have added logic to allow the output to range from -2*pi to +2*pi to have a general implementation of speed to position integrators for both positive and negative speeds.
With kind regards,
I am not sure if anyone is interested, but I have added functionality that can initialize the integrator on a non-zero value now. Posting a screenshot for completeness.
Good to learn all the details you've implemented. Thanks!

Sign in to comment.