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