Driver for half-speed rotation of gear completes two half rotations
So when you use a driver from a transform, there's two different ways to do it.  One is to drive from a transform channel, which is what you're doing currently.  The other way to do it is to drive directly from a single property (in this case, a rotation channel.)
The difference between these two things is that a single property is basically your fcurve value-- more or less, the raw number that's being animated-- while a transform channel has constraints run on it, and is &quot;cleaned up&quot;.  By cleaned up, one of the things that I mean is that any rotation is remapped to the -180, 180 range.  So 380 degrees of rotation turns into 20 degrees of rotation, which is the same ransform, right?  Well, it is, unless you're doing math on it, which you are.
In order to get what we want from gears, we can't use the transform channel.  We have to use the raw, &quot;single property&quot; value.  Unfortunately, that means that a few other things in your rig have to be changed.  Yes, one of those things is the rotation mode of the bone that is ultimately driving this.  (But you don't want a quaternion for this anyways-- Blender's quaternion implementation makes it impossible to get flat rotational velocity from quaternion rotation, and that's usually something people want out of the gears.)
Let's start by fixing up the bone.  Clear rotation, delete all keyframes.  Change rotation mode to ZYX Euler (because we're only ever going to rotate this in the Z axis, we want the Z rotation to come first.)  Keyframe its rotation at 0 degrees on frame 1, then advance to some future frame, give it a Z rotation of 360 degrees, and keyframe that new rotation.  Or, 720, or 1440, for good numbers to test the replacement driver.
Now let's fix up that driver.  Because we're going to be using raw values rather than world space transforms, we can't drive from a child of the bone.  That child never has any raw numbers other than zero for its rotation.  We need to drive from the bone directly.  So delete your driver on gear_ring.  Then select your bone in pose mode and right click in its Z rotation field (in properties, or in the sidebar) and select &quot;Copy as new driver.&quot;  Then select your gear_ring object and right click in its Y rotation field and &quot;Paste as new driver.&quot;
Test it out real quick.  Not quite right.  Select the driver (&quot;Y Euler Rotation&quot;) on the left margin of the driver editor.  Then open a driver editor sidebar and switch to its &quot;Drivers&quot; tab.  Change the type of driver to a Scripted Expression, then change the expression to rotation_euler/2 .  Now, instead of being equal to your keyframed rotation, it's only half of your keyframed rotation.
Repeat with the inner gears.  They get the same kinds of drivers, but their expression should be rotation_euler * 2 instead.