Kurzimpuls-Erzeugung mit Arduino Uno Teil 2: GPIO-Register-Zugriff Impulsbreite

Wenn Sie den folgenden Code verwenden, um digitale Impulse mit dem Arduino Uno zu erzeugen (cli() und sei() um Interrupts zu deaktivieren und zu aktivieren, um eine konsistente Impulsbreite zu gewährleisten), können Sie die kürzestmöglichen Impulse erzeugen, begrenzt durch die 16MHz Taktfrequenz des Atmega328p:

gpio_pulse.ino
#define PORT11 PORTB
#define PIN11 3
#define PIN11_MASK (1 << PIN11)


void loop() {
    cli(); // Disable interrupts
    PORT11 |= PIN11_MASK; // Turn pin 11 on
    PORT11 &= ~PIN11_MASK; // Turn pin 11 off
    sei(); // Enable interrupts again

    delay(10); // Wait 10ms
}

Basierend auf der 16 MHz Taktfrequenz des ATMega328p erzeugt dies Impulse von fast genau 125ns Länge. Dies entspricht zwei Taktkreisen des 16 MHz-Master-Takts.

Oszilloskop-Spur zeigt 125-Nanosekunden-Impuls, erzeugt durch Arduino Uno direkten GPIO-Register-Zugriff

Vollständiges Beispiel

full_example.ino
#include <Arduino.h>
#include <avr/io.h>

#define PORT11 PORTB
#define PIN11 3
#define PIN11_MASK (1 << PIN11)

void setup() {
    pinMode(11, OUTPUT);
}

void loop() {
    cli();
    PORT11 |= PIN11_MASK;
    PORT11 &= ~PIN11_MASK;
    sei();

    delay(10);
}

Check out similar posts by category: Arduino, Electronics