1 // =============================================================================
2 // PROJECT CHRONO - http://projectchrono.org
3 //
4 // Copyright (c) 2014 projectchrono.org
5 // All rights reserved.
6 //
7 // Use of this source code is governed by a BSD-style license that can be found
8 // in the LICENSE file at the top level of the distribution and at
9 // http://projectchrono.org/license-chrono.txt.
10 //
11 // =============================================================================
12 // Authors: Radu Serban, Rainer Gericke
13 // =============================================================================
14 //
15 // Simple powertrain model for the MAN 5t vehicle.
16 // - based on torque-speed engine maps
17 // - both power and torque limited
18 // - no torque converter
19 // - simple gear-shifting model (in automatic mode)
20 //
21 // Original Engine Deutz F8L513F 256 kW, no data avilable, out of production
22 // Used: Deutz TCD 2013 L4 4V 181 kW found at https://www.deutz.com/produkte/motoren/
23 //
24 //
25 // =============================================================================
26
27 #include "chrono_models/vehicle/man/MAN_7t_SimpleMapPowertrain.h"
28
29 namespace chrono {
30 namespace vehicle {
31 namespace man {
32
33 const double rpm2rads = CH_C_PI / 30;
34 const double lbft2nm = 1.3558;
35
MAN_7t_SimpleMapPowertrain(const std::string & name)36 MAN_7t_SimpleMapPowertrain::MAN_7t_SimpleMapPowertrain(const std::string& name) : ChSimpleMapPowertrain(name) {}
37
GetMaxEngineSpeed()38 double MAN_7t_SimpleMapPowertrain::GetMaxEngineSpeed() {
39 return 2300 * rpm2rads;
40 }
41
SetEngineTorqueMaps(ChFunction_Recorder & map0,ChFunction_Recorder & mapF)42 void MAN_7t_SimpleMapPowertrain::SetEngineTorqueMaps(ChFunction_Recorder& map0, ChFunction_Recorder& mapF) {
43 map0.AddPoint(-100 * rpm2rads, 0.000 * lbft2nm);
44 map0.AddPoint(0 * rpm2rads, 0.0 * lbft2nm);
45 map0.AddPoint(100 * rpm2rads, 0.0 * lbft2nm);
46 map0.AddPoint(400 * rpm2rads, -20.0 * lbft2nm);
47 map0.AddPoint(600 * rpm2rads, -20.0 * lbft2nm);
48 map0.AddPoint(800 * rpm2rads, -20.0 * lbft2nm);
49 map0.AddPoint(1000 * rpm2rads, -20.0 * lbft2nm);
50 map0.AddPoint(1200 * rpm2rads, -20.0 * lbft2nm);
51 map0.AddPoint(1400 * rpm2rads, -20.0 * lbft2nm);
52 map0.AddPoint(1600 * rpm2rads, -20.0 * lbft2nm);
53 map0.AddPoint(1800 * rpm2rads, -30.0 * lbft2nm);
54 map0.AddPoint(2000 * rpm2rads, -30.0 * lbft2nm);
55 map0.AddPoint(2100 * rpm2rads, -40.0 * lbft2nm);
56 map0.AddPoint(2300 * rpm2rads, -100.0 * lbft2nm);
57 map0.AddPoint(2500 * rpm2rads, -150.0 * lbft2nm);
58
59 mapF.AddPoint(-100.0 * rpm2rads, 0.00);
60 mapF.AddPoint(0.0 * rpm2rads, 300.00);
61 mapF.AddPoint(400.0 * rpm2rads, 500.00);
62 mapF.AddPoint(800.0 * rpm2rads, 700.00);
63 mapF.AddPoint(981.97 * rpm2rads, 991.67);
64 mapF.AddPoint(1030.65 * rpm2rads, 1184.72);
65 mapF.AddPoint(1073.93 * rpm2rads, 1305.56);
66 mapF.AddPoint(1124.41 * rpm2rads, 1383.33);
67 mapF.AddPoint(1198.34 * rpm2rads, 1426.39);
68 mapF.AddPoint(1268.65 * rpm2rads, 1440.28);
69 mapF.AddPoint(1355.2 * rpm2rads, 1445.83);
70 mapF.AddPoint(1459.78 * rpm2rads, 1445.83);
71 mapF.AddPoint(1564.36 * rpm2rads, 1447.22);
72 mapF.AddPoint(1676.14 * rpm2rads, 1447.22);
73 mapF.AddPoint(1777.12 * rpm2rads, 1437.5);
74 mapF.AddPoint(1910.54 * rpm2rads, 1401.39);
75 mapF.AddPoint(1980.86 * rpm2rads, 1370.83);
76 mapF.AddPoint(2065.6 * rpm2rads, 1318.06);
77 mapF.AddPoint(2134.12 * rpm2rads, 1261.11);
78 mapF.AddPoint(2186.41 * rpm2rads, 1208.33);
79 mapF.AddPoint(2231.48 * rpm2rads, 1163.89);
80 mapF.AddPoint(2350.00 * rpm2rads, -100.0);
81 }
82
SetGearRatios(std::vector<double> & fwd,double & rev)83 void MAN_7t_SimpleMapPowertrain::SetGearRatios(std::vector<double>& fwd, double& rev) {
84 rev = -0.089525515;
85
86 fwd.push_back(0.077);
87 fwd.push_back(0.118);
88 fwd.push_back(0.162);
89 fwd.push_back(0.221);
90 fwd.push_back(0.283);
91 fwd.push_back(0.416);
92 fwd.push_back(0.573);
93 fwd.push_back(0.780);
94 fwd.push_back(1.0);
95 }
96
SetShiftPoints(std::vector<std::pair<double,double>> & shift_bands)97 void MAN_7t_SimpleMapPowertrain::SetShiftPoints(std::vector<std::pair<double, double>>& shift_bands) {
98 shift_bands.push_back(std::pair<double, double>(1000 * rpm2rads, 2200 * rpm2rads));
99 shift_bands.push_back(std::pair<double, double>(1000 * rpm2rads, 2200 * rpm2rads));
100 shift_bands.push_back(std::pair<double, double>(1000 * rpm2rads, 2200 * rpm2rads));
101 shift_bands.push_back(std::pair<double, double>(1000 * rpm2rads, 2200 * rpm2rads));
102 shift_bands.push_back(std::pair<double, double>(1000 * rpm2rads, 2200 * rpm2rads));
103 shift_bands.push_back(std::pair<double, double>(1000 * rpm2rads, 2200 * rpm2rads));
104 shift_bands.push_back(std::pair<double, double>(1000 * rpm2rads, 2200 * rpm2rads));
105 shift_bands.push_back(std::pair<double, double>(1000 * rpm2rads, 2200 * rpm2rads));
106 shift_bands.push_back(std::pair<double, double>(1000 * rpm2rads, 2200 * rpm2rads));
107 }
108
109 } // namespace man
110 } // end namespace vehicle
111 } // end namespace chrono
112