diff --git a/Adafruit_PWMServoDriver.cpp b/Adafruit_PWMServoDriver.cpp index 4c614fe..f3170ac 100755 --- a/Adafruit_PWMServoDriver.cpp +++ b/Adafruit_PWMServoDriver.cpp @@ -296,24 +296,17 @@ void Adafruit_PWMServoDriver::writeMicroseconds(uint8_t num, uint16_t Microsecon double pulselength; pulselength = 1000000; // 1,000,000 us per second - // Read prescale and convert to frequency - double prescale = Adafruit_PWMServoDriver::readPrescale(); - prescale += 1; - uint32_t freq = 25000000; // Chip frequency is 25MHz - freq /= prescale; - freq /= 4096; // 12 bits of resolution - - #ifdef ENABLE_DEBUG_OUTPUT - Serial.print(freq); Serial.println(" Calculated PCA9685 chip PWM Frequency"); - #endif - - pulselength /= freq; // us per period from PCA9685 chip PWM Frequency using prescale reverse frequency calc + // Read prescale + uint16_t prescale = Adafruit_PWMServoDriver::readPrescale(); #ifdef ENABLE_DEBUG_OUTPUT - Serial.print(pulselength); Serial.println(" us per period"); + Serial.print(prescale); Serial.println(" PCA9685 chip prescale"); #endif - pulselength /= 4096; // 12 bits of resolution + // Calculate the pulse for PWM based on Equation 1 from the datasheet section 7.3.5 + prescale += 1; + pulselength *= prescale; + pulselength /= FREQUENCY_CALIBRATED; #ifdef ENABLE_DEBUG_OUTPUT Serial.print(pulselength); Serial.println(" us per bit");