Dynamic short pulse generator using Arduino Mega2560 with serial control
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);
}