В настоящее время я могу установить четыре PWM-вывода примерно на 31 кГц с помощью следующего кода:
void setup()
{
TCCR1B = TCCR1B & B11111000 | B00000001; // Set PWM frequency for D9 & D10:
pinMode(pwmPin9, OUTPUT); // Sets the pin as output
pinMode(pwmPin10, OUTPUT); // Sets the pin as output
TCCR2B = TCCR2B & B11111000 | B00000001; // Set PWM for D3 & D11
pinMode(pwmPin3, OUTPUT); // Sets the pin as output
pinMode(pwmPin11, OUTPUT); // Sets the pin as output
}
Я где-то нашел эту настройку, но я не знаю, как вместо этого установить эти четыре PWM-контакта на 25 кГц. Как это возможно?
Ответы:
Я публикую этот второй ответ, поскольку понял, что на одном Arduino Uno можно использовать 4 канала ШИМ с частотой 25 кГц и 161 шаг. Это включает в себя изменение основной тактовой частоты до 8 МГц , что имеет некоторые побочные эффекты, поскольку вся программа будет работать в два раза быстрее. Она также включает в себя перенастройки три таймера, что означает потерю функции синхронизации (Ардуина
millis()
,micros()
,delay()
иdelayMicroseconds()
). Если эти компромиссы приемлемы, вот как это происходит:В отличие от другого ответа , для этого не требуется модифицированная версия
analogWrite()
: стандартная будет работать нормально. Только следует позаботиться о том, чтобы:analogWrite()
контактам 6 или 11 не только не даст выходной сигнал ШИМ, но также изменит частоту на контактах 5 или 3 соответственно.источник
Вы можете настроить таймер 1 для работы на частоте 25 кГц в режиме ШИМ с правильной фазой и использовать его два выхода на контактах 9 и 10 следующим образом:
Запись значения 0
analogWrite25k()
означает, что вывод будет всегда НИЗКИМ, тогда как 320 означает всегда ВЫСОКИЙ. Регулярное числоanalogWrite()
должно почти работать, но оно будет интерпретировать 255 так же, как 320 (то есть всегда ВЫСОКОЕ).Этот код предполагает использование Arduino Uno или аналогичной платы (ATmega168 или 328 @ 16 МГц). Используемый здесь метод требует 16-битного таймера, и, таким образом, он использует таймер 1, поскольку это единственный доступный на Uno; поэтому доступны только два выхода. Метод может быть адаптирован для других плат на базе AVR с 16-битным таймером. Как отметил Гербен, этот таймер должен иметь соответствующий регистр ICRx. На Arduino Mega есть 4 таких таймера, каждый с 3 выходами.
источник
ICRx
регистра. Самое большее, вы можете иметь только один вывод ШИМ на таймер для таймеров 0 и 2.COM4C1
вTCCR4A
? 2. Если это не проблема, тогда прочитайте Как мне задать хороший вопрос? затем обновите свой вопрос , включив полный исходный код и четко указав, что вы ожидаете от программы и что она делает вместо этого («я не вижу успеха» не считается действительным заявлением о проблеме).