You can use block language to do an easy capable design with Nano board (xtal controls
timing accuracy to within ~ < .1%) or use an ATTINY85 8 pin AVR using internal osc which is
+/- 1% accurate user cal.
Fooling around with mBlock, here is a sequence of pulses easily coded (gui Scratch
like language, mBlock, drag and drop and configure, code then auto generated based
on blocks used and variable settings).
Reliably create fairly accurate pulses down to 1 mS, into years as well, and sequences,
repeating sequences, pulses depending on a V reading and/or triggers like external trigger.
With not only programmable width but inter-programmable delay.
Here the code created 5 pulses of varying widths and inter-pulse delays. Could have made
some/all of the pulses in this example triggered by conditionals, like a V or a T or incoming
pulse width or.......
Here is mBlock IDE, code automatically generated, shown in right hand window. Running on Arduino
UNO. I think I can squeeze this into an ATTINY as well.
Very complex sequences trivial to create, accurate (Arduino has xtal on board).
Note embedded triggers can be put in, like a voltage in a range or exceeding a
value. Or that AND a counter overflow, whatever. mBlock is free, Arduino UNO
or NANO < $ 5, easy to get started.
If instead of mBlock you use Snap4Arduino you can display interrogated Arduino
stuff like V measured or PWM / counter values on PC w/o having to write Python
for example.
Using ATTINY85 solution would look like this. Note I did nopt debounce switch in code,
you can easily do that but your delays effectively obviate need for this as solution
used "blocking" code, so bounce is long dissipated in delay time to set PW.
Note I forgot but could have eliminated need for pullup R by configuring the pin properly with its
input R pullup, juts forgot.
Note resetting thru another button, or the one button pressed twice quickly, or power cycling all
trivial.
Lastly pulses can come out on individual pin or all on same pin or a mix....
Regards, Dana.