Changing Spindle Bearings on a Taig CNC Mill

The spindle on my Taig CNC mill was getting uncomfortably hot after a few minutes of milling; especially at higher RPMs. It ran smoothly and without any play, but with noticeable friction, so I decided to try to change the ball bearings.

Taig CNC mill

Ball Bearing Selection

The bearings have the standard dimensions 17x40x12 mm (inner diameter x outer diameter x width) and this apparently is designated with the number 6203 in the ball bearing world.

I am not a mechanical engineer and have little knowledge of the intricacies of ball bearings and it was also surprisingly hard to find a lot of good information online on how to select the proper bearings for the application. I wanted high quality to avoid having to change them soon again and I thought that dust covers would be a good idea to minimize the risk of chips getting into particularly the lower bearing. After some browsing of an online catalog (at kullagret.com, although there are countless others), I realized that there were plenty of options, even after selecting a particular well respected brand. It was clear that deep groove bearings were required since they can handle axial loads as well as radial ones. Since rubber seals were slightly more expensive than metal shields, I thought they were superior and bought two SKF 6203-2RS bearings. This unfortunately turned out to be less than ideal.

After replacing the bearings (the process I used is described below), it turned out that the spindle still rotated with quite a bit of friction. The rubber sealed bearings themselves did indeed have significant friction, which was concerning even before putting them into the spindle, but it became even worse after the assembly was done. A quick test run revealed that the spindle got at least as hot as before and that the motor was almost not powerful enough to even run the unloaded spindle at full speed at the highest gear.

I  think part of the reason for the high friction was the rubber seals, but since it got even worse after assembly, I think there is also another part of it. It must be either that the bearings  are put under radial stress in the spindle, compressing them tighter and thus causing them to run with higher friction, and/or that there is ever so little misalignment  between the two bearings.

So, back to the bearing catalog. This time I tried to address both of the reasons for the high friction. I opted for bearings with a higher play, designated by the option C3. I also selected an unshielded bearing for the top one (6203/C3) – which will hopefully not be subjected to chips or other debris – and metal shields for the lower bearing (6203-2Z/C3). This worked much better and now the spindle runs smoothly with very little friction and no discernible play.

Below is a description of how I replaced the bearings the second time.

Disassembly

I first removed the spindle motor. It is fastened only by two screws holding its mounting plate to the rest of the spindle.

The spindle is secured to the Z-axis assembly by a single set screw holding on to a dove tail, so this was easy to remove.

Spindle removed from mill

The pulley is secured by two set screws. I released them and gently applied some force to pull it off from the shaft. There probably are some good special tools for this, but I used two screwdrivers as levers.

Removing the pulley

Under the pulley, there is a nut (with a very fine thread) that needs to be removed. I held on to the shaft by one wrench on the lower side while using another to loosen the nut.

Removing the nut

Now the shaft had to be pushed out of the bearings. This takes a lot of force. Maybe there is some trick that I am not aware of. Using a mallet to hammer it out might be one option, but I initially tried to be more gentle by using clamps (more than one was required to two get enough force) together with wooden blocks to avoid damaging the shaft. If I had had a gigantic vise with a wide enough mouth, that would probably have been a better option.

Pushing out the shaft using clamps and wooden blocks

Once the shaft was fully pushed into the top bearing, I resorted to hammering on a dowel at the end of it.

Hammering out the shaft using a dowel

This was successful.

The shaft has successfully been removed.

The next step was to remove the bearings. Here I came up with an (in my opinion) clever method. The housing is made of aluminum and the bearings are obviously made of steel. Aluminum expands a little more when it is heated than what steel does, so by heating the whole thing up by a few tens of degrees, it should be much easier to remove the bearings. So I set the kitchen oven to 60 C and let the spindle cook for an hour or so.

Cooking the spindle

This was even more effective than I had thought. The bearings more or less fell out by themselves.

Bearings falling out of hot spindle.

There were a few shims between the ends of the bearings and the spindle, probably to prevent the inner ring of the bearings to touch any part of the housing.

Re-assembly

Before the housing cooled down, I inserted the new bearings into it (together with the  shims).

Upper bearing without shield or seal
Lower bearing with metal shield

Inserting the shaft into the new bearings was a bit hard. I probably should have heated up the new bearings before attempting this. Instead I lubricated the shaft a little (not sure this helped) and used force in the form of a hammer to hammer it in. Maybe this could harm the bearings due to the high axial load, but fortunately the spindle ran fine afterwards, so perhaps it was no big deal. Next time I will probably heat the bearings (and perhaps even cool the shaft, although I am worried that might cause too much condensation and then rust) before trying to force it in.

Hammering in the shaft

After making sure the shaft turned smoothly with little friction and with no discernible play, I replaced the nut (not tightening it very hard as that increased friction), added the pulley and then put the whole thing back onto the mill.

The shaft and its nut are back
Reassembled Taig CNC mill

So despite the unnecessary set of sealed bearings I bought and having to do it all twice, I am pretty happy with the bearing replacement. Now the mill runs fine without the spindle getting hot, even after long runs at maximum RPM.

How to fix broken AltGr in Windows 10

I recently had the unpleasant experience that the AltGr key stopped working. After some googling and finding many pages that talked about it being caused by Remote Desktop (which I did not use), I finally found out that simultaneously pressing:

Shift – Caps Lock – AltGr

resolved the issue. I have no idea what the purpose of this shortcut is and it seems pretty stupid, but it is good to know about it if it happens again.

The page where I found the solution is:

https://superuser.com/questions/1149165/altgr-randomly-stops-working-on-windows-10

Voltage and Current Noise Sources in LTspice .noise Simulations

Update 2023-03-14: Phillip D., yildi1337, has implemented the noise sources described in this blog post in easy-to-use, parameterized LTSpice components. The components are available in the following Github repo: https://github.com/yildi1337/LTspiceNoiseSources.

Update 2019-03-14: As Jason pointed out in a comment, the simulations below involving Laplace sources do not directly work in LTspice XVII. The reason seems to be that LTspice changed its behavior such that it now (incorrectly) considers nodes connected to ground via the kind of behavioral current sources used here to be floating. To remedy this without affecting the simulation results, a very large resistor (e.g. 1 GΩ) can be inserted between such nodes and ground.

There does not seem to be a direct way of adding a voltage noise or current noise source to an LTspice (or other kinds of Spice for that matter) circuit to be used in a .noise simulation. It is however possible to add noise sources to be used in .tran (time domain) simulations using behavioral sources, but this is not what this post is about. Instead it shows a method of adding white (Johnson as well as shot) and 1/f (flicker) voltage or current noise sources of the desired amplitude to be used in .noise simulations.

One case where such noise sources can be useful is when making simulation models of amplifiers (like opamps) where the input referred voltage and current noises are known from the datasheet.

The only simple noise source (that affects .noise simulations) in LTspice is a simple resistor. Other noise sources exist in semiconductor device models, but those models are more complex and messy. An ideal resistor has a voltage noise described by:

Where k is Botzmann’s constant (1.381×10-23 J/K), T is the temperature in Kelvin (300 K by default in LTspice), B is the bandwidth in Hz and R is the resistance in Ω.

A datasheet for an amplifier typically specifies the white voltage noise in units of nV/√Hz and current noise in fA/√Hz (sometimes pA/√Hz).

So, can we somehow create noisy voltage and current sources based on noisy resistors? The answer is yes, by using dependent sources. To create a white voltage noise source, we can connect the input terminals of a voltage dependent voltage source (E source) to a resistor and use a suitable scaling factor. The dependent source isolates the resistor from any circuitry that is connected to it and preserves the voltage noise amplitude regardless of load.

As mentioned above, the noise source we are trying to model is usually specified in nV/√Hz, so it would be convenient to be able to directly enter that number as part of the model. A simple way of doing that is to select a resistance that produces a noise density of 1 nV/√Hz and enter the noise amplitude from the datasheet as the voltage gain of the dependent source. Solving the above equation for vn = 1 nV when T = 300 K and B = 1 Hz gives R = 60.343 Ω.

The resulting LTspice schematic for a 4.5 nV/√Hz voltage noise source is thus:

White voltage noise source with a noise density of 4.5 nV/√Hz

Similarly, to create a white current noise source, we can use a voltage dependent current source (G source). To allow us to set the transconductance factor of the source to the noise density in fA/√Hz, we need a resistor with a noise density of 1 fV/√Hz, which means that the resistor shall have the very small value of 60.343 pΩ (piko ohm)! A current noise source with a noise density of 4 fA/√Hz can thus be modeled like this:

White current noise source with a noise density of 4 fA/√Hz

Often, one is also interested in flicker noise, whose power density is proportional to 1/f, i.e. it decreases with frequency. If the power density is proportional to 1/f, the voltage (or current) noise density is proportional to 1/√f. This makes it a bit harder to create a model for this kind of noise in LTspice, but it is still possible. The trick is to use the white current noise source above and connect it to a behavioral current source (B source) which has a Laplace function that makes it behave like an impedance whose magnitude is 1/√f. I found the documentation to be a bit unclear on behavioral sources, but after some experimentation I got the following to work:

Flicker voltage noise source with an amplitude of 1.8 nV/√Hz at 100 Hz.

The documentation for a behavioral source in LTspice says that “If an optional Laplace transform is defined, that transform is applied to the result of the behavioral current or voltage.”. It seems that applied in this case means divided by. Unexpected in my opinion.

So the way this B source works is that it produces a current that is the same as the voltage across it (divided by an implicit resistance of 1 Ω to get the units right) and this current is modified by dividing it in the Laplace/frequency domain by the Laplace expression √(s/2π). The complex frequency variable s of the Laplace transform can be written as s = σ+jω = σ+j2πf where f is the frequency in Hz (and σ is the hard-to-interpret real part of s, which can be set to 0 to essentially convert the Laplace transform into a Fourier transform). By dividing s by , we get the desired behavior of an impedance whose magnitude is equal to 1/√f. This impedance is not a pure resistance, but a complex impedance that will cause a phase shift of 45 degrees between current and voltage. Phase shifts are however irrelevant when dealing with noise (unless there are multiple signal paths from a noise source to a node) and the important thing here is that the magnitude of the impedance is right. If we wanted to model a resistor with a resistance of 1/√f, we could divide s by √-1 to make the impedance real, like this: Laplace = sqrt(s/2/pi/sqrt(-1)). This would work equally well in our model for flicker noise, but the expression is bigger and clumsier without changing the noise simulation results.

The level of flicker noise is typically given in one of two ways in datasheets. Either one can read the level off a graph at some frequency where the flicker noise dominates, or it is specified as the corner frequency fc at which it is equal to the white noise level at the same node. In both cases we know the noise level at some frequency and we would of course like to be able to input these two numbers into the noise generator model. This is done by setting the noise level (at the specified frequency) as the transconductance of the G source and by setting the gain of the E source to the square root of the specified frequency. The reason we need to use the square root of the frequency is of course that the white noise current from the G source is multiplied by 1/√f by the B source and that we want to scale it back up to the same intensity precisely at fc. Multiplying the noise by √fc obviously cancels the 1/√f  factor at fc.

A flicker current noise generator can be created in a very similar manner. The only difference is that the output is produced by a G source and that the noise generating resistor is 60.343 pΩ. Here is an example:

Flicker current noise source with an amplitude of 2.3 fA/√Hz at 7000 Hz.

So let’s put all of this together and create a noise model of an opamp connected as a voltage follower like this:

Opamp voltage follower.

As an example, I selected OPA838 whose datasheet contains the following noise specifications:

OPA838 noise specifications.
OPA838 noise plots.

Here is the resulting noise model with all four noise sources (and 1TΩ resistors to make LTspice XVII happy):

OPA838 input noise model.

Link to the above LTspice schematic

The white current noise is 1000 fA/√Hz (R3, G2) and the current noise corner frequency is 7000 Hz (R4, G3, B2, G4). The white voltage noise is 1.8 nV/√Hz (R2, E2) and the voltage noise corner frequency is 100 Hz (R1, G1, B1, E1).

The 10 kΩ source resistor R5 is not part of the noise model of the opamp input itself, but is the impedance of the circuit driving the opamp input. This resistor converts the current noise into a noise voltage at the opamp input.

The out node is actually the non-inverting opamp input in this model.

A quick look at the circuit reveals that the 1 pA/√Hz times the 10 kΩ input resistor results in a noise voltage of 10 nV/√Hz, which will dominate over the much smaller 1.8 nV/√Hz white voltage noise.

Here are the simulation results from LTspice:

Noise simulation results.

The green curve is the total noise at the out node, flattening out at around 16 nV/√Hz at high frequencies. The other curves show the individual contributions from the various noise sources. Below 4 kHz, the current flicker noise (R4) dominates and above that the noise from the source resistor R5 is the largest contributor, closely followed by the white current noise (R3). In this circuit, the voltage noise sources R1 and R2 have negligible effect and even the white current noise source contributes less than what the source resistor does, so it is only below ~4 kHz that the opamp noise (in particular the current flicker noise) becomes dominant in this application. The very good voltage noise specification of OPA838 is of little value with this high a source impedance.