Недавно у меня была причина начать эксперименты с ШИМ, и я обнаружил, что (как указано в одном из комментариев) частота, похоже, меняется в зависимости от рабочего цикла - bizzare, верно? Оказывается, Broadcom внедрил «сбалансированный» ШИМ для того, чтобы импульсы включения и выключения были максимально равномерно распределены. Они дают описание алгоритма и некоторые другие обсуждения на странице 139 их таблицы данных:
http://www.element14.com/community/servlet/JiveServlet/downloadBody/43016-102-1-231518/Broadcom.Datasheet.pdf
Так что вы действительно хотите перевести ШИМ в режим mark-space, что даст вам традиционный (и легко предсказуемый) PWM, который вы ищете:
pwmSetMode(PWM_MODE_MS);
Остальная часть ответа предполагает, что мы находимся в режиме пробела.
Я также провел некоторые эксперименты с допустимым диапазоном значений для pwmSetClock()
и pwmSetRange()
. Как отмечалось в одном из других ответов, допустимый диапазон значений составляет pwmSetClock()
от 2 до 4095, а допустимый диапазон pwmSetRange()
- до 4096 (я не пытался найти нижний предел).
Диапазон и тактовая частота (лучшее название, вероятно, делитель) влияют на частоту. Диапазон также влияет на разрешение, поэтому, хотя возможно использование очень низких значений, существует практический предел того, насколько низким вы, вероятно, захотите пойти. Например, если вы используете диапазон 4, вы можете достичь более высоких частот, но вы сможете установить только коэффициент заполнения 0/4, 1/4, 2/4, 3/4 или 4/4.
Часы Raspberry Pi PWM имеют базовую частоту 19,2 МГц. Эта частота делится на аргументpwmSetClock()
, является частотой, на которой увеличивается счетчик ШИМ. Когда счетчик достигает значения, равного указанному диапазону, он сбрасывается в ноль. Пока счетчик меньше указанного рабочего цикла, выходной сигнал высокий, в противном случае выходной сигнал низкий.
Это означает, что если вы хотите настроить ШИМ на определенную частоту, вы можете использовать следующее соотношение:
pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.
Если вы используете максимально допустимые значения для pwmSetClock()
и pwmSetRange()
, вы получите минимально достижимую аппаратную частоту ШИМ ~ 1,14 Гц. Это, безусловно, даст видимое мерцание (на самом деле больше вспышки) светодиода. Я подтвердил вышеупомянутое уравнение с помощью осциллографа, и, похоже, оно верно. На верхний предел частоты будет влиять необходимое разрешение, как описано выше.
pwmWrite()
. Не то, что я ожидал бы случиться