Configuración del preescalador del módulo PCA9685 PWM

Estoy tratando de hacer una frecuencia de 60 Hz, así es como lo hago:

    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))
    oldmode = self.pca9685_device.readU8(self.MODE1);
    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)

En la pantalla el resultado es:

prescaler value = 101.725260417

sin embargo, solo se pueden configurar valores redondos, por lo que usaremos 102 como valor de preescalador, lo que genera una frecuencia de 59.8383884804

Pero con mi osciloscopio, un Tektronix TDS210 obtengo una frecuencia de 64.1Hz, no 59.84Hz

¿Cometí un error en alguna parte?

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

Tuve el mismo problema, este chip no está diseñado para crear una frecuencia PWM precisa. La intención original era impulsar los LED donde no importa un error de frecuencia del 10 %.
Además, ya tienes un arduino. A menos que se esté quedando sin pines, probablemente debería usar sus unidades PWM integradas: generar 60 Hz con ellas no es realmente inmensamente complejo
@MadHatter, ¿encontró uno bueno (con comunicación i2c)?
No, pasé mucho tiempo buscando dispositivos I2C... Sorprendentemente, en realidad no hay ninguno. Terminé usando 2 atmega 328 con el mismo firmware y una resistencia para configurar la dirección I2C... El único inconveniente es que tenía otra base de código para administrar.

Respuestas (1)

Según un viejo comentarista del foro de adafruit, el PCA9685 no es muy preciso. Por lo tanto, debe verificar y adaptar manualmente el valor del preescalador.

Mis cálculos son correctos según la página 25 de la hoja de datos y 102 debería generar una frecuencia de 59,84 Hz.

Sin embargo, mi medida de osciloscopio me da esto:

110 = 60.24Hz
111 = 59.52Hz

TL:DR; debido a la baja precisión de este componente, el cálculo del preescalador solo le brinda una estimación aproximada, tendrá que medir la realidad con un osciloscopio.

ver segunda publicación: https://forums.adafruit.com/viewtopic.php?f=19&t=72554

Azul = real, medido con mi osciloscopio

Rojo = de la fórmula de la hoja de datos

ingrese la descripción de la imagen aquí