From e73c9e2953cae41c7e944af9d0d8302b29424a0c Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 18 Oct 2022 23:05:57 -0700 Subject: [PATCH 1/2] [DMS] Implemented Output Calculations + Minor Fixes - Added in missing Supply Voltage input - Corrected input & output unit labels - Implemented equations from DMS website for outputs - Attempted to reconfigure "Math in Action" for new equations --- drive-motor-sizer/index.html | 126 +++++++++++++++++++++++++---------- drive-motor-sizer/main.js | 75 ++++++++++++++++----- 2 files changed, 149 insertions(+), 52 deletions(-) diff --git a/drive-motor-sizer/index.html b/drive-motor-sizer/index.html index bed6e7b..fa50268 100644 --- a/drive-motor-sizer/index.html +++ b/drive-motor-sizer/index.html @@ -27,9 +27,9 @@

Input



@@ -37,29 +37,29 @@

Input



- - - + + +

- - + + + +
+
+ + +

@@ -67,34 +67,92 @@

Input



- +

Output

-

Math in Action

- + + - + + - + + - + - -

Result

- +

Math in Action

+ +

Angular Velocity:

+ w = / +
+
+ +

Torque:

+ T = ((( + + 9.81 sin() ) * + ( * )) / + ) * + (100/) +
+
+ +

Total Power:

+ P = * +
+
+ +

Maximum Current:

+ I = ( * ) / +
+
+ +

Battery Pack:

+ C = * (/30) +
+
+ +

Results:

+ +

Angular Velocity:

+ + +
+
+ +

Torque:

+ + +
+
+ +

Total Power:

+ + +
+
+ +

Maximum current [A]:

+ + +
+
+ +

Battery Pack [Ah]:

+ + +


diff --git a/drive-motor-sizer/main.js b/drive-motor-sizer/main.js index 9c85ec6..be08d88 100644 --- a/drive-motor-sizer/main.js +++ b/drive-motor-sizer/main.js @@ -2,20 +2,19 @@ var var_total_mass = 0; var var_num_wheels = 0; var var_wheel_radius = 0; var var_linear_velocity = 0; -var var_acceleration = 0; var var_maximum_incline = 0; +var var_supply_voltage = 0; +var var_acceleration = 0; var var_operating_time = 0; var var_efficiency = 0; -// replace with actual outputs later -var sum = 0; - // initializing variables with document elements const input_total_mass = document.getElementById("total_mass"); const input_num_wheels = document.getElementById("num_wheels"); const input_wheel_radius = document.getElementById("wheel_rad"); const input_linear_velocity = document.getElementById("lin_velocity"); const input_acceleration = document.getElementById("acceleration"); +const input_supply_voltage = document.getElementById("supply_voltage"); const input_maximum_incline = document.getElementById("max_incline"); const input_operating_time = document.getElementById("op_time"); const input_efficiency = document.getElementById("efficiency"); @@ -25,26 +24,54 @@ const display_total_mass = document.getElementById("display_total_mass"); const display_num_wheels = document.getElementById("display_num_wheels"); const display_wheel_radius = document.getElementById("display_wheel_rad"); const display_linear_velocity = document.getElementById("display_lin_velocity"); +const display_supply_voltage = document.getElementById("display_supply_voltage"); const display_acceleration = document.getElementById("display_acceleration"); const display_maximum_incline = document.getElementById("display_max_incline"); const display_operating_time = document.getElementById("display_op_time"); const display_efficiency = document.getElementById("display_efficiency"); +const display_torque = document.getElementById("display_torque"); +const display_angular_velocity = document.getElementById("display_angular_velocity"); +const display_max_current = document.getElementById("display_max_current"); + +// outputs +const output_angular_velocity = document.getElementById("angular_velocity"); +const output_torque = document.getElementById("torque"); +const output_total_power = document.getElementById("Total_Power"); +const output_max_current = document.getElementById("Maximum_Current"); +const output_battery_pack = document.getElementById("Battery_Pack"); -const result = document.getElementById("result"); function Calculate(e) { - sum = - parseFloat(input_total_mass.value) + - parseFloat(input_num_wheels.value) + - parseFloat(input_wheel_radius.value) + - parseFloat(input_linear_velocity.value) + - parseFloat(input_acceleration.value) + - parseFloat(input_maximum_incline.value) + - parseFloat(input_operating_time.value) + - parseFloat(input_efficiency.value); - - result.textContent = sum; - return sum; + // Angular Velocity calculation + calc_angular_velocity= + parseFloat(input_linear_velocity.value) / parseFloat(input_wheel_radius.value) + output_angular_velocity.textContent = calc_angular_velocity; + display_angular_velocity.textContent = calc_angular_velocity; + + // Torque calculation + convert_degrees = (Math.PI/180) * parseFloat(input_maximum_incline.value); + torque_numerator = (parseFloat ( input_acceleration.value ) + 9.81 * Math.sin( convert_degrees ) ) * + ( parseFloat( input_total_mass.value ) * parseFloat( input_wheel_radius.value ) * 100 ); + + torque_denominator = parseFloat(input_num_wheels.value) * parseFloat(input_efficiency.value); + + calc_torque = (torque_numerator / torque_denominator); + output_torque.textContent = calc_torque; + display_torque.textContent = calc_torque; + + // Total Power calculation + calc_Power = calc_torque * calc_angular_velocity; + output_total_power.textContent = calc_Power; + + // Max current calculation + calc_max_current = calc_Power / parseFloat(input_supply_voltage.value) + output_max_current.textContent = calc_max_current; + display_max_current.textContent = calc_max_current; + + // Battery Pack calculation + calc_Battery_pack = (calc_max_current * parseFloat(input_operating_time.value))/30; + output_battery_pack.textContent = calc_Battery_pack; + } // display @@ -84,6 +111,12 @@ function updateInput_maximum_incline(e) { Calculate(); } +function updateInput_supply_voltage(e){ + var_supply_voltage = parseFloat(e.target.value); + display_supply_voltage.textContent = e.target.value; + Calculate(); +} + function updateInput_operating_time(e) { var_operating_time = parseFloat(e.target.value); display_op_time.textContent = e.target.value; @@ -109,6 +142,9 @@ input_wheel_radius.addEventListener("click", updateInput_wheel_radius); input_linear_velocity.addEventListener("change", updateInput_linear_velocity); input_linear_velocity.addEventListener("click", updateInput_linear_velocity); +input_supply_voltage.addEventListener('change',updateInput_supply_voltage); +input_supply_voltage.addEventListener('click',updateInput_supply_voltage); + input_acceleration.addEventListener("change", updateInput_acceleration); input_acceleration.addEventListener("click", updateInput_acceleration); @@ -121,7 +157,7 @@ input_operating_time.addEventListener("click", updateInput_operating_time); input_efficiency.addEventListener("change", updateInput_efficiency); input_efficiency.addEventListener("click", updateInput_efficiency); -//URL parameters +// URL parameters const queryString = window.location.search; const urlParams = URLSearchParams(queryString); @@ -129,6 +165,7 @@ const url_total_mass = urlParams.get("total-mass"); const url_num_wheels = urlParams.get("num-wheels"); const url_wheel_radius = urlParams.get("wheel-radius"); const url_linear_velocity = urlParams.get("linear-velocity"); +const url_supply_voltage = urlParams.get("supply_voltage"); const url_acceleration = urlParams.get("acceleration"); const url_maximum_incline = urlParams.get("maximum-incline"); const url_operating_time = urlParams.get("operating-time"); @@ -139,6 +176,7 @@ window.addEventListener("load", (event) => { input_num_wheels = url_num_wheels; input_wheel_radius = url_wheel_radius; input_linear_velocity = url_linear_velocity; + input_supply_voltage = url_supply_voltage; input_acceleration = url_acceleration; input_maximum_incline = url_maximum_incline; input_operating_time = url_operating_time; @@ -148,6 +186,7 @@ window.addEventListener("load", (event) => { display_num_wheels.textContent = url_num_wheels; display_wheel_radius.textContent = url_wheel_radius; display_linear_velocity.textContent = url_linear_velocity; + display_supply_voltage.textContent = url_supply_voltage; display_acceleration.textContent = url_acceleration; display_maximum_incline.textContent = url_maximum_incline; display_operating_time.textContent = url_operating_time; From 9eb09551ae5d4c836a93021e0405993eec6522ee Mon Sep 17 00:00:00 2001 From: hannah Date: Sun, 4 Jun 2023 17:26:05 -0700 Subject: [PATCH 2/2] + Implemented Most Output Calculations +Motor Torque Graph --- electric-motor-torque-curve/index.html | 88 +++++++-- electric-motor-torque-curve/main.css | 3 +- electric-motor-torque-curve/main.js | 256 ++++++++++++++++++------- 3 files changed, 259 insertions(+), 88 deletions(-) diff --git a/electric-motor-torque-curve/index.html b/electric-motor-torque-curve/index.html index 47631af..618f313 100644 --- a/electric-motor-torque-curve/index.html +++ b/electric-motor-torque-curve/index.html @@ -3,9 +3,12 @@ + + +

Input

@@ -63,26 +66,85 @@

Input



-

- ---------------------------------------- + + +
+
-

Output

-

+ +
+ +

-

Math in Action

- + + + + + + + + + - - -

Result

+ --> -
-
-
+

Output

+

Math in Action

+ +

Max Torque:

+ + +
+
+ +

Max Current:

+ +
+
+ +

Max Power:

+ + +
+
+ +

Motor Torque graph

+
+ +
+
+ + +

Results:

+ +

Max Torque:

+ +
+
+ +

Max Current:

+ +
+
+ +

Max Power:

+ +
+
+ +

Limited Torque

+ +

RPM @ Limited Torque:

+ +
+
+ +

Power @ Limited Torque:

+ +
+
+ +

Limited Electrical Power [W]:

+ +
+
+
@@ -92,4 +154,4 @@

Result

- + \ No newline at end of file diff --git a/electric-motor-torque-curve/main.css b/electric-motor-torque-curve/main.css index 3b842cd..dcb52ce 100644 --- a/electric-motor-torque-curve/main.css +++ b/electric-motor-torque-curve/main.css @@ -12,5 +12,4 @@ h1 { font-family: "Lucida Console", "Courier New", monospace; } -p { -} + diff --git a/electric-motor-torque-curve/main.js b/electric-motor-torque-curve/main.js index 4a9d2fa..19fd6b8 100644 --- a/electric-motor-torque-curve/main.js +++ b/electric-motor-torque-curve/main.js @@ -18,73 +18,169 @@ ///////////////////////////////////////////////////////////////////////// var var_voltage_rated = 0; -var secondinput = 0; +var var_voltage_supplied = 0; var var_no_load_torque = 0; var var_rated_torque = 0; var var_no_load_speed = 0; var var_rated_speed = 0; var var_no_load_current = 0; var var_rated_current = 0; +var var_target_torque = 0; var mathstuff = 0; - ///////////////////////////////////////////////////////////////////////// // 2. Tie const values to document elements (text area and then display) ///////////////////////////////////////////////////////////////////////// +function execute() { + const input_voltage_rated = parseFloat(document.getElementById("voltage_rated").value); + const input_voltage_supplied = parseFloat(document.getElementById("voltage_supplied").value); + const input_no_load_torque = parseFloat(document.getElementById("no_load_torque").value); + const input_rated_torque = parseFloat(document.getElementById("rated_torque").value); + const input_no_load_speed = parseFloat(document.getElementById("no_load_speed").value); + const input_rated_speed = parseFloat(document.getElementById("rated_speed").value); + const input_no_load_current = parseFloat(document.getElementById("no_load_current").value); + const input_rated_current = parseFloat(document.getElementById("rated_current").value); + const input_target_torque = parseFloat(document.getElementById("target_torque").value); + + // Optional, just if we want to show math in action + const display_voltage_rated = document.getElementById("display_voltage_rated"); + const display_voltage_supplied = document.getElementById("display_voltage_supplied"); + const display_no_load_torque = document.getElementById("display_no_load_torque"); + const display_rated_torque = document.getElementById("display_rated_torque"); + const display_no_load_speed = document.getElementById("display_no_load_speed"); + const display_rated_speed = document.getElementById("display_rated_speed"); + const display_no_load_current = document.getElementById("display_no_load_current"); + const display_target_torque = document.getElementById("display_target_torque"); + const display_rated_current = document.getElementById("display_rated_current"); + const display_max_torque = document.getElementById("display_max_torque"); + const display_max_current = document.getElementById("display_max_current"); + const display_max_power = document.getElementById("display_max_power"); + const display_limited_RPM = document.getElementById("display_limited_RPM"); + const display_limtied_Power = document.getElementById("display_limited_Power"); + const display_limited_electrical = document.getElementById("display_limited_electrical"); + + + // outputs + const output_max_torque = document.getElementById("max_torque"); + const output_max_current = document.getElementById("max_current"); + const output_max_power = document.getElementById("max_power"); + const output_limited_RPM = document.getElementById("limited_RPM"); + const output_limited_Power = document.getElementById("limited_Power"); + const output_limited_electrical = document.getElementById("limited_electrical"); + + ///////////////////////////////////////////////////////////////////////// + // Motor Torque Graph + ///////////////////////////////////////////////////////////////////////// + const torqueX = []; + const RPMY = []; + const CurrentY = []; + const Limited_CurrentY = []; + const Limited_RPMY = []; + + const vratio = input_voltage_supplied / input_voltage_rated; + const adj_rpm_min = vratio * input_rated_speed; + const adj_rpm_max = vratio * input_no_load_speed; + const rpmTorqueSlope = (adj_rpm_min - adj_rpm_max) / (input_rated_torque - input_no_load_torque); + const stallTorque = -adj_rpm_max / rpmTorqueSlope; + const torqueStep = (stallTorque) / 30; + + const adj_Current_min = Math.pow(vratio, -1) * input_no_load_current; + const adj_Current_max = Math.pow(vratio, -1) * input_rated_current; + const rpmCurrentSlope = (adj_rpm_min - adj_rpm_max) / (adj_Current_min - adj_Current_max); + const stallCurrent = (adj_rpm_max / rpmCurrentSlope) - adj_Current_min; + const currentStep = (stallCurrent) / 30; + + for (let i = 0; i <= 30; i++) { + torqueX.push(i * torqueStep); + RPMY.push(torqueX[i] * rpmTorqueSlope + adj_rpm_max); + CurrentY.push(i * currentStep + adj_Current_min) + if (torqueX[i] < input_target_torque) { + Limited_RPMY.push(RPMY[i]); + Limited_CurrentY.push(CurrentY[i]); + } else { + Limited_RPMY.push(RPMY[i] * (input_target_torque / torqueX[i])); + Limited_CurrentY.push(CurrentY[i] * (input_target_torque / torqueX[i])); + } + + } + + GRAPH = document.getElementById('Motor_Torque'); + data = [ + { + type: 'scatter', + x: torqueX, + y: RPMY, + marker: { + color: 'rgb(25,118,210)' + }, + name: 'RPM' + + + }, + + { + type: 'scatter', + x: torqueX, + y: CurrentY, + marker: { + color: 'rgb(255,0,0)' + }, + name: 'Current' + + }, + + { + type: 'scatter', + x: torqueX, + y: Limited_CurrentY, + marker: { + color: 'rgb(29,131,72)' + }, + name: 'Limited Current' + + }, + + { + type: 'scatter', + x: torqueX, + y: Limited_RPMY, + marker: { + color: 'rgb(255,184,28)' + }, + name: 'Limited RPM' + } + + + ]; + + layout = { + title: 'RPM / Current vs. Torque', + xaxis: { + title: 'Torque' + }, + yaxis: { + title: 'RPM/Current' + }, + margin: { + autoexpand: true + } + + + + } + + Plotly.newPlot(GRAPH, data, layout); + + ///////////////////////////////////////////////////////////////////////// + // Output calculations + ///////////////////////////////////////////////////////////////////////// + + output_max_torque.textContent = Math.round(torqueX[torqueX.length - 1] * 100) / 100; + output_max_current.textContent = Math.round(CurrentY[CurrentY.length - 1] * 100) / 100; + output_max_power.textContent = (Math.pow(vratio * input_no_load_speed, 2) * (input_rated_torque - input_no_load_torque)) / (4 * vratio * (input_no_load_speed - input_rated_speed)); + output_limited_RPM.textContent = rpmTorqueSlope * input_target_torque + adj_rpm_max; + output_limited_Power.textContent = input_voltage_supplied * rpmCurrentSlope * input_target_torque + adj_Current_min; -const input_voltage_rated = document.getElementById("voltage_rated"); -const input_voltage_supplied = document.getElementById("voltage_supplied"); -const input_no_load_torque = document.getElementById("no_load_torque"); -const input_rated_torque = document.getElementById("rated_torque"); -const input_no_load_speed = document.getElementById("no_load_speed"); -const input_rated_speed = document.getElementById("rated_speed"); -const input_no_load_current = document.getElementById("no_load_current"); -const input_rated_current = document.getElementById("rated_current"); - -// Optional, just if we want to show math in action -const display_voltage_rated = document.getElementById("display_voltage_rated"); -const display_voltage_supplied = document.getElementById("display_voltage_supplied"); -const display_no_load_torque = document.getElementById("display_no_load_torque"); -const display_rated_torque = document.getElementById("display_rated_torque"); -const display_no_load_speed = document.getElementById("display_no_load_speed"); -const display_rated_speed = document.getElementById("display_rated_speed"); -const display_no_load_current = document.getElementById("display_no_load_current"); -const display_rated_current = document.getElementById("display_rated_current"); - -// Display the result -const result = document.getElementById("result"); - -///////////////////////////////////////////////////////////////////////// -// 3. Actual math equation -///////////////////////////////////////////////////////////////////////// - -function Calculate(evt) { - //// console.log is how we check values. - //// input_* is referring to the textbox, in this case we're grabbing values - //// from those textboxes on the html page - console.log("CALCULATE CALLED "); - console.log("voltage_rated--->", input_voltage_rated); - console.log("voltage_supplied--->", input_voltage_supplied); - console.log("noloadtorque -----> ", input_no_load_torque); - console.log("loadspeed -----> ", input_no_load_speed); - console.log("ratedspeed -----> ", input_rated_speed); - console.log("noloadcurrent -----> ", input_no_load_current); - console.log("ratedcurrent -----> ", input_rated_current); - console.log("math stuff is", mathstuff); - - mathstuff = - parseFloat(input_voltage_rated.value) + - parseFloat(input_voltage_supplied.value) + - parseFloat(input_no_load_torque.value) + - parseFloat(input_rated_torque.value) + - parseFloat(input_no_load_speed.value) + - parseFloat(input_rated_speed.value) + - parseFloat(input_no_load_current.value) + - parseFloat(input_rated_current.value); - - console.log("math calc is", mathstuff); - result.textContent = mathstuff; - return mathstuff; } ///////////////////////////////////////////////////////////////////////// @@ -98,7 +194,7 @@ function updateInput_voltage_rated(e) { } function updateInput_voltage_supplied(e) { - var voltage_supplied = parseFloat(e.target.value); + var_voltage_supplied = parseFloat(e.target.value); display_voltage_supplied.textContent = e.target.value; Calculate(); } @@ -145,6 +241,13 @@ function updateInput_rated_current(e) { Calculate(); } +function updateInput_target_torque(e) { + var_target_torque = parseFloat(e.target.value); + display_target_torque.textContent = e.target.value; + // console.log("display no load torque ", display_rated_current.textContent); + Calculate(); +} + ///////////////////////////////////////////////////////////////////////// // 5. Event Listeners that detect changes fromuser input ///////////////////////////////////////////////////////////////////////// @@ -173,6 +276,9 @@ input_no_load_current.addEventListener("click", updateInput_no_load_current); input_rated_current.addEventListener("change", updateInput_rated_current); input_rated_current.addEventListener("click", updateInput_rated_current); +input_target_torque.addEventListener("change", updateInput_target_torque); +input_target_torque.addEventListener("click", updateInput_target_torque); + ///////////////////////////////////////////////////////////////////////// // 6. URL Parameters ///////////////////////////////////////////////////////////////////////// @@ -183,30 +289,32 @@ const urlParams = new URLSearchParams(queryString); console.log("location is", location); console.log(urlParams); -const url_voltage_rated = urlParams.get("voltage-rated"); +const url_voltage_rated = urlParams.get("voltage_rated"); console.log(url_voltage_rated); -const url_voltage_supplied = urlParams.get("voltage-supplied"); +const url_voltage_supplied = urlParams.get("voltage_supplied"); console.log(url_voltage_supplied); -const url_no_load_torque = urlParams.get("no-load-torque"); +const url_no_load_torque = urlParams.get("no_load_torque"); console.log(url_no_load_torque); -const url_rated_torque = urlParams.get("rated-torque"); +const url_rated_torque = urlParams.get("rated_torque"); console.log(url_rated_torque); -const url_no_load_speed = urlParams.get("no-load-speed"); +const url_no_load_speed = urlParams.get("no_load_speed"); console.log(url_no_load_speed); -const url_rated_speed = urlParams.get("rated-speed"); +const url_rated_speed = urlParams.get("rated_speed"); console.log(url_rated_speed); -const url_no_load_current = urlParams.get("no-load-current"); +const url_no_load_current = urlParams.get("no_load_current"); console.log(url_no_load_current); -const url_rated_current = urlParams.get("rated-current"); +const url_rated_current = urlParams.get("rated_current"); console.log(url_rated_current); +const url_target_torque = urlParams.get("target_torque"); + ///////////////////////////////////////////////////////////////////////// // 7. Load from URL ///////////////////////////////////////////////////////////////////////// @@ -214,14 +322,15 @@ console.log(url_rated_current); window.addEventListener("load", (event) => { console.log("preloading?", input_voltage_rated); // load from url - input_voltage_rated.value = url_voltage_rated; - input_voltage_supplied.value = url_voltage_supplied; - input_no_load_torque.value = url_no_load_torque; - input_rated_torque.value = url_rated_torque; - input_no_load_speed.value = url_no_load_speed; - input_rated_speed.value = url_rated_speed; - input_no_load_current.value = url_no_load_current; - input_rated_current.value = url_rated_current; + input_voltage_rated = url_voltage_rated; + input_voltage_supplied = url_voltage_supplied; + input_no_load_torque = url_no_load_torque; + input_rated_torque = url_rated_torque; + input_no_load_speed = url_no_load_speed; + input_rated_speed = url_rated_speed; + input_no_load_current = url_no_load_current; + input_rated_current = url_rated_current; + input_target_torque = url_target_torque; display_voltage_rated.textContent = url_voltage_rated; display_voltage_supplied.textContent = url_voltage_supplied; @@ -231,6 +340,7 @@ window.addEventListener("load", (event) => { display_rated_speed.textContent = url_rated_speed; display_no_load_current.textContent = url_no_load_current; display_rated_current.textContent = url_rated_current; + display_target_torque.textContent = url_target_torque; - Calculate(); + execute(); });