This may be more than you’re interested in, but I’d recommend doing this with vector math. It’ll still involve angles, but if you’re not already, you’ll probably want to get comfortable with expressing these sorts of problems in terms of vector math and transforms, since this will make it easier to solve a lot of other types of problems as well.
For this you’ll need a 2-d vector class (which I assume you have available). If it doesn’t already have a ‘perp’ function, you’ll need to implement that. The ‘perp’ function returns a vector perpendicular to the input vector, and can be implemented as (all untested pseudocode):
perp(v) = [ -v.y, v.x ]
Next you’ll need a ‘perp dot’ function, which can be implemented as:
perp_dot(a, b) = dot(perp(a), b)
You’ll also need a ‘signed angle’ function, which can be implemented as:
signed_angle(a, b) = atan2(perp_dot(a, b), dot(a, b))
Once you have these function available (which you may already), you’ll need the forward vector for your turret:
forward = [ cos(turret_angle), sin(turret_angle) ]
You’ll also need the vector from the turret to the target:
vector_to_target = target_position - turret_position
At this point you can compute the signed angle by which the turret would need to turn to point in the right direction:
angle_to_turn = signed_angle(forward, vector_to_target)
As I think chrislo27 alluded to earlier, each update you would then rotate by min(turn_speed * delta_time, angle_to_turn). The turret can be rotated back to its original orientation similarly if needed. This method should handle stopping at the correct angle automatically, although if you run into any jitter or other artifacts, there are things you can do to fix that.
The above may seem a little complicated (or maybe not), but the vector math for this is really pretty straightforward. In any case, this is how I’d do it.