Evolventenkonstruktion

Die Evolventenverzahnung wird bei Zahnrädern angewandt. Die Berechnungsgrundlagen wurden von den folgenden Homepagen extrahiert:
https://www.tec-science.com/de/getriebe-technik/evolventenverzahnung/evolventen-zahnrad-geometrie/#:~:text=Konstruktion%20einer%20Evolvente,-Im%20Falle%20der&text=Eine%20Kreisevolvente%20wird%20durch%20Abrollen,dann%20die%20Grundform%20eines%20Zahnes.

https://www.tec-science.com/de/getriebe-technik/evolventenverzahnung/berechnung-von-zahnrader/

Grundform der Evolventenfuktion

Die Länge der Strecke \(-TP\) ist mit dem Krümmungsradius \(ρ\) der Evolvente im Punkt \(P\) identisch. Zudem entspricht die Strecke \(-TP\) der bogenförmigen Abrollstrecke auf dem Grundkreis \(⌢ST\), da die Rollgerade bei der Evolventenkonstruktion gleitfrei auf dem Grundkreis abrollt:

Definition der Involut-Funktion

Der Winkel \(α\) beschreibt zwar eindeutig einen Punkt auf der Evolvente, für viele geometrische Berechnungen ist jedoch der in der Abbildung eingezeichnete Winkel \(φ\) von größerer direkter Bedeutung. Salopp formuliert, beschreibt der Winkel \(φ\) die „Dicke“ des evolventenförmigen Zahnes (siehe Abbildung oben).

Mithilfe von Gleichung (1) lässt sich zwischen den Winkeln \(φ\) und \(α\) folgender Zusammenhang herstellen:
2)
3) \(r_b\cdot(φ+\alpha)=r_b\cdot tan(\alpha)\)
4) \(φ = tan(\alpha)-\alpha\)
5) \(involut(α)=tan(α)−α=φ\)

Alle Winkel sind für die Involut-Funktion sind grundsätzlich im Bogenmaß anzugeben!

Die Evolventenfunktion \(inv(α)\) ordnet sozusagen zu einem beliebigen Evolventenpunkt \(P\) (beschrieben durch den Winkel \(α\) den sich zum Startpunkt der Evolvente ergebenden Winkel \(φ\) zu. Auf diese Weise können viele geometrische Zahnradgrößen bestimmt werden.

involut <- function(alpha) tan(alpha)-alpha
df <- tibble(alpha =  seq(0,pi/8,0.001))
df <- df%>%
  mutate(phi = involut(alpha),
         rho = alpha+phi)

Plot im Poolarkoordinatensystem

Eingriffswinkel

Dass der Evolventenwinkel wie auch der Eingriffswinkel mit demselben Symbol \(α\) bezeichnet werden, ist an dieser Stelle kein Zufall! Der Evolventenwinkel \(α\) in der Evolventenfunktion lässt sich nämlich als Betriebseingriffswinkel \(α_b\) interpretieren, wenn sich der betrachtete Punkt \(P\) auf dem Wälzkreis des Zahnrades befindet und somit den Wälzpunkt \(C\) bildet \((P=C)!\)
Da die Eingriffslinie letztlich durch die Tangente an den Grundkreis gebildet wird, welche gleichzeitig durch den Wälzpunkt \(C\) verläuft, ist die Strecke \(-TP\) somit ein Teil der Eingriffslinie. Der Evolventenwinkel \(α\) entspricht damit dem Betriebseingriffswinkel \(α_b\). Befindet sich der Punkt P auf dem Teilkreis des Zahnrades, dann erhält man als Winkel den Normaleingriffswinkel \(α_0\)!

Berechnungsbeispiel für Nockenrad EVO Feeder

Die grundsätzliche Beziehung zur Konstruktion einer Evolvente ist:

Also, die Länge des Bogens ist gleich der Strecke zwischen Tangentenpunkt \(T\) und Punkt \(P\) auf dem \(Grundkreis\).
Die Strecke zwischen den Punkten \(GP\) kann über den Winkel \(φ\) definiert werden wenn \(r_b = 1\) angenommen wird.

Mit der Beziehung \(φ = tan(\alpha)-\alpha\) oder eben \(r_b\cdot(φ+\alpha)=r_b\cdot tan(\alpha)\) kann für \(r_b = 1\) eingesetzt werden. Das Verhältnis der Strecke \(PT\) zum Radius \(r_b = 1\) (\(\frac{Grundkreis}{2}\)) kann genutzt werden. Im Einheitskreis entspricht die Gegenkathete zum Winkel \(\alpha\) dem Cosinus. Es ist also möglich für einen beliebigen Winkel \(\alpha\) die Strecke \(TP\) zu berechnen.

https://www.desmos.com/calculator/hj1lnkzwuj

Test

Evolvente des Einheitskreises im kartesischen Koordinatensystem

Evolventenfunktion fuer x Koordinate

fx <- function(t){
  return(cos(t)+t*sin(t))
}

Evolventenfunktion fuer y Koordinate

fy <- function(t){
  return (sin(t)-t*cos(t))
}

Parameter t der Evolventenfunktion

Beruehrungspunkt der Zahnräder \(C\)

#Parameter fuer start und stop 
Start <- 0
Stop <- 1

#Parameter t der Evolventenfunktion (Beruehrungspunkt der Zahnräder)
t <- seq(Start,Stop,by = 0.05)

Plot

df <- tibble(x = fx(t), y = fy(t))
df%>%
  ggplot(aes(x=x,y=y))+
  geom_point()+
  geom_line()+
  labs(title = "Evolvente Einheiskreis", subtitle = str_c("t = ",Start,"...",Stop,"\nx = cos(t)+t*sin(t), y = sin(t)-t*cos(t)"))

Evolvente für das Beispiel EVO Nockenrad

Die folgenden Parameter sind durch die Anwendung gegeben:

\(R_{Nockenrad} = 26\)[mm]
\(D_{Nocken} = 0.6\)[mm]
\(R_{Nocken-Höhe(Länge)} = 0.85\)[mm]

Skalierung der Berechnung am Einheitskreis

df <- df%>%
  mutate(x_Nockenbahn = x*R_Nockenrad,
         y_scale = y*R_Nockenrad, 
         y_Nockenbahn = y_scale-D_Nocken, 
         phi = atan(x_Nockenbahn/y_Nockenbahn))

Plot

Koordinaten Systemdrehung

rot <- 90/180*pi
Drehmatrix <- matrix(c(cos(rot),sin(rot),-sin(rot), cos(rot)), ncol = 2)
Evolvente <- matrix(c(x = df$x_Nockenbahn,y = df$y_Nockenbahn), ncol = 2)
Result <- matrix(rep(0,2*nrow(Evolvente)),ncol = 2)
for(i in 1:nrow(Result)){
  Result[i,] <- Drehmatrix%*%Evolvente[i,]
}
df$x_rot <- Result[,1]
df$y_rot <- Result[,2]

Nockenrad Hoehe (Laenge) suchen

#Genauikeit muss relative gross gewaehlt werden weil die Einheisvektoren noch gestreckt werden muessen
Genauigkeit <- 1e-7 #Achtung wenn die Genauigkeit 1e-07 uebertreffen muss wird das sehr langsam 

#Einsetzvektor
test <- seq(Start,Stop, Genauigkeit)
#Resultat 
Result <- round(fx(test), digits = abs(log10(Genauigkeit)))
#Vektor zum vergleichen (Skaklierung auf den Einheitskreis)
Vergleich <- rep((NockenHoehe/R_Nockenrad)+1, length(test))
#Zeiger auf die Loesung
pointer <- round(Vergleich, digits = abs(log10(Genauigkeit))) == round(Result, digits = abs(log10(Genauigkeit)))
#Loesung
t_NockenHoehe <- mean(test[pointer])

Berechung im Einheiskreis

t <- seq(Start,t_NockenHoehe,0.005)
df <- tibble(x = fx(t), y = fy(t))
df <- df%>%mutate(intercept = y-(t*x),           
            Schnittpunkt = (0-intercept)/t,
            Distanz_NockenTape = (Schnittpunkt-1)*sin(t)
           )
head(df)
## # A tibble: 6 x 5
##       x            y intercept Schnittpunkt Distanz_NockenTape
##   <dbl>        <dbl>     <dbl>        <dbl>              <dbl>
## 1  1    0              0             NaN        NaN           
## 2  1.00 0.0000000417  -0.00500         1.00       0.0000000208
## 3  1.00 0.000000333   -0.0100          1.00       0.000000167 
## 4  1.00 0.00000112    -0.0150          1.00       0.000000562 
## 5  1.00 0.00000267    -0.0200          1.00       0.00000133  
## 6  1.00 0.00000521    -0.0250          1.00       0.00000260

Daten plot des Einheitskeis

Skallieren auf realle Groessenverhaeltnisse

df_scaled <- df%>%
mutate(
    x = (R_Nockenrad*x),
    y = R_Nockenrad*y-D_Nocken,
    intercept = y-(t*x), 
    Schnittpunkt = (0-intercept)/t,
    Distanz_Nockenrad = (Schnittpunkt)*sin(t)
)

Drehung des Koordinantensystems (Darstellung)

rot <- (pi/2) #-t[length(t)]
Drehmatrix <- matrix(c(cos(rot),sin(rot),-sin(rot), cos(rot)), ncol = 2)
Evolvente <- matrix(c(x = df_scaled$x,y = df_scaled$y), ncol = 2)
Result <- matrix(rep(0,2*nrow(Evolvente)),ncol = 2)
for(i in 1:nrow(Result)){
  Result[i,] <- Drehmatrix%*%Evolvente[i,]
}
df_scaled$x_rot <- Result[,1]
df_scaled$y_rot <- Result[,2]

Spiegelung der Kontur

df_scaled_mirror <- df_scaled
df_scaled_mirror$x_rot <- -df_scaled$x_rot
df_Nocken <- bind_rows(df_scaled,df_scaled_mirror[order(nrow(df_scaled_mirror):1),])