>1мгц на цифровом выходе
- Войдите на сайт для отправки комментариев
Доброе время суток!)
Интересуют возможности ардуино, а именно насколько высокую частоту можно получить на цифровом выходе? Есть потребность в частотах 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?
Спасибо.
период в 16мкс (т.е. 8 мкс HIGH, 8мкс LOW) я точно получал, и на осцилографе всё было красиво. Но это при 20ти строках кода, контроллер считай на холостом ходу... мегагерци только через умножитель добыть удастся, или с помощью внешнего генератора управляемого цифрой или напряжением
При использовании чистого 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
благодарю за ответы!;)