Максимальная частота цифрового сигнала в Arduino Uno?

Поскольку Arduino Uno имеет генератор 16 МГц, но при запуске программы он имеет меньшую частоту, потому что для запуска программы используется часть вычислительной мощности. Я использовал задержку(1), но она дает мне около 500 Гц.

Мои вопросы:

  1. Есть ли какой-либо способ достичь частоты более 500 Гц?
  2. Какова будет максимальная частота цифрового сигнала для приведенной ниже программы?
void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);          
  digitalWrite(13, LOW);         
}

, 👍4

Обсуждение

обратите внимание, что digitalWrite работает относительно медленно. Кроме того, обертывание всего внутри a while(true){...} сделает это немного быстрее, вместо того, чтобы позволить функции цикла выйти., @Gerben


3 ответа


Лучший ответ:

9
  1. Да, используйте аппаратные таймеры.

  2. Вы можете достичь 8 МГц.

Пример скетча, который выводит 8 МГц на вывод 9 на Uno:

#ifdef __AVR_ATmega2560__
  const byte CLOCKOUT = 11;  // Mega 2560
#else
  const byte CLOCKOUT = 9;   // Uno, Duemilanove, etc.
#endif

void setup ()
  {
  // set up 8 MHz timer on CLOCKOUT (OC1A)
  pinMode (CLOCKOUT, OUTPUT); 
  // set up Timer 1
  TCCR1A = bit (COM1A0);  // toggle OC1A on Compare Match
  TCCR1B = bit (WGM12) | bit (CS10);   // CTC, no prescaling
  OCR1A =  0;       // output every cycle
  }  // end of setup

void loop ()
  {
  // whatever 
  }  // end of loop

Если вы измените OCR1A, вы можете получить более низкие частоты. Если вы измените прескалер, вы снова сможете получить более низкие частоты.

Смотрите мою страницу о таймерах для получения более подробной информации.

,

Ниже я поместил форму сигнала осциллографа из вашего кода. Спасибо!, @Lukas Kock


2

Кроме того, не забывайте, что существуют альтернативные методы переключения выходов.

Вы можете использовать ПОРТЫ для выполнения этой работы.

Вот хороший пример. И еще один здесь.

И этот код является идеей, лежащей в его основе:

void setup()
{
  DDRD = B11111111; // set PORTD (digital 7~0) to outputs
}

void loop()
{
  PORTD = B11111111; // set PORTD pins (digital 7~0) high
  PORTD = B00000000; // set PORTD pins (digital 7~0) low
}

P.S. Не забывайте, что нумерация портов относится к выводам чипа, а не к выводам/ножкам Arduino.

,

2

Код Ника Гэммона отлично сработал для меня. Вот изображение осциллографа формы сигнала, которое я получил из его кода:

Output of Arduino UNO pin 9, approximately 1 V peak-to-peak Amplitude with spikes

Его приведенный выше код (от Ника Гэммона, 25 января 16 года в 20:33) отлично сработал для меня. Я использовал его код на Arduino UNO и получил выходную частоту около 7,9 МГц с амплитудой примерно 1 В (от пика к пику, с шипами, увеличивающими амплитуду от пика к пику примерно до 2 В).

Изображение выше было получено с помощью моего осциллографа 40 МГц от ICEL Manaus (производитель) на выводе 9 (я использовал Arduino UNO), со светодиодом и резистором в качестве нагрузки на выводе 9:

  • зеленый светодиод с падением напряжения около 1,79 В
  • и резистор 4,7 Ом с допуском 5%

Датчик осциллографа (канал 2, с обнаружением триггера наклона падения) находится на резисторе 4,7 Ом. Это следует порядку подключения из вывода 9 от Arduino UNO: ВЫВОД 9 > >зеленый светодиод > >Резистор 4,7 Ом > >ЗЕМЛЯ.

Зеленый светодиод продолжает мигать при нормальном свечении по сравнению с использованием на других выходных частотах.

Я использовал внешний источник питания постоянного тока 5 В вместе с USB-соединением на своем компьютере.

Если у вас есть какие-либо вопросы, просто задайте их здесь. Спасибо и спасибо Нику Гэммону

,

Рад, что это сработало для вас! Небольшое расхождение в частоте может быть объяснено тем фактом, что Uno имеет резонатор, а не кристалл в качестве источника частоты для основного процессора., @Nick Gammon