Tuning PID coefficients for stationary stability of brushless DC motors
In general, there is no guaranteed way to fix your problem. The heart of it is your deriving an error signal from the encoder. When the encoder is at the desired position, you get zero error, and hence zero drive. Any drift in the system will eventually cause a one step error. The control loop will drive the motor back towards zero. At zero, the motor will continue to drift in the opposite direction until it produces a one step error, and the process repeats in the opposite direction.

The buzzing that you get means that your gain is very high, and even a one step error produces a large error torque, so the cycling happens at high frequency. One thing you might try is to produce a non-linear amplifier which has low gain for low error inputs, but this will introduce various control loop problems which may or may not be acceptable.

In many respects, the simplest fix is to use stepper motors, since these display a detent torque which prevents the limit cycling you're seeing. Alternatively, dropping your I term to zero will minimize drift.