This is a simplified version of our hybrid static/dynamic pulse generator. On the Arduino Mega2560 platform, it allows generating pulses from 750ns
up to almost arbitrary lengths (limited only by the integer width) with a resolution of approx. 437.5ns
In order to control the pulse width, open a serial interface and type +
to increase the pulse width or -
to decrease the pulse width.
#include <Arduino.h> #include <avr/io.h> #include <ArduinoJson.h> const int pulseAPin = 11; #define PORT11 PORTB #define PIN11 5 #define PIN11_MASK (1 << PIN11) int pulseLength = 0; /** * Pulse the output pin, for very short pulses. */ void PulseDynamic(int n) { cli(); PORT11 |= PIN11_MASK; // Dynamic for loop for (;n >= 0; n--) { _NOP(); } PORT11 &= ~PIN11_MASK; sei(); } void setup() { Serial.begin(115200); Serial.setTimeout(25); pinMode(pulseAPin, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); } void loop() { PulseDynamic(pulseLength); // Process serial while(Serial.available() > 0) { int c = Serial.read(); if(c == '+') { pulseLength++; Serial.println(pulseLength); } else if(c == '-') { pulseLength--; if(pulseLength < 0) {pulseLength = 0;} Serial.println(pulseLength); } } delay(50); }