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