Нужен сигнал ШИМ частотой 10 кГц от контактов 3 и 11 с использованием таймера 2.
Работа контакта 11 должна быть инверсной по отношению к контакту 3. Я использовал цифровое чтение и цифровую запись, а также простой, если еще. Но задержка составляет 10 мкс. Что мне делать?
Я нашел этот код на форуме, но он имеет форму таймера 1. Он мне нужен для таймера 2.
void setup()
{
// Определение PB1 и PB2 как выходов путем установки PORTB1 и PORTB2
// Установка DDB1 и DDB2
DDRB |= bit (DDB1) | bit (DDB2);
// остановка таймера 1
TCCR1A = 0;
TCCR1B = 0;
TCCR1A = bit (COM1B0) | bit (COM1B1) // Устанавливаем OC1B при сравнении, очищаем
// OC1B внизу (режим инвертирования)
| bit (COM1A1) // Очистить OC1A при сравнении, установить
// OC1A внизу (неинвертирующий режим)
| bit (WGM11); // Быстрый ШИМ, максимум на ICR1
TCCR1B = bit (WGM12) | bit (WGM13) // то же самое
| bit (CS11); // Запускаем таймер, прескалер 8
// Инициализируем OCR1A = 300 (pulse_width = 150 мкс), OCR1B и ICR1
ICR1 = 0xFFFF;
OCR1B = 299;
OCR1A = ICR1 - OCR1B;
} // конец настройки
void loop()
{
}
@Pranav Pillai, 👍-2
Обсуждение1 ответ
Вы не сможете сделать это с Таймером 2 без внешнего оборудования. Этот код будет генерировать сигнал частотой 10 кГц на выводе 3, однако для этого он использует оба регистра таймера:
- OCR2A используется для установки периода (т. е. частоты)
- OCR2B используется для установки рабочего цикла.
const byte OUTPUT_PIN = 3; // Таймер 2 "B" выход: OC2B
const byte n = 199; // 10 кГц
void setup()
{
pinMode (OUTPUT_PIN, OUTPUT);
TCCR2A = bit (WGM20) | bit (WGM21) | bit (COM2B1); // быстрый ШИМ, очистка OC2A при сравнении
TCCR2B = bit (WGM22) | bit (CS21); // быстрый ШИМ, прескалер 8
OCR2A = n; // период
OCR2B = ((n + 1) / 2) - 1; // рабочий цикл 50%
} // конец настройки
void loop() { }
Обратите внимание, что сигнал с коэффициентом заполнения 50% может генерироваться в режиме CTC, при этом выходы настроены на «переключение на совпадение сравнения»., @Edgar Bonet
и вот, для полноты картины, NPN-транзистор, настроенный как инвертор (НЕ затвор) https://www.tutorialspoint.com/build-an-inverter-with-a-transistor, @6v6gt
@EdgarBonet Я некоторое время пытался получить инвертированный сигнал в различных режимах, но безуспешно., @Nick Gammon
Вы пытались написать бит «Принудительное сравнение вывода»?, @Edgar Bonet
- Как прочитать направление таймера в фазе правильного ШИМ?
- Использовать timer0, не влияя на millis() и micros().
- Можно ли сгенерировать точный тактовый импульс 15 кГц с помощью ардуино?
- Генерация сигнала частотой 38 кГц без таймеров
- Светодиод Arduino PWM с замиранием в сборке
- Отрегулируйте расчет времени после изменения частоты Timer0
- Как измерить ультразвуковой датчик без импульсного метода?
- Seeeduino СЯО запись и чтение ШИМ продолжительность (период) с помощью таймеров
Что мне делать?
... использовать инвертор, @jsotolaВ режиме быстрого ШИМ на таймере 2 контакт 11 использовать нельзя. Только контакт 3. См.: https://forum.arduino.cc/t/atmega328p-timer2-fastpwm-mode/499500. Если вам нужен инверсный контакт 3, то можно использовать простой инвертор (скажем, транзистор), как предложил @jsotola., @6v6gt
а какая у тебя ардуино?, @Juraj
Я использую ардуино ООН, @Pranav Pillai