Изменение ШИМ на Arduino Mega, контакты 9 и 10 на 20–25 кГц

Я пытаюсь запустить двигатель Nema 17 с драйвером двигателя l298N для школьного проекта. Проблема в том, что я использую двигатель с ШИМ, чтобы избежать перегрева драйвера, однако возникающий шум на частоте по умолчанию чрезвычайно раздражает.

Как изменить частоту для контактов 9 и amp; От 10 до 20-25 кГц? Любые советы и примеры кода будут высоко оценены (акцент на примерах кода).

, 👍0


1 ответ


1

К счастью, таймер ШИМ на обоих контактах 9 и 10 на Arduino Mega (но не обязательно на других платах) — это таймер 2, поэтому изменение частоты ШИМ одного из них приведет к изменению частоты ШИМ другого.

Вы также должны убедиться, что изменение частоты таймера не влияет на другие библиотеки (например, Servo, из памяти обычно используется таймер 2).

Частота таймера задается регистром TCCR2B (биты CS22, CS21 и CS20), см. стр. 185 таблицы данных для микросхемы Mega2560 http://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8- bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf

Что касается кода, попробуйте следующее (только что протестировано с небольшим динамиком, кажется, что высота звука меняется, как и ожидалось, но у меня нет двигателя, чтобы это попробовать):

Каждая строка устанавливает частоту для таймера 2 (ШИМ 9 и 10), это можно сделать во время настройки, и настройки сохранятся. Обратите внимание, что первая строка эквивалентна обычным значениям по умолчанию:

  TCCR2B=(TCCR2B&248)|4;    //prescaler=64, f=977Hz

  TCCR2B=(TCCR2B&248)|3;    //prescaler=32, 1953Hz

  TCCR2B=(TCCR2B&248)|2;    //prescaler=8, 7812Hz

  TCCR2B=(TCCR2B&248)|1;    //prescaler=1 62500Hz

Также убедитесь, что драйвер вашего двигателя поддерживает данную частоту.

,

Спасибо. Это немного помогает, но мне действительно нужно достичь 20-25 кГц. Это единственная частота, которую мне удалось использовать с этим двигателем и не получить никаких слышимых артефактов. Есть идеи?, @Jordan Gladstone

Эти делители и частоты основаны на тактовой частоте 16 МГц и 256-шаговом диапазоне ШИМ. Если вы сможете изменить базовую частоту процессора, это поможет, но, вероятно, нарушит множество других вещей. Изменение количества шагов ШИМ возможно, но я не пробовал. Вам нужно будет изменить значение, при котором счетчик ШИМ возвращается к нулю. Обычно это 255, но если вы использовали prescaler=8 и получили цикл на 85, вы должны получить 23,4 кГц, но ваш полезный диапазон ШИМ будет 0–84 вместо 0–255 шагов., @user85471

Некоторым это помогает, но мне все еще трудно понять, почему получение диапазона ШИМ на правильной частоте — это такая борьба. Готовлюсь рассмотреть аппаратные решения. Неужели не существует эффективной процедуры внесения подобных изменений? Тот, который не ломает другие вещи и не ограничивает функциональность?, @Jordan Gladstone

Короткий ответ на вопрос, почему это так сложно, заключается в том, что «Arduino не предназначен для этого», и по большей части кажется, что большинству людей это не нужно. И практически для любого другого языка, кроме Arduino, вам придется иметь дело с настройкой регистров на этом уровне (даже для того, чтобы вообще настроить ШИМ для работы, не говоря уже о его настройке)., @user85471