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/
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:
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)
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\)!
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
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))
}
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)
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)"))
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]
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))
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]
#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])
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
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)
)
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]
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),])