Настройка предделителя модуля ШИМ PCA9685

Я пытаюсь сделать частоту 60 Гц, вот как я это делаю:

    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)

На экране результат:

prescaler value = 101.725260417

однако можно установить только круглые значения, поэтому мы будем использовать 102 в качестве значения предварительного делителя, что дает частоту 59,8383884804.

Но с моим осциллографом Tektronix TDS210 я получаю частоту 64,1 Гц, а не 59,84 Гц.

Я где-то ошибся?

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

У меня была такая же проблема, этот чип не предназначен для создания точной частоты ШИМ. Первоначальная цель заключалась в том, чтобы управлять светодиодами, где 10%-ная погрешность частоты не имеет значения.
Кроме того, у вас уже есть ардуино. Если у вас не хватает контактов, вам, вероятно, следует просто использовать его встроенные блоки PWM — генерация 60 Гц с ними на самом деле не очень сложна.
@MadHatter вы нашли хороший (с связью i2c)
Нет, я долго искал устройства I2C... на удивление их нет. В итоге я использовал 2 atmega 328 с той же прошивкой и резистором для установки адреса I2C... Единственным недостатком является то, что у меня была другая кодовая база для управления.

Ответы (1)

Судя по старому отзыву на форуме adafruit, PCA9685 не очень точен. Таким образом, вы должны вручную проверить и адаптировать значение предварительного делителя.

Мои расчеты верны в соответствии со страницей 25 таблицы данных, и 102 действительно должен генерировать частоту 59,84 Гц.

Однако мое измерение осциллографа дает мне следующее:

110 = 60.24Hz
111 = 59.52Hz

TL:ДР ; из-за низкой точности этого компонента вычисление предварительного делителя дает только приблизительную оценку, вам придется измерять реальную вещь с помощью осциллографа.

см. второй пост: https://forums.adafruit.com/viewtopic.php?f=19&t=72554

Синий = реальный, измерено моим осциллографом

Красный = из формулы таблицы данных

введите описание изображения здесь