Summary
This experiment investigates pcb solder reflow profile. Fractional factorial screening of 5 reflow profile parameters for joint strength and void percentage, designed for later augmentation with star points.
The design varies 5 factors: preheat temp (C), ranging from 150 to 200, soak time (s), ranging from 60 to 120, peak temp (C), ranging from 230 to 260, time above liquidus (s), ranging from 30 to 90, and cooling rate (C/s), ranging from 1 to 4. The goal is to optimize 2 responses: joint strength (N) (maximize) and void percentage (%) (minimize). Fixed conditions held constant across all runs include solder paste = SAC305, board layers = 4.
A fractional factorial design reduces the number of runs from 32 to 8 by deliberately confounding higher-order interactions. This is ideal for screening — identifying which of the 5 factors matter most before investing in a full study.
Key Findings
For joint strength, the most influential factors were cooling rate (38.3%), preheat temp (37.2%), time above liquidus (13.8%). The best observed value was 54.3 (at preheat temp = 200, soak time = 120, peak temp = 230).
For void percentage, the most influential factors were time above liquidus (34.5%), cooling rate (26.3%), peak temp (23.3%). The best observed value was 2.16 (at preheat temp = 150, soak time = 60, peak temp = 230).
Recommended Next Steps
- Follow up with a response surface design (CCD or Box-Behnken) on the top 3–4 factors to model curvature and find the true optimum.
- Consider whether any fixed factors should be varied in a future study.
- The screening results can guide factor reduction — drop factors contributing less than 5% and re-run with a smaller, more focused design.
Experimental Setup
Factors
| Factor | Low | High | Unit |
preheat_temp | 150 | 200 | C |
soak_time | 60 | 120 | s |
peak_temp | 230 | 260 | C |
time_above_liquidus | 30 | 90 | s |
cooling_rate | 1 | 4 | C/s |
Fixed: solder_paste = SAC305, board_layers = 4
Responses
| Response | Direction | Unit |
joint_strength | ↑ maximize | N |
void_percentage | ↓ minimize | % |
Configuration
{
"metadata": {
"name": "PCB Solder Reflow Profile",
"description": "Fractional factorial screening of 5 reflow profile parameters for joint strength and void percentage, designed for later augmentation with star points"
},
"factors": [
{
"name": "preheat_temp",
"levels": [
"150",
"200"
],
"type": "continuous",
"unit": "C"
},
{
"name": "soak_time",
"levels": [
"60",
"120"
],
"type": "continuous",
"unit": "s"
},
{
"name": "peak_temp",
"levels": [
"230",
"260"
],
"type": "continuous",
"unit": "C"
},
{
"name": "time_above_liquidus",
"levels": [
"30",
"90"
],
"type": "continuous",
"unit": "s"
},
{
"name": "cooling_rate",
"levels": [
"1",
"4"
],
"type": "continuous",
"unit": "C/s"
}
],
"fixed_factors": {
"solder_paste": "SAC305",
"board_layers": "4"
},
"responses": [
{
"name": "joint_strength",
"optimize": "maximize",
"unit": "N"
},
{
"name": "void_percentage",
"optimize": "minimize",
"unit": "%"
}
],
"settings": {
"operation": "fractional_factorial",
"test_script": "use_cases/308_pcb_solder_reflow/sim.sh"
}
}
Experimental Matrix
The Fractional Factorial Design produces 8 runs. Each row is one experiment with specific factor settings.
| Run | preheat_temp | soak_time | peak_temp | time_above_liquidus | cooling_rate |
| 1 | 150 | 120 | 260 | 30 | 1 |
| 2 | 200 | 60 | 230 | 30 | 1 |
| 3 | 200 | 120 | 230 | 90 | 1 |
| 4 | 200 | 120 | 260 | 90 | 4 |
| 5 | 150 | 120 | 230 | 30 | 4 |
| 6 | 200 | 60 | 260 | 30 | 4 |
| 7 | 150 | 60 | 230 | 90 | 4 |
| 8 | 150 | 60 | 260 | 90 | 1 |
Step-by-Step Workflow
1
Preview the design
$ doe info --config use_cases/308_pcb_solder_reflow/config.json
2
Generate the runner script
$ doe generate --config use_cases/308_pcb_solder_reflow/config.json \
--output use_cases/308_pcb_solder_reflow/results/run.sh --seed 42
3
Execute the experiments
$ bash use_cases/308_pcb_solder_reflow/results/run.sh
4
Analyze results
$ doe analyze --config use_cases/308_pcb_solder_reflow/config.json
5
Get optimization recommendations
$ doe optimize --config use_cases/308_pcb_solder_reflow/config.json
6
Multi-objective optimization
With 2 competing responses, use --multi to find the best compromise via Derringer–Suich desirability.
$ doe optimize --config use_cases/308_pcb_solder_reflow/config.json --multi
7
Generate the HTML report
$ doe report --config use_cases/308_pcb_solder_reflow/config.json \
--output use_cases/308_pcb_solder_reflow/results/report.html
Features Exercised
| Feature | Value |
| Design type | fractional_factorial |
| Factor types | continuous (all 5) |
| Arg style | double-dash |
| Responses | 2 (joint_strength ↑, void_percentage ↓) |
| Total runs | 8 |
Analysis Results
Generated from actual experiment runs using the DOE Helper Tool.
Response: joint_strength
Top factors: cooling_rate (38.3%), preheat_temp (37.2%), time_above_liquidus (13.8%).
ANOVA
| Source | DF | SS | MS | F | p-value |
| Source | DF | SS | MS | F | p-value |
| preheat_temp | 1 | 91.1250 | 91.1250 | 2.344 | 0.1863 |
| soak_time | 1 | 2.4200 | 2.4200 | 0.062 | 0.8129 |
| peak_temp | 1 | 1.4450 | 1.4450 | 0.037 | 0.8547 |
| time_above_liquidus | 1 | 12.5000 | 12.5000 | 0.322 | 0.5952 |
| cooling_rate | 1 | 96.6050 | 96.6050 | 2.485 | 0.1758 |
| preheat_temp*soak_time | 1 | 12.5000 | 12.5000 | 0.322 | 0.5952 |
| preheat_temp*peak_temp | 1 | 96.6050 | 96.6050 | 2.485 | 0.1758 |
| preheat_temp*time_above_liquidus | 1 | 2.4200 | 2.4200 | 0.062 | 0.8129 |
| preheat_temp*cooling_rate | 1 | 1.4450 | 1.4450 | 0.037 | 0.8547 |
| soak_time*peak_temp | 1 | 25.9200 | 25.9200 | 0.667 | 0.4513 |
| soak_time*time_above_liquidus | 1 | 91.1250 | 91.1250 | 2.344 | 0.1863 |
| soak_time*cooling_rate | 1 | 242.0000 | 242.0000 | 6.224 | 0.0548 |
| peak_temp*time_above_liquidus | 1 | 242.0000 | 242.0000 | 6.224 | 0.0548 |
| peak_temp*cooling_rate | 1 | 91.1250 | 91.1250 | 2.344 | 0.1863 |
| time_above_liquidus*cooling_rate | 1 | 25.9200 | 25.9200 | 0.667 | 0.4513 |
| Error | (Lenth | PSE) | 5 | 194.4000 | 38.8800 |
| Total | 7 | 472.0150 | 67.4307 | | |
Response: void_percentage
Top factors: time_above_liquidus (34.5%), cooling_rate (26.3%), peak_temp (23.3%).
ANOVA
| Source | DF | SS | MS | F | p-value |
| Source | DF | SS | MS | F | p-value |
| preheat_temp | 1 | 0.3828 | 0.3828 | 0.667 | 0.4513 |
| soak_time | 1 | 3.8781 | 3.8781 | 6.754 | 0.0483 |
| peak_temp | 1 | 14.3916 | 14.3916 | 25.063 | 0.0041 |
| time_above_liquidus | 1 | 31.5615 | 31.5615 | 54.964 | 0.0007 |
| cooling_rate | 1 | 18.2710 | 18.2710 | 31.819 | 0.0024 |
| preheat_temp*soak_time | 1 | 31.5615 | 31.5615 | 54.964 | 0.0007 |
| preheat_temp*peak_temp | 1 | 18.2710 | 18.2710 | 31.819 | 0.0024 |
| preheat_temp*time_above_liquidus | 1 | 3.8781 | 3.8781 | 6.754 | 0.0483 |
| preheat_temp*cooling_rate | 1 | 14.3916 | 14.3916 | 25.063 | 0.0041 |
| soak_time*peak_temp | 1 | 0.0325 | 0.0325 | 0.057 | 0.8214 |
| soak_time*time_above_liquidus | 1 | 0.3828 | 0.3828 | 0.667 | 0.4513 |
| soak_time*cooling_rate | 1 | 0.0325 | 0.0325 | 0.057 | 0.8214 |
| peak_temp*time_above_liquidus | 1 | 0.0325 | 0.0325 | 0.057 | 0.8214 |
| peak_temp*cooling_rate | 1 | 0.3828 | 0.3828 | 0.667 | 0.4513 |
| time_above_liquidus*cooling_rate | 1 | 0.0325 | 0.0325 | 0.057 | 0.8214 |
| Error | (Lenth | PSE) | 5 | 2.8711 | 0.5742 |
| Total | 7 | 68.5501 | 9.7929 | | |
Multi-Objective Optimization
When responses compete, Derringer–Suich desirability finds the best compromise.
Each response is scaled to a 0–1 desirability, then combined via a weighted geometric mean.
Overall Desirability
D = 0.8478
Per-Response Desirability
| Response | Weight | Desirability | Predicted | Dir |
joint_strength |
2.0 |
|
50.50 0.7989 50.50 N |
↑ |
void_percentage |
1.0 |
|
2.16 0.9545 2.16 % |
↓ |
Recommended Settings
| Factor | Value |
preheat_temp | 150 C |
soak_time | 60 s |
peak_temp | 230 C |
time_above_liquidus | 90 s |
cooling_rate | 4 C/s |
Source: from observed run #1
Trade-off Summary
Sacrifice = how much worse than single-objective best.
| Response | Predicted | Best Observed | Sacrifice |
void_percentage | 2.16 | 2.16 | +0.00 |
Top 3 Runs by Desirability
| Run | D | Factor Settings |
| #8 | 0.7705 | preheat_temp=200, soak_time=60, peak_temp=260, time_above_liquidus=30, cooling_rate=4 |
| #4 | 0.7659 | preheat_temp=200, soak_time=120, peak_temp=230, time_above_liquidus=90, cooling_rate=1 |
Model Quality
| Response | R² | Type |
void_percentage | 0.7060 | linear |
Full Multi-Objective Output
============================================================
MULTI-OBJECTIVE OPTIMIZATION
Method: Derringer-Suich Desirability Function
============================================================
Overall desirability: D = 0.8478
Response Weight Desirability Predicted Direction
---------------------------------------------------------------------
joint_strength 2.0 0.7989 50.50 N ↑
void_percentage 1.0 0.9545 2.16 % ↓
Recommended settings:
preheat_temp = 150 C
soak_time = 60 s
peak_temp = 230 C
time_above_liquidus = 90 s
cooling_rate = 4 C/s
(from observed run #1)
Trade-off summary:
joint_strength: 50.50 (best observed: 54.30, sacrifice: +3.80)
void_percentage: 2.16 (best observed: 2.16, sacrifice: +0.00)
Model quality:
joint_strength: R² = 0.4634 (linear)
void_percentage: R² = 0.7060 (linear)
Top 3 observed runs by overall desirability:
1. Run #1 (D=0.8478): preheat_temp=150, soak_time=60, peak_temp=230, time_above_liquidus=90, cooling_rate=4
2. Run #8 (D=0.7705): preheat_temp=200, soak_time=60, peak_temp=260, time_above_liquidus=30, cooling_rate=4
3. Run #4 (D=0.7659): preheat_temp=200, soak_time=120, peak_temp=230, time_above_liquidus=90, cooling_rate=1
Full Analysis Output
=== Main Effects: joint_strength ===
Factor Effect Std Error % Contribution
--------------------------------------------------------------
cooling_rate 6.9500 2.9032 38.3%
preheat_temp -6.7500 2.9032 37.2%
time_above_liquidus -2.5000 2.9032 13.8%
soak_time -1.1000 2.9032 6.1%
peak_temp -0.8500 2.9032 4.7%
=== ANOVA Table: joint_strength ===
Source DF SS MS F p-value
-----------------------------------------------------------------------------
preheat_temp 1 91.1250 91.1250 2.344 0.1863
soak_time 1 2.4200 2.4200 0.062 0.8129
peak_temp 1 1.4450 1.4450 0.037 0.8547
time_above_liquidus 1 12.5000 12.5000 0.322 0.5952
cooling_rate 1 96.6050 96.6050 2.485 0.1758
preheat_temp*soak_time 1 12.5000 12.5000 0.322 0.5952
preheat_temp*peak_temp 1 96.6050 96.6050 2.485 0.1758
preheat_temp*time_above_liquidus 1 2.4200 2.4200 0.062 0.8129
preheat_temp*cooling_rate 1 1.4450 1.4450 0.037 0.8547
soak_time*peak_temp 1 25.9200 25.9200 0.667 0.4513
soak_time*time_above_liquidus 1 91.1250 91.1250 2.344 0.1863
soak_time*cooling_rate 1 242.0000 242.0000 6.224 0.0548
peak_temp*time_above_liquidus 1 242.0000 242.0000 6.224 0.0548
peak_temp*cooling_rate 1 91.1250 91.1250 2.344 0.1863
time_above_liquidus*cooling_rate 1 25.9200 25.9200 0.667 0.4513
Error (Lenth PSE) 5 194.4000 38.8800
Total 7 472.0150 67.4307
Note: Error estimated using Lenth's pseudo-standard-error (unreplicated design)
=== Interaction Effects: joint_strength ===
Factor A Factor B Interaction % Contribution
------------------------------------------------------------------------
soak_time cooling_rate 11.0000 20.3%
peak_temp time_above_liquidus -11.0000 20.3%
preheat_temp peak_temp 6.9500 12.8%
soak_time time_above_liquidus 6.7500 12.5%
peak_temp cooling_rate -6.7500 12.5%
soak_time peak_temp 3.6000 6.7%
time_above_liquidus cooling_rate -3.6000 6.7%
preheat_temp soak_time 2.5000 4.6%
preheat_temp time_above_liquidus 1.1000 2.0%
preheat_temp cooling_rate -0.8500 1.6%
=== Summary Statistics: joint_strength ===
preheat_temp:
Level N Mean Std Min Max
------------------------------------------------------------
150 4 48.5000 6.5462 39.1000 54.3000
200 4 41.7500 9.1712 32.1000 52.8000
soak_time:
Level N Mean Std Min Max
------------------------------------------------------------
120 4 45.6750 6.3710 36.8000 50.5000
60 4 44.5750 10.7677 32.1000 54.3000
peak_temp:
Level N Mean Std Min Max
------------------------------------------------------------
230 4 45.5500 9.6959 32.1000 54.3000
260 4 44.7000 7.9276 36.8000 52.8000
time_above_liquidus:
Level N Mean Std Min Max
------------------------------------------------------------
30 4 46.3750 9.5908 32.1000 52.8000
90 4 43.8750 7.8224 36.8000 54.3000
cooling_rate:
Level N Mean Std Min Max
------------------------------------------------------------
1 4 41.6500 7.7981 32.1000 50.1000
4 4 48.6000 8.0204 36.8000 54.3000
=== Main Effects: void_percentage ===
Factor Effect Std Error % Contribution
--------------------------------------------------------------
time_above_liquidus 3.9725 1.1064 34.5%
cooling_rate -3.0225 1.1064 26.3%
peak_temp 2.6825 1.1064 23.3%
soak_time 1.3925 1.1064 12.1%
preheat_temp 0.4375 1.1064 3.8%
=== ANOVA Table: void_percentage ===
Source DF SS MS F p-value
-----------------------------------------------------------------------------
preheat_temp 1 0.3828 0.3828 0.667 0.4513
soak_time 1 3.8781 3.8781 6.754 0.0483
peak_temp 1 14.3916 14.3916 25.063 0.0041
time_above_liquidus 1 31.5615 31.5615 54.964 0.0007
cooling_rate 1 18.2710 18.2710 31.819 0.0024
preheat_temp*soak_time 1 31.5615 31.5615 54.964 0.0007
preheat_temp*peak_temp 1 18.2710 18.2710 31.819 0.0024
preheat_temp*time_above_liquidus 1 3.8781 3.8781 6.754 0.0483
preheat_temp*cooling_rate 1 14.3916 14.3916 25.063 0.0041
soak_time*peak_temp 1 0.0325 0.0325 0.057 0.8214
soak_time*time_above_liquidus 1 0.3828 0.3828 0.667 0.4513
soak_time*cooling_rate 1 0.0325 0.0325 0.057 0.8214
peak_temp*time_above_liquidus 1 0.0325 0.0325 0.057 0.8214
peak_temp*cooling_rate 1 0.3828 0.3828 0.667 0.4513
time_above_liquidus*cooling_rate 1 0.0325 0.0325 0.057 0.8214
Error (Lenth PSE) 5 2.8711 0.5742
Total 7 68.5501 9.7929
Note: Error estimated using Lenth's pseudo-standard-error (unreplicated design)
=== Interaction Effects: void_percentage ===
Factor A Factor B Interaction % Contribution
------------------------------------------------------------------------
preheat_temp soak_time -3.9725 31.9%
preheat_temp peak_temp -3.0225 24.3%
preheat_temp cooling_rate 2.6825 21.5%
preheat_temp time_above_liquidus -1.3925 11.2%
soak_time time_above_liquidus -0.4375 3.5%
peak_temp cooling_rate 0.4375 3.5%
soak_time peak_temp -0.1275 1.0%
soak_time cooling_rate 0.1275 1.0%
peak_temp time_above_liquidus -0.1275 1.0%
time_above_liquidus cooling_rate 0.1275 1.0%
=== Summary Statistics: void_percentage ===
preheat_temp:
Level N Mean Std Min Max
------------------------------------------------------------
150 4 7.8225 4.5238 2.1600 13.2300
200 4 8.2600 1.5024 6.8000 9.7200
soak_time:
Level N Mean Std Min Max
------------------------------------------------------------
120 4 7.3450 3.5245 2.1600 9.7200
60 4 8.7375 3.0224 6.8000 13.2300
peak_temp:
Level N Mean Std Min Max
------------------------------------------------------------
230 4 6.7000 3.2193 2.1600 9.7200
260 4 9.3825 2.7729 6.8000 13.2300
time_above_liquidus:
Level N Mean Std Min Max
------------------------------------------------------------
30 4 6.0550 2.6563 2.1600 8.1200
90 4 10.0275 2.2965 7.7800 13.2300
cooling_rate:
Level N Mean Std Min Max
------------------------------------------------------------
1 4 9.5525 2.6723 7.1400 13.2300
4 4 6.5300 3.1013 2.1600 9.3800
Optimization Recommendations
=== Optimization: joint_strength ===
Direction: maximize
Best observed run: #4
preheat_temp = 200
soak_time = 120
peak_temp = 230
time_above_liquidus = 90
cooling_rate = 1
Value: 54.3
RSM Model (linear, R² = 0.6672, Adj R² = -0.1649):
Coefficients:
intercept +45.1250
preheat_temp +2.2000
soak_time -3.0000
peak_temp -4.9250
time_above_liquidus -1.1250
cooling_rate +0.0500
Predicted optimum (from linear model, at observed points):
preheat_temp = 200
soak_time = 60
peak_temp = 230
time_above_liquidus = 30
cooling_rate = 1
Predicted value: 56.3250
Surface optimum (via L-BFGS-B, linear model):
preheat_temp = 200
soak_time = 60
peak_temp = 230
time_above_liquidus = 30
cooling_rate = 4
Predicted value: 56.4250
Model quality: Moderate fit — use predictions directionally, not precisely.
Factor importance:
1. peak_temp (effect: -9.8, contribution: 43.6%)
2. soak_time (effect: 6.0, contribution: 26.5%)
3. preheat_temp (effect: 4.4, contribution: 19.5%)
4. time_above_liquidus (effect: -2.2, contribution: 10.0%)
5. cooling_rate (effect: 0.1, contribution: 0.4%)
=== Optimization: void_percentage ===
Direction: minimize
Best observed run: #1
preheat_temp = 150
soak_time = 60
peak_temp = 230
time_above_liquidus = 90
cooling_rate = 4
Value: 2.16
RSM Model (linear, R² = 0.5235, Adj R² = -0.6677):
Coefficients:
intercept +8.0412
preheat_temp -0.5813
soak_time +0.4637
peak_temp +1.0962
time_above_liquidus -0.4637
cooling_rate -1.5863
Predicted optimum (from linear model, at observed points):
preheat_temp = 150
soak_time = 120
peak_temp = 260
time_above_liquidus = 30
cooling_rate = 1
Predicted value: 12.2325
Surface optimum (via L-BFGS-B, linear model):
preheat_temp = 200
soak_time = 60
peak_temp = 230
time_above_liquidus = 90
cooling_rate = 4
Predicted value: 3.8500
Model quality: Moderate fit — use predictions directionally, not precisely.
Factor importance:
1. cooling_rate (effect: -3.2, contribution: 37.8%)
2. peak_temp (effect: 2.2, contribution: 26.2%)
3. preheat_temp (effect: -1.2, contribution: 13.9%)
4. soak_time (effect: -0.9, contribution: 11.1%)
5. time_above_liquidus (effect: -0.9, contribution: 11.1%)