Нужен сигнал ШИМ частотой 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()
  {
  }

, 👍-2

Обсуждение

Что мне делать? ... использовать инвертор, @jsotola

В режиме быстрого ШИМ на таймере 2 контакт 11 использовать нельзя. Только контакт 3. См.: https://forum.arduino.cc/t/atmega328p-timer2-fastpwm-mode/499500. Если вам нужен инверсный контакт 3, то можно использовать простой инвертор (скажем, транзистор), как предложил @jsotola., @6v6gt

а какая у тебя ардуино?, @Juraj

Я использую ардуино ООН, @Pranav Pillai


1 ответ


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