>1мгц на цифровом выходе

stasonchi
Offline
Зарегистрирован: 10.01.2012

Доброе время суток!)

Интересуют возможности ардуино, а именно насколько высокую частоту можно получить на цифровом выходе? Есть потребность в частотах 900кГц-1100кГц. реально ли такое воспроизвести? Иными словами насколько быстро можно чередовать digitalWrite(pin,HIGH)/digitalWrite(pin,LOW). Если не ардуино то может что посоветуете?

И вот такой нюанс. Допустим если писать программу без всяких таймеров и без всяких функций типа tone(), а просто чередовать вызовы DigitalWrite():

DigitalWrite(pin,HIGH); DigitalWrite(pin,LOW); DigitalWrite(pin,HIGH); DigitalWrite(pin,LOW);

Как ведёт себя ардуино в такой ситуации? Частота сигнала на пине будет зависить от тактовой частоты контроллера?

Или если к примеру я буду чередовать как-то так:

DigitalWrite(pin,HIGH); DigitalWrite(pin,HIGH); DigitalWrite(pin,LOW); DigitalWrite(pin,HIGH); DigitalWrite(pin,HIGH); DigitalWrite(pin,LOW);

изменится ли в этом случае модуляция, т.е. 2 ед.времени HIGH и 1 ед.времени LOW?

Спасибо.

ourlive
Offline
Зарегистрирован: 26.05.2012

период в 16мкс (т.е. 8 мкс HIGH, 8мкс LOW) я точно получал, и на осцилографе всё было красиво. Но это при 20ти строках кода, контроллер считай на холостом ходу... мегагерци только через умножитель добыть удастся, или с помощью внешнего генератора управляемого цифрой или напряжением

step962
Offline
Зарегистрирован: 23.05.2011

 При использовании чистого digitalRead()/digitalWrite() удается получить 10000 периодов за 82 мсек, т.е. частоту около 122 кГц.

void TestDRW() {
  unsigned int i;
  unsigned long t1,t2;
  Serial.println("=== Testing read/write ===");
  Serial.print("before:");
  t1 = millis();
  Serial.println(t1);
  for(i=0;i<50000;i++) {
    digitalWrite(13,HIGH);
    digitalWrite(13,LOW);
  }
  t2 = millis();
  Serial.print("after:");
  Serial.println(t2);
  Serial.print("50000 cycles per ");
  Serial.print((t2-t1));
  Serial.println(" msec");
  Serial.print("10000 cycles per ");
  Serial.print((t2-t1)/5);
  Serial.println(" msec");
}

Переход чуть ближе к железу, а именно непосредственная запись в порт позволяет увеличить скорость примерно в 10 раз и добиться частоты ок 1,25 МГц:

void TestPB5() {
  unsigned int i;
  unsigned long t1,t2;
  Serial.println("=== Testing PB5 ===");
  Serial.print("before:");
  t1 = millis();
  Serial.println(t1);
  for(i=0;i<50000;i++) {
    //digitalWrite(13,HIGH);
    //digitalWrite(13,LOW);
    PORTB &= ~(0x10);
    PORTB |= 0x10;
  }
  t2 = millis();
  Serial.print("after:");
  Serial.println(t2);
  Serial.print("50000 cycles per ");
  Serial.print((t2-t1));
  Serial.println(" msec");
  Serial.print("10000 cycles per ");
  Serial.print((t2-t1)/5);
  Serial.println(" msec");
}

Ну а если использовать ассемблерную вставку, то теоретически можно поднять частоту генерируемого сигнала до 2 МГц.

Все вышенаписанное относится к мк, работающему на частоте 16 МГц.

 

=== Testing read/write ===
before:33
after:443
50000 cycles per 410 msec
10000 cycles per 82 msec
=== Testing PB5 ===
before:537
after:577
50000 cycles per 40 msec
10000 cycles per 8 msec
 

stasonchi
Offline
Зарегистрирован: 10.01.2012

благодарю за ответы!;)