Ручной расчёт TOP
В этом разделе мы вручную вычислим значение TOP для заданной частоты ШИМ. Этот метод требует перебора различных значений делителя и проверки, попадает ли получившееся значение TOP в допустимый диапазон.
В следующем разделе есть более удобный способ: с помощью кода на Rust или формы-калькулятора можно автоматически вычислить и TOP, и делитель. Однако ручной метод полезен уже сейчас, потому что помогает понять, как тактовая частота, делитель и значение TOP связаны друг с другом.
Значение TOP должно лежать в диапазоне от 0 до 65534. Хотя TOP хранится в 16-битном беззнаковом регистре, если установить его в 65535, нельзя получить настоящую скважность 100 процентов. Это происходит потому, что для скважности 100 процентов регистр сравнения скважности (CC) должен быть равен TOP + 1, а сам CC также имеет ширину 16 бит. Если держать TOP не выше 65534, значение TOP + 1 всё ещё помещается в регистр CC, и весь диапазон скважности от 0 до 100 процентов представляется корректно.
Чтобы TOP оставался в этих пределах, мы будем выбирать значения делителя, являющиеся степенями двойки, например 8, 16, 32 или 64. Такой подход работает не для каждой возможной частоты. В некоторых случаях понадобятся другие целые значения или даже дробные делители. Чтобы всё было просто, начнём с этого подхода.
В качестве примера рассчитаем значения, необходимые для генерации сигнала ШИМ 50 Гц для сервопривода.
Формула частоты ШИМ
Даташит RP2350 определяет частоту ШИМ так:
\[ f_{PWM} = \frac{f_{sys}}{\text{period}} = \frac{f_{sys}}{(\text{TOP} + 1) \times (\text{CSR_PH_CORRECT} + 1) \times \left( \text{DIV_INT} + \frac{\text{DIV_FRAC}}{16} \right)} \]
Вот выведенная формула для получения TOP по целевой частоте:
\[ \text{TOP} = \frac{f_{sys}} {f_{PWM} \times (\text{CSR_PH_CORRECT} + 1) \times \left( \text{DIV_INT} + \frac{\text{DIV_FRAC}}{16} \right)} - 1 \]
Где:
- \( f_{PWM} \) — желаемая частота ШИМ.
- \( f_{sys} \) — системная частота тактирования. Для Pico 2 она равна 150 МГц.
Мы не будем использовать фазово-корректный режим и не будем использовать дробную часть делителя, поэтому упростим формулу ещё больше:
\[ \text{TOP} = \frac{f_{sys}} {f_{PWM} \times \text{DIV_INT}} - 1 \]
TOP для 50 Гц
Нам нужна частота ШИМ 50 Гц. Чтобы её получить, подставим системную частоту тактирования, целевую частоту и выбранную целую часть делителя и получим следующее значение TOP:
\[ \text{top} = \frac{150,000,000}{50 \times 64} - 1 \]
\[ \text{top} = \frac{150,000,000}{3,200} - 1 \]
\[ \text{top} = 46,875 - 1 \]
\[ \text{top} = 46,874 \]
Вы можете поэкспериментировать с другими значениями делителя (в том числе дробными) и соответствующими значениями top.