Самодельная вытяжка для паяльного стола работала прекрасно, пока я не сел рядом слушать. На средней скорости вентилятор издавал тонкий стеклянный писк — примерно комариный по высоте, не громкий, но неотвязный; на полной громкости его перекрывал рёв, но между ними, на тех заполнениях, где я обычно и паял, пин гудел на 490 герцах. Кошка ушла из комнаты в первый же день. Я грешил на подшипник, менял вентилятор — второй пел так же. Пел не вентилятор: пела обмотка, которую щёлкали током 490 раз в секунду.
Частоты заводского ШИМ на Uno известны: пины 3, 9, 10 и 11 живут на 490 Гц, пины 5 и 6 — на 976 Гц; почему так, разобрано в уроке-обзоре таймеров. Обе частоты — прямо в середине слышимой полосы: ухо берёт примерно от 20 Гц до 16-20 кГц в зависимости от возраста, и катушка, которую тысячи раз в секунду дёргают туда-обратно, честно превращает щелчки тока в звук. Границы тона и физику звука мы трогали ещё в уроке про зуммер и tone() — мотор звучит по тем же правилам, только вместо мелодии у него одна нота.
Лечение — увод частоты выше слышимости: после 20 кГц ухо сдаётся, и мотор крутит своё молча. Команды «сделай ШИМ потише» в языке нет — analogWrite частоту не меняет. Меняет её регистр предделителя таймера: одна строка в setup(), и этот урок — про то, какие биты крутить, почему Timer0 не трогают никогда, во что высокая частота обходится драйверу и что услышало бы ухо. Саму замену частоты покажет code-блок для платы, а слышимость — модель с зуммером в симуляторе: движок регистры не исполняет, и я говорю это прямо.
Три строки: предделитель через регистры
Каждый таймер тикает от кварца 16 МГц через предделитель — число, на которое делится тактовая частота. Биты предделителя CS живут в регистре TCCRnB, и ядро Arduino выставляет их за вас ещё до setup(): Timer1 и Timer2 делят на 64 — отсюда и 490 Гц. Регистры таймеров нам уже знакомы: в уроке про прерывание по совпадению тем же языком мы делали свой тик на 1000 герц — здесь тот же словарь, другая цель. Запись вида TCCR1B = (TCCR1B & B11111000) | B00000001 читается так: старые три бита предделителя обнулить (маска B11111000), новые записать поверх — единицу, предделитель 1. Такты идут без деления, период 8-битного ШИМ — 510 тактов со счётом вверх-вниз, и 16 000 000 / 510 даёт 31 372 Гц. Выше порога слышимости — с запасом в полторы тысячи герц.
Та же строка с TCCR2B поднимает до 31 372 Гц пины 3 и 11, с TCCR1B — пины 9 и 10. Пины 5 и 6 принадлежат Timer0, и вот его предделитель не трогают никогда: Timer0 считает millis() и delay(). Сменили делитель — время поехало: при предделителе 1 millis() бежит в 64 раза быстрее, таймаут на минуту истекает за секунду. Я однажды час вычищал «залипший» датчик, который невиновно ждал, пока я вспомню эксперимент с регистрами за день до этого.
Мнение с границей. Для мелких моторчиков и вентиляторов ставлю предделитель 1 без раздумий: выше слуха — и всё. Для мощных моторов через L298N из урока про драйвер беру предделитель 8 (3,92 кГц): биполярные ключи моста переключаются медленно, на 31 кГц потери на каждое переключение растут, и модуль греется заметнее — можете сравнить пальцем через час работы. Ещё цена высокой частоты — минимальная скорость: импульсы короткие, индуктивность не успевает набрать ток, и мотор трогается с заполнения 40-60 вместо 20-30. Если проекту нужна ползучая скорость, это проверяйте до финальной сборки.
// 31 кГц на четырёх ШИМ-пинах: писк уходит за порог слышимости.void setup() { Serial.begin(9600); // Timer1 -> пины 9 и 10. Маска чистит три бита предделителя, // единица в конце ставит предделитель 1 TCCR1B = (TCCR1B & B11111000) | B00000001; // Timer2 -> пины 3 и 11. Та же строка TCCR2B = (TCCR2B & B11111000) | B00000001; // Timer0 (пины 5 и 6) НЕ ТРОГАЕМ: на нём сидят millis() и delay() pinMode(9, OUTPUT); analogWrite(9, 120); // вентилятор на 9-м: крутится и молчит Serial.println("PWM 31372 Hz na pinyah 9 10 3 11");} void loop() { // вся логика проекта без изменений: скважность по-прежнему 0-255}Проверка без осциллографа простая: соберите, покрутите заполнение — и слушайте. Ушло суетливое жужжание на средних оборотах, остался рёв крыльчатки и лёгкий низкий рокот — значит, частота встала. Рокот остаётся всегда: это уже не электрика, а механика — подшипники и небаланс крыльчатки гудят на своих 30-100 Гцах, и никакой регистр их не сместит. Кстати, светодиоды на тех же пинах при низких предделителях начинают мигать на глаз: при 30 Гц ШИМ диммер превращается в стробоскоп — наглядная проверка, что строка сработала.
И два уточнения, чтобы не было сюрпризов. Скважность не меняется: analogWrite по-прежнему принимает 0-255, меняется только то, как плотно эти импульсы идут по времени. И частота меняется сразу для всех пинов таймера: поставили Timer1 на 31 кГц — переехали и 9-й, и 10-й, хочешь ты этого или нет. Карту, кто на каком таймере сидит, я держу перед глазами всегда — она же спасает от конфликтов с библиотеками, о которых следующий урок расскажет на примере Servo.h.
Бонус, о котором редко пишут: светодиодные ленты в кадре видеокамеры на 490 Гц дают бегущие тёмные полосы — камера разворачивает кадр медленнее, чем мерцает лента. После перевода на 31 кГц полосы уходят целиком. Поэтому для подсветки, которая попадает в кадр, я гоню частоту вверх даже без всякого звука; а вот для ночника у кровати трогать ничего не стоит — на низкой частоте драйверу ленты легче, и глаз всё равно слеп.
| Предделитель | Частота ШИМ (пины 9, 10, 3, 11) | Что слышит ухо | Когда ставлю |
|---|---|---|---|
| 1 | 31,37 кГц | тишина: выше порога слышимости | мелкие моторы и вентиляторы — мой выбор по умолчанию |
| 8 | 3,92 кГц | тонкий писк на самой грани слышимости | мощные моторы через L298N: мосту легче на низкой частоте |
| 64 | 490 Гц | гудение посреди слышимой полосы | заводская настройка, если регистры не трогаю вовсе |
| 1024 | 30,6 Гц | низкий рокот; светодиод мигает на глаз | мигалки и спецэффекты, для моторов — ни при каких условиях |
Модель шума: что услышало бы ухо
Движок симулятора регистры не исполняет — ни TCCR1B, ни битов CS у него нет, и частоту ШИМ в симе не поменять: крыльчатка крутится одинаково на любой «частоте». Зато сам факт слышимости моделируется честно: зуммер воспроизводит ровно ту ноту, на которой пела бы обмотка. Ручка A0 листает шесть ступеней: 30, 50, 100, 490, 976 и 31 372 Гц — от низкого рокота механики через заводские 490 и 976 до ультразвуковых 31 кГц, на которых скетч вызывает noTone.
Смотрите в монитор: пары f= и slyshno= фиксируют каждую ступень. На всех ступенях ниже 16 кГц зуммер звучит — ровно так дёргает нервы мотор на заводских настройках. На последней ступени — тишина, при которой крыльчатка продолжает крутиться: это и есть итог урока в одном сравнении. Те же ступени на настоящей плате собираются предделителями из таблицы выше, а ход крыльчатки по ступеням останется тем же: частота звука и скорость мотора — независимые вещи, и путать их не стоит.
Скважность, частота и яркость светодиода — крутите ползунки и смотрите на осциллограмму.
Подгружаем интерактив…
- Заводской ШИМ гудит, потому что 490 и 976 Гц — середина слышимой полосы (ухо примерно 20 Гц - 16-20 кГц); катушка мотора превращает щелчки тока в звук
- Частоту меняет предделитель: TCCR1B = (TCCR1B & B11111000) | B00000001 даёт 31,37 кГц на пинах 9 и 10; та же строка с TCCR2B — на 3 и 11
- Timer0 (пины 5 и 6) не трогают никогда: на нём millis() и delay(), смена предделителя ускоряет время в 64 раза
- Цена высокой частоты: биполярный L298N греется сильнее, минимальная скорость поднимается до заполнения 40-60; для мощных мостов мой компромисс — предделитель 8 (3,92 кГц)
- Маска B11111000 обязательна: предделитель записывают поверх старых битов, а не вместо всего регистра
- 1. Почему мотор гудит на заводском ШИМ 490 Гц, а светодиод молчит?
- 2. Какая строка ставит Timer1 на предделитель 1?
- 3. Что случится с millis(), если поставить Timer0 на предделитель 1?
- 4. Почему для мощного моста L298N я беру 3,92 кГц, а не 31 кГц?
- 5. Мотор на 31 кГц не стронулся при заполнении 25. Что происходит?
Частые вопросы по теме урока
- Почему мотор гудит на заводском ШИМ 490 Гц, а светодиод молчит?
- Звук рождается из механики: пульс момента на частоте ШИМ трясёт катушку и сердечник. Светодиод мерцает на той же частоте, но у него нет массы, а глаз сливает всё выше ~50 Гц. обмотка — деталь с массой и упругостью: пульс тока на 490 Гц трясёт её в слышимом диапазоне, у светодиода механики нет
- Какая строка ставит Timer1 на предделитель 1?
- Маска B11111000 чистит три бита CS, единица записывает предделитель 1. Запись без маски ломает биты режима, а Timer0 трогать нельзя — там millis(). TCCR1B = (TCCR1B & B11111000) | B00000001
- Что случится с millis(), если поставить Timer0 на предделитель 1?
- Ядро настраивает Timer0 на предделитель 64; сменили на 1 — счётчик тикает в 64 раза чаще, и всё хронометрическое хозяйство летит вперёд с той же кратностью. millis() побежит в 64 раза быстрее: таймаут на минуту истечёт за секунду
- Почему для мощного моста L298N я беру 3,92 кГц, а не 31 кГц?
- Биполярные ключи переключаются медленно, и на каждом переключении часть мощности уходит в нагрев. На высокой частоте переключений в 64 раза больше — модуль греется ощутимо сильнее. на 31 кГц растут потери на каждое переключение биполярных ключей, и модуль греется заметнее
- Мотор на 31 кГц не стронулся при заполнении 25. Что происходит?
- Высокая частота укорачивает импульсы, и ток в индуктивности не успевает вырасти до пускового. Цена ультразвукового ШИМ — подросший минимум: мотор трогается с заполнения 40-60. импульсы короткие: индуктивность не успевает набрать ток, минимальное заполнение нужно поднять