Частота PWM Arduino Nano

pwm

Я использовал Arduino Nano в качестве ШИМ-контроллера для нагревательного элемента.

В настоящее время я использую D11 (PB3). Я мог бы изменить, хотя все контакты с ШИМ используются и потребовали бы перезаписи и повторного подключения.

Это создает сигнал на частоте ~490 Гц, но я хотел бы поэкспериментировать с изменением его на более высокую частоту.

Я полагаю, что можно изменить частоту, изменив делитель с 64 по умолчанию.

Мой скетч использует Использует http://playground.arduino.cc/Main/SevenSegmentLibrary и вызывает millis() - повлияет ли изменение делителя ШИМ на любой из них?

ПРИМЕЧАНИЕ.Я прочитал документацию по частоте setpwm, но считаю, что "нарушает нормальную работу" бесполезно - на самом деле я после некоторого объяснения конкретного эффекта. Я использую millis() только для определения времени нажатия кнопок и мигания светодиода, которые не являются критичными по времени

Пожалуйста, имейте в виду, что изменение частоты ШИМ изменяет таймеры Atmega и нарушает нормальную работу многих функций, зависящих от времени (задержка (), миллис (), библиотека сервоприводов).

Я проводил некоторые дальнейшие исследования. http://playground.arduino.cc/Code/PwmFrequency изменения состояний на выводах 3, 5, 6 или 11 могут привести к тому, что функции delay() и millis() перестанут работать.

В других ссылках говорится, что 3, 11 используют таймер 2, поэтому влияют ли они на millis() или нет, поскольку в других ссылках утверждается, что для них используется таймер 0.

, 👍3

Обсуждение

Да и нет, в зависимости от используемого шим-таймера., @dannyf


3 ответа


Лучший ответ:

2

Я не знаю, откуда берется эта дезинформация... Ответ таков нет, перенастройка таймера 2 не влияет ни на миллис (), ни на delay(), так как эти функции зависят от таймера 0. AFAIK ядро Arduino вообще не использует таймер 2. Но обратите внимание, что могут существовать другие библиотеки Arduino или сторонних производителей, которые полагаются на таймер 2.

Вы можете увидеть здесь исходный код millis() и delay().

Как правильно указывает МИТУ РАДЖ в своем ответе, ШИМ-сигнал на выводе 11 подается таймером 2, поэтому вы можете безопасно его использовать.

,

Дезинформация исходит от http://playground.arduino.cc/Code/PwmFrequency. Я уверен, что я не единственный пользователь, которого ввели в заблуждение. Другой ответ только что опубликовал выдержку из вводящей в заблуждение документации., @Milliways


2

Зависит от контакта, который вы использовали для ШИМ.

В спецификациях Arduino UNO/NANO говорится следующее:

Базовая частота для выводов 3, 9, 10 и 11 составляет 31250 Гц.

Базовая частота для выводов 5 и 6 составляет 62500 Гц.

Делители, доступные на выводах 5, 6, 9 и 10, следующие: 1, 8, 64, 256 и 1024.

Делители, доступные на выводах 3 и 11, являются: 1, 8, 32, 64, 128, 256, и 1024.

Частоты ШИМ связаны между собой парами выводов. Если один из пары изменяется, другой также изменяется в соответствии.

Контакты 5 и 6 соединяются по времени 0.

Контакты 9 и 10 соединяются по времени 1.

Контакты 3 и 11 соединены по времени 2.

Изменения на выводах 3, 5, 6 или 11 могут привести к тому, что функции delay() и millis() перестанут работать. Также могут быть затронуты другие функции, связанные с синхронизацией.

,

Поскольку вы цитируете спецификации, было бы неплохо, если бы вы также могли ссылаться на них? :), @Sixtyfive


2

Ответ ОТРИЦАТЕЛЬНЫЙ, изменение делителя ШИМ для вывода 11 не повлияет на функцию millis () (или delay()).


Пояснение:
В Arduino Nano используется микроконтроллер ATmega328P, такой же, как и в Arduino Uno.

ШИМ вывода 11 управляется таймером 2. По умолчанию таймер 2 имеет значение 64 (т. е. значение 0x04). Базовая частота таймера 2 составляет 31372,55 Гц, что приводит к частоте 490,2 Гц (т. е. 31372,55/64 = 490,1961).

С другой стороны, микросекундный таймер (т. е. тот, который используется миллисами (), микросекундами (), задержкой() и задержкой в микросекундах ()), управляется таймером 0.

Таким образом, изменение прескалера таймера 2 не повлияет на millis().

Однако это изменит частоту ШИМ на выводе 3.


Возвращаясь к вашему вопросу:
Возможные частоты ШИМ вывода 11 (выше 488 Гц):

31373 / 32 = 980,4 Гц
31373 / 8 = 3921,6 Гц
31373 / 1 = 31373 Гц

Где 32, 8, 1-прескалер.
Что соответствует значению настройки 0x03, 0x02 и 0x01 соответственно.

Добавьте эту строку кода:

TCCR2B = TCCR2B & 0b11111000 | setting;

Где параметр-значение параметра для соответствующего прескалера.

============================================  
|| Frequency [Hz] || Prescaler || Setting ||  
============================================  
|| 31373.55       || 1         || 0x01    ||  
|| 3921.57        || 8         || 0x02    ||  
|| 980.39         || 32        || 0x03    ||  
|| 490.20         || 64        || 0x04    ||  
|| 245.10         || 128       || 0x05    ||  
|| 122.55         || 256       || 0x06    ||  
|| 30.64          || 1024      || 0x07    ||  
============================================  

Исходный код: https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c

,

Просто придираюсь, но... базовая частота таймера в режиме ШИМ с коррекцией фазы составляет F\_CPU/510 (31373 Гц), а не F\_CPU/512: для отсчета от 0 до 255 требуется 255 циклов, затем еще 255 для обратного отсчета до нуля. C. f. уравнение для частоты ШИМ в таблице данных., @Edgar Bonet

@EdgarBonet Хорошая мысль. Теперь ответ исправлен., @sa_leinad

можно ли было бы снизиться на шаг медленнее до 15,31 Гц?, @Ayson Baxter