PID does not sense negative values.

I don't think it's related to your problem, but I think the call to SetOutputLimits() should be in setup(), not in loop().

I can't see any reason why that wouldn't work for negative input values. Can you post some examples of the trace output with positive and negative input values?