DiscreteSlewRateLimiter ​
Discrete-time slew rate limiter that limits the rate of change of the input signal.
Note: the sample interval is not taken into account when computing the rate of change, the difference between two consecutive samples is saturated.
The initial condition is selected through the initialization enum. The state of the limiter is the previous output sample:
InitialOutput(y0=...): the previous output is chosen such that the first output equalsy0, given the first input sample.SteadyState: the previous output equals the first input sample, so the limiter starts in equilibrium (the first output equals the first input).InitialState(x0=...): the previous output sample is set tox0.
Usage ​
DiscreteComponents.DiscreteSlewRateLimiter(rate=1.0, rate_negative=rate)
Parameters: ​
| Name | Description | Units | Default value |
|---|---|---|---|
initialization | Initial-condition specification | – | DiscreteCom...t(; y0=0.0) |
rate | Slew rate limit (in positive/increasing direction). Must be a positive number. | – | 1.0 |
rate_negative | Negative slew rate limit, defaults to rate. Must be a positive number. | – | rate |
Connectors ​
u- This connector represents a real signal as an input to a component (RealInput)y- This connector represents a real signal as an output from a component (RealOutput)
Variables ​
| Name | Description | Units |
|---|---|---|
d | Unsaturated rate of change | – |
Behavior ​
Source ​
"""
Discrete-time slew rate limiter that limits the rate of change of the input signal.
Note: the sample interval is not taken into account when computing the rate of change, the difference between two consecutive samples is saturated.
The initial condition is selected through the `initialization` enum. The state of the limiter is the previous output sample:
- `InitialOutput(y0=...)`: the previous output is chosen such that the first output equals `y0`, given the first input sample.
- `SteadyState`: the previous output equals the first input sample, so the limiter starts in equilibrium (the first output equals the first input).
- `InitialState(x0=...)`: the previous output sample is set to `x0`.
"""
component DiscreteSlewRateLimiter@[input clk extends Discrete]
"Input signal"
u = RealInput@[clk]() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": -100, "y1": 450, "x2": 0, "y2": 550, "rot": 0}
},
"tags": []
}
}
"Output signal (slew-rate limited version of the input)"
y = RealOutput@[clk]() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 1000, "y1": 450, "x2": 1100, "y2": 550, "rot": 0}
},
"tags": []
}
}
"Slew rate limit (in positive/increasing direction). Must be a positive number."
parameter rate::Real = 1.0
"Negative slew rate limit, defaults to `rate`. Must be a positive number."
parameter rate_negative::Real = rate
"Initial-condition specification"
structural parameter initialization::InitialCondition = DiscreteComponents.InitialCondition.InitialOutput(y0 = 0.0)
"Unsaturated rate of change"
variable d::Real
relations
d@clk = u@clk - y@(clk-1)
y@clk = y@(clk-1) + clamp(d@clk, -rate_negative, rate)
switch initialization
case InitialOutput
initial y@(clk-1) = ifelse(u@clk > initialization.y0, initialization.y0 - rate, ifelse(u@clk < initialization.y0, initialization.y0 + rate_negative, initialization.y0))
case SteadyState
initial y@(clk-1) = u@clk
case InitialState
initial y@(clk-1) = initialization.x0
end
metadata {
"Dyad": {"icons": {"default": "dyad://DiscreteComponents/DiscreteSlewRateLimiter.svg"}}
}
endFlattened Source
"""
Discrete-time slew rate limiter that limits the rate of change of the input signal.
Note: the sample interval is not taken into account when computing the rate of change, the difference between two consecutive samples is saturated.
The initial condition is selected through the `initialization` enum. The state of the limiter is the previous output sample:
- `InitialOutput(y0=...)`: the previous output is chosen such that the first output equals `y0`, given the first input sample.
- `SteadyState`: the previous output equals the first input sample, so the limiter starts in equilibrium (the first output equals the first input).
- `InitialState(x0=...)`: the previous output sample is set to `x0`.
"""
component DiscreteSlewRateLimiter
"Input signal"
u = RealInput@[clk]() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": -100, "y1": 450, "x2": 0, "y2": 550, "rot": 0}
},
"tags": []
}
}
"Output signal (slew-rate limited version of the input)"
y = RealOutput@[clk]() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 1000, "y1": 450, "x2": 1100, "y2": 550, "rot": 0}
},
"tags": []
}
}
"Slew rate limit (in positive/increasing direction). Must be a positive number."
parameter rate::Real = 1.0
"Negative slew rate limit, defaults to `rate`. Must be a positive number."
parameter rate_negative::Real = rate
"Initial-condition specification"
structural parameter initialization::InitialCondition = DiscreteComponents.InitialCondition.InitialOutput(y0 = 0.0)
"Unsaturated rate of change"
variable d::Real
relations
d@clk = u@clk - y@(clk-1)
y@clk = y@(clk-1) + clamp(d@clk, -rate_negative, rate)
switch initialization
case InitialOutput
initial y@(clk-1) = ifelse(u@clk > initialization.y0, initialization.y0 - rate, ifelse(u@clk < initialization.y0, initialization.y0 + rate_negative, initialization.y0))
case SteadyState
initial y@(clk-1) = u@clk
case InitialState
initial y@(clk-1) = initialization.x0
end
metadata {
"Dyad": {"icons": {"default": "dyad://DiscreteComponents/DiscreteSlewRateLimiter.svg"}}
}
endTest Cases ​
No test cases defined.
Related ​
Examples
Experiments
Analyses