Browse Source

semi active suspension controller example

Claudio Gomes 6 years ago
parent
commit
35e4000768

+ 7 - 0
materials/notes/Controller.mo

@@ -0,0 +1,7 @@
+model Controller
+  extends Modelica.Blocks.Continuous.Interfaces.SISO;
+  parameter Real Kp = 127200;
+  parameter Real Ti = 10;
+  parameter Real Td = 10;
+  Modelica.Blocks.Continuous.PID pid(k=Kp, Ti=Ti, Td=Td);
+end Controller;

+ 39 - 0
materials/notes/QuarterCar.mo

@@ -0,0 +1,39 @@
+
+model QuarterCar
+  parameter Real rubber_stiffness = 127200;
+  parameter Real rubber_damping = 10;
+  parameter Real tire_mass = 28;
+  parameter Real quarter_car_mass = 208;
+  parameter Real suspension_stiffness = 18709;
+  parameter Real suspension_damping = 1300;
+  Modelica.Mechanics.Translational.Sources.ConstantForce gravity_car(f_constant = -Modelica.Constants.g_n*quarter_car_mass);
+  Modelica.Mechanics.Translational.Components.Mass quarter_car(m = quarter_car_mass);
+  Modelica.Mechanics.Translational.Components.SpringDamper suspension(c=suspension_stiffness, d=suspension_damping);
+  Modelica.Mechanics.Translational.Sources.ConstantForce gravity_tire(f_constant = -Modelica.Constants.g_n*tire_mass);
+  Modelica.Mechanics.Translational.Components.Mass tire(m = tire_mass);
+  Modelica.Mechanics.Translational.Components.SpringDamper rubber(c=rubber_stiffness, d=rubber_damping);
+  Modelica.Mechanics.Translational.Sources.Position road(exact=false);
+  Modelica.Blocks.Interfaces.RealInput road_profile;
+initial equation
+  // Define initial state
+  // Car and Tire are steady, that is, no vertical speed nor acceleration.
+  // The weight of those masses has to balance the stiffness of the springs.
+  quarter_car.v = 0.0;
+  quarter_car.a = 0.0;
+  tire.v = 0.0;
+  tire.a = 0.0;
+equation
+  // Connect input road block (a real signal) with road position (a displacement)
+  connect(road.s_ref, road_profile);
+  // Connect road to tire rubber
+  connect(road.flange, rubber.flange_a);
+  // Connect tire rubber to tire mass
+  connect(rubber.flange_b, tire.flange_a);
+  // Connect tire mass to suspension and gravity
+  connect(tire.flange_b, suspension.flange_a);
+  connect(tire.flange_b, gravity_tire.flange);
+  // Connect suspension to quarter car mass
+  connect(suspension.flange_b, quarter_car.flange_a);
+  // Connect quarter car mass with gravity
+  connect(quarter_car.flange_b, gravity_car.flange);
+end QuarterCar;

+ 21 - 0
materials/notes/QuarterCarScenario.mo

@@ -0,0 +1,21 @@
+
+model QuarterCarScenario
+  parameter Real Kp = 1;
+  parameter Real Ti = 1;
+  parameter Real Td = 1;
+  QuarterCar quarter_car;
+  QuarterCarSemiActive quarter_car_act;
+  Modelica.Blocks.Sources.TimeTable road_profile_table(table=[0, 0;
+                                                              1, 0;
+                                                              2, -0.04;
+                                                              3, -0.04;
+                                                              4, 0;
+                                                              5, 0
+                                                              ]);
+  Modelica.Blocks.Continuous.PID pid(k=Kp, Ti=Ti, Td=Td);
+equation
+  connect(quarter_car.road_profile, road_profile_table.y);
+  connect(quarter_car_act.road_profile, road_profile_table.y);
+  quarter_car_act.suspension_damper.d = pid.y;
+  pid.u = quarter_car_act.tire.s - quarter_car_act.quarter_car.s;
+end QuarterCarScenario;

+ 41 - 0
materials/notes/QuarterCarSemiActive.mo

@@ -0,0 +1,41 @@
+
+model QuarterCarSemiActive
+  parameter Real rubber_stiffness = 127200;
+  parameter Real rubber_damping = 10;
+  parameter Real tire_mass = 28;
+  parameter Real quarter_car_mass = 208;
+  parameter Real suspension_stiffness = 18709;
+  Modelica.Mechanics.Translational.Sources.ConstantForce gravity_car(f_constant = -Modelica.Constants.g_n*quarter_car_mass);
+  Modelica.Mechanics.Translational.Components.Mass quarter_car(m = quarter_car_mass);
+  Modelica.Mechanics.Translational.Components.Spring suspension_spring(c=suspension_stiffness);
+  SemiActiveDamper suspension_damper();
+  Modelica.Mechanics.Translational.Sources.ConstantForce gravity_tire(f_constant = -Modelica.Constants.g_n*tire_mass);
+  Modelica.Mechanics.Translational.Components.Mass tire(m = tire_mass);
+  Modelica.Mechanics.Translational.Components.SpringDamper rubber(c=rubber_stiffness, d=rubber_damping);
+  Modelica.Mechanics.Translational.Sources.Position road(exact=false);
+  Modelica.Blocks.Interfaces.RealInput road_profile;
+initial equation
+  // Define initial state
+  // Car and Tire are steady, that is, no vertical speed nor acceleration.
+  // The weight of those masses has to balance the stiffness of the springs.
+  quarter_car.v = 0.0;
+  quarter_car.a = 0.0;
+  tire.v = 0.0;
+  tire.a = 0.0;
+equation
+  // Connect input road block (a real signal) with road position (a displacement)
+  connect(road.s_ref, road_profile);
+  // Connect road to tire rubber
+  connect(road.flange, rubber.flange_a);
+  // Connect tire rubber to tire mass
+  connect(rubber.flange_b, tire.flange_a);
+  // Connect tire mass to suspension and gravity
+  connect(tire.flange_b, suspension_spring.flange_a);
+  connect(tire.flange_b, suspension_damper.flange_a);
+  connect(tire.flange_b, gravity_tire.flange);
+  // Connect suspension to quarter car mass
+  connect(suspension_spring.flange_b, quarter_car.flange_a);
+  connect(suspension_damper.flange_b, quarter_car.flange_a);
+  // Connect quarter car mass with gravity
+  connect(quarter_car.flange_b, gravity_car.flange);
+end QuarterCarSemiActive;

+ 6 - 0
materials/notes/SemiActiveDamper.mo

@@ -0,0 +1,6 @@
+model SemiActiveDamper 
+extends Modelica.Mechanics.Translational.Interfaces.PartialCompliantWithRelativeStates;
+  Modelica.Blocks.Interfaces.RealInput d;
+equation
+  f = d * v_rel;
+end SemiActiveDamper;