# Setting the PCA9685 PWM module prescaler

I'm trying to make a 60Hz frequency, this is How I do it :

    freq_hz = 60
pca9685_frequency = 25000000.0 #pca9685 clock : 25Mhz
pca9685_resolution = 4096.0 #12 bits resolution
freq_in_step = pca9685_resolution*float(freq_hz)
prescaleval = pca9685_frequency/freq_in_step
print "prescaler value = {}".format(prescaleval)
prescale = int(math.floor(prescaleval + 0.5))
print "however only round values can be set so we wil use {} as a prescaler value".format(prescale)
print "which makes a frequency of {}".format(pca9685_frequency/(prescale*pca9685_resolution))
newmode = (oldmode & 0x7F) | 0x10    # sleep
self.pca9685_device.write8(self.MODE1, newmode)  # go to sleep
self.pca9685_device.write8(self.PRESCALE, prescale)
self.pca9685_device.write8(self.MODE1, oldmode)
time.sleep(0.005)
self.pca9685_device.write8(self.MODE1, oldmode | 0x80)


On the screen the result is :

prescaler value = 101.725260417


however only round values can be set so we will use 102 as a prescaler value which makes a frequency of 59.8383884804

But with my oscilloscope, a Tektronix TDS210 I get a 64.1Hz frequency, not 59.84Hz

Did I make a mistake somewhere?

https://www.nxp.com/docs/en/data-sheet/PCA9685.pdf

• I had the same issue, this chip is not designed to create an accurate PWM frequency. The original intent was for driving LEDs where a 10% frequency error does not matter. Oct 22, 2017 at 20:23
• Also, you have an arduino already. Unless you're running low on pins, you should probably just use its built-in PWM units – generating 60 Hz with those isn't really immensely complex Oct 22, 2017 at 20:37
• @MadHatter did you find a good one (with i2c communication) Oct 22, 2017 at 22:30
• Nope, I spent a long time looking for I2C devices... surprisingly there are not really any. I ended up using 2 atmega 328s with the same firmware and a resistor to set the I2C address... The only downside is then I had another code base to manage. Oct 23, 2017 at 0:01

From old awnser of the adafruit forum, the PCA9685 is not very precise. So you have to manually check and adapt the prescaler value.

My math are correct according to page 25 of the datasheet and 102 should indeed generates a frequency of 59.84Hz.

However my oscilloscope measurement gives me this :

110 = 60.24Hz
111 = 59.52Hz


TL:DR ; due to the low precision of this component the prescaler computation only gives you a close estimate, you will have to measure the real thing with an oscilloscope.