Generates TRIAC control pulse for soft start of motors used in circular saw, angle grinder and other DIY tools.


The eagle files are here.
LOAD_ON_OFF_DETECTION is enabled) to detect power disconnect. In this case the current is limited to 2 A (~ 450 W) if you using 1N4004 diodes. For more power you may use 1N5004 instead and/or use 2 diodes in parallel.START_PHASE_SHIFT_DEGREES to 0 degree at every voltage zero crossing.
The decrease amount is specified by the ramp speed trimmer, i.e. a voltage at pin 2.Calibration mode is entered, when the ADC value from the ramp speed trimmer is less than 4.
This mode outputs the timer counter value forever (at 115200 Baud (@1MHZ) at pin 6 / PB1) in order to adjust the 50% duty cycle trimmer.
Both values must be the same.
The output format is: <counterForPositiveHalfWave>|<counterForNegativeHalfWave>n
You have to use an isolation transformer to safely read this value.
I have not yet tested it, but using two 1 MΩ resistors instead of the ramp speed trimmer should work too.
FUSE VALUES for embedded version, which requires fast start, since soft start must begin as soon as power is on.
FUSE VALUES for plug in soft start adapter, i.e. LOAD_ON_OFF_DETECTION is defined, which means that CPU power is always on.
You may use the default values or enable additional Brown-out detection eg. at 4.3 volt.
To customize the software to different requirements, there are some compile options / macros available.
Modify it by commenting them out or in, or change the values if applicable. Or define the macro with the -D compiler option for global compile (the latter is not possible with the Arduino IDE, so consider using Sloeber.
| Name | Default value | File | Description |
|---|---|---|---|
LOAD_ON_OFF_DETECTION |
enabled | SoftStart.cpp | If enabled, the program does not start with ramp at boot up time, but waits for interrupt at LoadDetectionInput (pin 6). This is useful, if you want to build an plug in soft start adapter. It only starts working when the attached device is switched on, e.g. a load is detected. |
START_PHASE_SHIFT_DEGREES |
160 | TRIACRamp.h | Initial delay of TRIAC trigger impulse. Values from 0 - 180 degrees, but the extremes make no sense. |
TRIAC_PULSE_WIDTH_MICROS |
250 | TRIACRamp.h | Length of trigger pulse - 100 us is too small for my circuit. |
TRIAC_PULSE_NUMBERS |
250 | TRIACRamp.h | Amount of multiple trigger pulses if delay is less than total time of multiple pulses. This avoids flickering at small loads. |
TRIAC_PULSE_BREAK_MICROS |
400 | TRIACRamp.h | Length of break between (multiple) trigger pulses. |
First, use Sketch > Show Sketch Folder (Ctrl+K).
If you have not yet saved the example as your own sketch, then you are instantly in the right library folder.
Otherwise you have to navigate to the parallel libraries folder and select the library you want to access.
In both cases the library source and include files are located in the libraries src directory.
The modification must be renewed for each new library version!
If you are using Sloeber as your IDE, you can easily define global symbols with Properties > Arduino > CompileOptions.

![]() |
![]() |
| ATtiny85 board | Triac and heat sink |
![]() |
![]() |
| Placement with 100 nF and selfmade coil | Placement with 200 nF |
![]() |
![]() |
| Before | After with 100 nF (It runs for 6 years now) |