Генерация TTL-сигнала

Я хотел бы сгенерировать TTL-сигнал с помощью Arduino.

Насколько я понимаю, TTL-сигнал — это просто заранее заданный управляемый сигнал, который повторяется через определенный интервал (например, 2 мкс).

Схема Arduino, возможно, имеет очень быструю тактовую частоту (например, 16 МГц), поэтому я подумал, что могу просто нарисовать прямоугольный сигнал с любым желаемым интервалом (важно, чтобы он был с точностью до микросекунды).

Я использовал следующий код, выбрав контакт и изменив состояние его сигнала между 0 и 1, а затем используя Serial.println для вывода сигнала. Все находится внутри цикла while, который рассчитывает время создания всего в течение 1 секунды.

#include <arduino-timer.h>

// Переменные
unsigned long v = -1;
int freq = 100.0; // Гц
unsigned long d = floor(1.0/freq*1000000.0) ; // нас
Timer<1, micros> timer; // создаем таймер с 1 задачей и разрешением в микросекундах

void setup() {
  unsigned long repeatEvery = 5000000; // Микросекунды
  Serial.begin(9600);
  pinMode(3, OUTPUT);
  timer.every(repeatEvery, func1); // XXXXX микросекунд
}

void func1() {
  unsigned long uSec = 1000000; // Микросекунды (= 1 секунда)

  PORTD = B00000000;
  v = digitalRead(3);
    
  unsigned long counter = 0, i = 0;

  auto currentTime = micros();
  auto prevTime = currentTime;
  d = 0; // без задержки для проверки скорости выполнения

  do {
    PORTD = B00001000;
    v = digitalRead(3);
    // Serial.println(v);
    PORTD = B00001000;
    v = digitalRead(3);
    // Serial.println(v);
    delayMicroseconds(d); // первый кадр

    PORTD = B00000000;
    v = digitalRead(3);
    // Serial.println(v);
    PORTD = B00000000;
    v = digitalRead(3);
    // Serial.println(v);
    delayMicroseconds(d); // второй кадр
      
    currentTime = micros();
    i = (unsigned long)(currentTime - prevTime);
    counter++;
  } while(i < uSec);
  
  Serial.print(">>>Counter:");
  Serial.println(counter);
  Serial.print(">>>delay (ms):");
  Serial.println(d);
}

void loop() {
  timer.tick();
}

Приведенный выше код выдаст результат в виде counter = 47620 // сколько раз были повторены инструкции и если строки Serial.println были раскомментированы для рисования сигнала, время выполнения замедляется до counter = 86

Я не уверен, что весь ход мыслей ошибочен, и мне следует сделать что-то другое или использовать другую схему.

Будем очень признательны за любые подсказки и помощь.

PS: кстати, мой Arduino — это UNIROI, который должен быть таким же, как Arduino R3.

, 👍-1

Обсуждение

Описание вашего кода затрудняет его понимание. Не могли бы вы вместо этого просто опубликовать код?, @Greenonline

«Сигнал TTL — это просто заранее заданный управляемый сигнал, который повторяется с определенным интервалом»… нет TTL — это логический уровень, который равен 5 В при высоком уровне и 0 В при низком уровне… он не обязательно повторяется… он может легко всегда быть высоким, @jsotola


1 ответ


1

Модули 1u/2us довольно быстрые — у вас есть 16 или 32 командных цикла при 16 МГц.

И теперь у вас есть digitalRead, который обычно занимает около 70 циклов команд (несколько раз), после чего 32b арифметики (сотни инструкций).

Когда вы раскомментируете Serial.printlns, который начинает блокироваться после заполнения внутреннего буфера, плюс вы даже используете скорость 9600 бод (максимальная скорость 960 символов в секунду), каждый println означает 3 символа, и он встречается 4 раза -> 960/12 = около 80 петель в секунду. Вы видите закономерность?

Единственный способ генерировать сигналы без джиттера — это таймеры (вероятно, быстрый ШИМ с прескалером = 1 и максимальным значением в соответствии с желаемым периодом).

,

Я уже вижу проблему, да, и спасибо за ответ. Дело в том, что я пока не слишком знаком со всеми этими электронными схемами (инструкциями). Поэтому я был бы признателен за ссылку или более подробную информацию, которая могла бы помочь мне на правильном пути., @wisdom

Это будет «Руководство по набору инструкций AVR», однако для настройки таймера более интересна «таблица данных Atmega328p»., @KIIV

Я поищу это, спасибо за подсказку, @wisdom