For a project I have, I control a BLDC motor with it's own current controller.
To design a controller for the motor I fitted some time traces to the flowing function:
to capture the dynamics of the entire system, namely, motor, current controller/driver and load.
J is the rotor inertia, [kg*m^2]
r a dampening constant (linear friction)
tau is a torque constant [Nm/A]
u[t] a current input
der(der(phi)) is the angular acceleration
der(phi) the angular velocity
The fitted values represent the entire system more than good enough for a 'continuous' approximation of the motor, the load and the current controller/driver of the motor. With the control scheme, I give a signal u(t) in Amps, and I expect a torque and an angular velocity as an output. At the time I only needed the angular velocity, but I digress, this method worked fantastically, but was fitted and designed in mathematica.
I would like to build a much larger, and significantly more complex robotic system within modelica (Systemmodeler specifcally, however, modelica library 3.2.x), however I am having some issues.
My first attempt was:
However, when simulating this with another outside load (an external model), I have a lot of issues, from some those more experienced than I, I am told this form of modelling is 'one way' and not the 'modelica method' but more simulink in form.
Namely, it should be bi-directional, not just numerical outputs, in order to correctly react with the multibody external model, this will connect to.
My second attempt was:
Which when connecting to my larger multibody model, it does indeed work more like it's expected to, there is a reaction from this model, when external torques/loads are applied. However, when simulating this model to see how it fairs compared to the pure block model, they arn't the same by any means. I had to spend a lot of time trying to fit the inertia and friction data to get similar results.
SO my question is, what is the best method, to turn pure block models (mathematical ones) or atleast,my pure block model, into a more realistic model or atleast, the connecting outputs into more realistic, or I guess 'acasual' ones.
I would prefer not to use my second attempt, since I can't trust the values I had to adjust compared to the block to actually be correct, since they arn't fitted values to real world data, compared to my first model.
Difficult to answer in general. Basically you need to understand which model corresponds to which part of the system/equation you want to model and then combine them to result in the same overall behavior.
The original model/equation seems consist of (correct me if I'm misunderstanding the equation):
J * dot(dot(phi))
r * dot(phi)
tau * u(t)
If you don't know the components I think there is no way besides investing time into understanding the Modelica code or at least the documentation of each component.
I would use the following components to describe the behavior
Modelica.Mechanics.Rotational.Components.Inertia
Modelica.Mechanics.Rotational.Components.Damper
Modelica.Blocks.Math.Gain
andModelica.Mechanics.Rotational.Sources.Torque
The result of this is:
As an extension I would suggest to use the physical quantity (current) as an input. This can be done by changing the model to:
Extending the model with two more meaningful components (Resistance and Inductance as asked for in the first comment) results in:
Note: The model is actually a 1~ representation of a 3~ motor. I think the parameters for terminal resistance/inductance should still be valid, but I would strongly suggest to validate the model by e.g. computing speeds at no-load operation and nominal load.
In case you need the code from which the above screenshots were generated (using MSL 4.0.0):