{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[](https://drivetrainhub.com)\n", "\n", "
Spur gear pair modeled in Gears App
" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide_cell" ] }, "source": [ "Notebook imports and settings" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [ "hide_cell" ] }, "outputs": [], "source": [ "import ipywidgets as widgets\n", "from IPython import display\n", "from IPython.core.display import HTML\n", "import pandas as pd\n", "from pprint import pprint\n", "import math" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Involute function, pressure angle, and tooth thickness functions." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def inv(a):\n", " return math.tan(a) - a\n", "\n", "def alpha_at_given_d(d,d_b):\n", " return math.acos(d_b/d)\n", "\n", "def thickness_at_given_d(d,d_p,d_b,alpha,m,x):\n", " S_p = math.pi/2*m + 2*m*x*math.tan(alpha)\n", " alpha_d = alpha_at_given_d(d,d_b)\n", " S = d*(S_p/d_p+inv(alpha)-inv(alpha_d))\n", " return S" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Definitions\n", "The table below shows the definitions of basic gear geometry paramaters, and equations needed to calculate them.\n", "\n", "Parameter | Expression | Units | \n", " \n", "
Involute function | $\\rm{inv}\\left({\\theta}\\right) = \\tan\\theta - \\theta $ | rad | \n", "
Number of gear teeth | $z$ | None | \n", "
Normal module | $m$ | mm | \n", "
Generating pressure angle | $\\alpha$ | deg | \n", "
Profile shift | $x$ | $m$ | \n", "
Addendum modification | $y$ | $m$ | \n", "
Pitch diameter | $d_p = mz$ | mm | \n", "
Base diameter | $d_b = d_p \\cos \\alpha$ | mm | \n", "
Tip diameter | $d_t= d_p + 2m\\left(1+x-y\\right)$ | mm | \n", "
Root diameter | $d_r= d_p + 2m\\left(-1.25+x\\right)$ | mm | \n", "
Base pitch | $B_p= m\\pi\\cos\\alpha$ | mm | \n", "
Parameter | Expression | Units | \n", " \n", "
Standard center distance | $a_0 = m\\frac{z_1 + z_2}{2}$ | mm | \n", "
Operating center distance | $a$ | mm | \n", "
Working pressure angle | $\\alpha_w = \\cos^{-1}\\left( \\frac{a_0}{a} \\cos\\alpha \\right) $ | mm | \n", "
Working pitch diameter | $d_w = \\frac{d_b}{\\cos\\alpha_w}$ | mm | \n", "
Contact ratio | $R = \\frac{\\frac{\\sqrt{d^2_{t,1} -d^2_{r,1}} + \\sqrt{d^2_{t,2} -d^2_{r,2}}}{4} -a\\sin\\alpha_w} {B_p}$ | None | \n", "
Parameter | Expression | Units | \n", " \n", "
Circular tooth thickness at pitch diameter | $S_p = \\frac{m}{2}\\pi + 2mx\\tan\\alpha$ | mm | \n", "
Pressure angle at a given diameter, $d$ | $\\alpha(d) = \\cos^{-1}\\left(\\frac{d_b}{d} \\right)$ | mm | \n", "
Circular tooth thickness at a given diameter, $d$ | $S(d) = d\\left( \\frac{S_p}{d_p} + \\rm{inv}\\alpha - \\rm{inv}\\alpha_d \\right)$ | mm | \n", "
Circular backlash | $B_c = \\frac{B_p}{\\cos\\alpha_w} - S\\left(d_{w,1}\\right) - S\\left(d_{w,2}\\right)$ | mm | \n", "
Linear backlash | $B_l = B_c \\cos\\alpha_w$ | mm | \n", "
Pinion tip to gear root clearance | $c_1 =a - a_0 - m\\left(x_1+x_2 - y_1 \\right)$ | mm | \n", "
Gear tip to pinion root clearance | $c_2 =a - a_0 - m\\left(x_1+x_2 - y_2 \\right)$ | mm | \n", "
Negative (left) and positive (right) profile shifts in Gears App
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Undercut\n", "Involute profile is not defined below the base circe. Undercut occurs when tool tip corner does not cut the transition point between the root fillet and the involute profile. Undercut which increases stress concentration. Undercut is generally to be avoided or reduced if possible. Gears with low number of teeth are more prone to undercut. \n", "\n", "The minimum number of gear teeth without undercut is given by,\n", "\n", "$$ z_{min} = \\frac{2}{\\sin^2\\alpha}$$\n", "\n", "where $\\alpha$ is the pressure angle of the hob. Given the number of teeth, the minimum profile shift required to avoid undercut is given by,\n", "\n", "$$x=\\frac{z_{min} - z}{z_{min}}$$\n", "\n", "Spur gear undercut in Gears App
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Addendum Modification\n", "To avoid peaking and/or tip-to-root interference, tooth addendum is reduced. No actual tooth are cut off after the gears have been made, but the blank diameter itself is reduced before manufacturing. \n", "\n", "### Peaking\n", "Peaking occurs when the gear tooth tip thickness reaches zero due to positive profile shift. Generally it is recommended that the tip thickness is greater than $0.25 m$, where $m$ is the normal module.\n", "\n", "### Tip-to-Root Interference\n", "Tip-to-root interference occurs when the gear teeth are too long and interfere with the root of the mating gear due to positive profile shift. Generally, it is recommended that tip-to-root clearance is equal to or greater than $0.25m$. \n", "\n", "Near peaking spur gear in Gears App
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Design Process\n", "\n", "The geometric design process is explained by means of an example. Requirements are as follows:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [ "hide_input" ] }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "2c550272f0cd44a1a484fcc619a9bf4a", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(Output(),))" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "I = pd.Index([\"Module\",\"Working center distance\",\"Standard pressure angle\",\"Ratio\",\"Ratio tolerance\",\"Backlash\",\"Tip-To-Root Clearance\"],name=\"rows\")\n", "C = pd.Index([\"Common\",\"Units\"],name=\"columns\")\n", "df_requirements = pd.DataFrame(data=None,index=I,columns=C)\n", "df_requirements[\"Common\"][\"Module\"]=2.5\n", "df_requirements[\"Units\"][\"Module\"]=\"mm\"\n", "df_requirements[\"Common\"][\"Working center distance\"]=122\n", "df_requirements[\"Units\"][\"Working center distance\"]=\"mm\"\n", "df_requirements[\"Common\"][\"Standard pressure angle\"]=20\n", "df_requirements[\"Units\"][\"Standard pressure angle\"]=\"deg\"\n", "df_requirements[\"Common\"][\"Ratio\"]=1.063829787\n", "df_requirements[\"Units\"][\"Ratio\"]=\"\"\n", "df_requirements[\"Common\"][\"Ratio tolerance\"]=0.0001\n", "df_requirements[\"Units\"][\"Ratio tolerance\"]=\"\"\n", "df_requirements[\"Common\"][\"Backlash\"]=0.1\n", "df_requirements[\"Units\"][\"Backlash\"]=\"mm\"\n", "df_requirements[\"Common\"][\"Tip-To-Root Clearance\"]=0.25\n", "df_requirements[\"Units\"][\"Tip-To-Root Clearance\"]=\"module\"\n", "\n", "widget= widgets.Output()\n", "with widget:\n", " display.display(df_requirements)\n", "hbox = widgets.HBox([widget])\n", "hbox" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "alpha=df_requirements[\"Common\"][\"Standard pressure angle\"]/180*math.pi\n", "i_required = df_requirements[\"Common\"][\"Ratio\"]\n", "i_tol = df_requirements[\"Common\"][\"Ratio tolerance\"]\n", "m = df_requirements[\"Common\"][\"Module\"]\n", "a = df_requirements[\"Common\"][\"Working center distance\"]\n", "B_req = df_requirements[\"Common\"][\"Backlash\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Choosing Number of Teeth\n", "\n", "In this notebook, the aim of design is to minimize the size of the gears. To that end, the lowest number of teeth possible within limits should be chosen. For a first design iteration, the minimum acceptable number of teeth is chosen to avoid undercut without profile shift, given by $z_{min} = \\frac{2}{\\sin^2\\alpha}$. The number of teeth can be reduced by one or two in the following design iterations, if profile shift eliminates undercut.\n", "\n", "The selected number of teeth should also satisfy the required gear ratio within a given tolerance. Since gear ratio is defined by $i=\\frac{z_2}{z_1}$, rearranging gives $z_2=i z_1$. Number of teeth on the wheel is found using the minimum number of teeth for the pinion. If the actual gear ratio is not within tolerance, the number of teeth on the pinion is incremented, and the process is repeated until the actual gear ratio is within tolerance. The following code automates this process. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "18\n" ] }, { "data": { "text/html": [ "