board
Solar MPPT Power System
Public Unreviewedby TylerK
A 30 W solar battery charger with regulated 5 V and 3.3 V rails: an STM32G031 running perturb & observe MPPT and a CC/CV charge state machine, steering a TI LM5175 4-switch buck-boost through a single analog control input. Four-layer KiCad board, schematic and PCB generated from Python, with an electrothermal simulation run against the published board file.
main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
{
"board": "/mnt/c/Users/kirkt/Documents/mppt-power-system-mcu/mppt-power-system-mcu.kicad_pcb",
"board_sha256": "bf1394cbc902f460376c5ec1d0044933eb1f08278029f553eedad360bfe1290f",
"unsolved_cases": [],
"model": {
"current_grid_mm": 0.2,
"fine_grid_mm": 0.15,
"ground_grid_mm": 1.0,
"ground_fine_grid_mm": 0.75,
"thermal_grid_mm": 1.0,
"copper_resistivity_20C_ohm_m": 1.724e-08,
"copper_tempco_per_C": 0.00393,
"via_plating_assumption_um": 25.0,
"ambient_C": 25.0
},
"native_drc": {
"kicad_version": "10.0.2",
"unconnected": 0,
"other_violations": 11,
"note": "Run via kicad-cli with zone refill on 2026-09-19; unconnected=0 and 0 different-net clearance findings -- the board is electrically complete and clearance-clean. The 11 remaining violations are cosmetic only (4 footprint-library metadata mismatches, 7 silkscreen overlaps). See 04-pcb-layout-review.md."
},
"current_cases": [
{
"name": "panel_raw_5A",
"net": "Net-(J1-Pin_1)",
"pitch_mm": 0.2,
"load_A": 5.0,
"voltage_drop_mV": 13.593507776418846,
"resistance_mOhm": 2.7187015552837694,
"copper_loss_mW": 67.96753888209425,
"joule_balance_error_pct": 7.411827847666545e-12,
"normalized_residual": 4.5073676329055815e-12,
"j_p95_A_per_mm2": 30.073805114415897,
"j_p99_A_per_mm2": 31.320600986788484,
"j_max_A_per_mm2": 39.17848526340257,
"conductor_nodes": 3558,
"floating_components_omitted": 0,
"plated_layer_links": 9,
"resistance_at_80C_mOhm": 3.3597713820196824
},
{
"name": "buck_switch_node_5A",
"net": "Net-(Q2-S)",
"pitch_mm": 0.2,
"load_A": 5.0,
"voltage_drop_mV": 13.801142411605014,
"resistance_mOhm": 2.7602284823210024,
"copper_loss_mW": 69.00571205802508,
"joule_balance_error_pct": 5.24898955436304e-12,
"normalized_residual": 6.687744113577399e-12,
"j_p95_A_per_mm2": 34.530848553464025,
"j_p99_A_per_mm2": 38.77487379924218,
"j_max_A_per_mm2": 48.75934814623052,
"conductor_nodes": 4468,
"floating_components_omitted": 0,
"plated_layer_links": 24,
"resistance_at_80C_mOhm": 3.4110903584522947
},
{
"name": "vbatt_raw_2p5A",
"net": "Net-(Q4-D)",
"pitch_mm": 0.2,
"load_A": 2.5,
"voltage_drop_mV": 4.515691017749475,
"resistance_mOhm": 1.8062764070997899,
"copper_loss_mW": 11.289227544373688,
"joule_balance_error_pct": 3.795447446533355e-12,
"normalized_residual": 1.1792739266689965e-11,
"j_p95_A_per_mm2": 13.65948891327041,
"j_p99_A_per_mm2": 15.688520568202657,
"j_max_A_per_mm2": 22.57233841917062,
"conductor_nodes": 6535,
"floating_components_omitted": 0,
"plated_layer_links": 51,
"resistance_at_80C_mOhm": 2.2321963838939203
},
{
"name": "vbatt_bus_to_battery_2p5A",
"net": "/VBATT",
"pitch_mm": 0.2,
"load_A": 2.5,
"voltage_drop_mV": 6.433327655903276,
"resistance_mOhm": 2.5733310623613104,
"copper_loss_mW": 16.083319139758192,
"joule_balance_error_pct": 1.2813595698452521e-11,
"normalized_residual": 1.010362206071577e-11,
"j_p95_A_per_mm2": 13.480364716342864,
"j_p99_A_per_mm2": 14.084976271940146,
"j_max_A_per_mm2": 20.11863991826157,
"conductor_nodes": 13667,
"floating_components_omitted": 0,
"plated_layer_links": 24,
"resistance_at_80C_mOhm": 3.1801225268661075
},
{
"name": "vbatt_bus_to_5V_pol_0p9A",
"net": "/VBATT",
"pitch_mm": 0.2,
"load_A": 0.9,
"voltage_drop_mV": 6.129686579199005,
"resistance_mOhm": 6.810762865776671,
"copper_loss_mW": 5.516717921279105,
"joule_balance_error_pct": 2.2891848170085606e-11,
"normalized_residual": 3.011070834334292e-11,
"j_p95_A_per_mm2": 5.3007510940431555,
"j_p99_A_per_mm2": 7.254277997793164,
"j_max_A_per_mm2": 14.738628447551916,
"conductor_nodes": 13667,
"floating_components_omitted": 0,
"plated_layer_links": 24,
"resistance_at_80C_mOhm": 8.416740749526811
},
{
"name": "vbatt_bus_to_3v3_pol_0p3A",
"net": "/VBATT",
"pitch_mm": 0.2,
"load_A": 0.3,
"voltage_drop_mV": 3.0739251580162583,
"resistance_mOhm": 10.24641719338753,
"copper_loss_mW": 0.9221775474048776,
"joule_balance_error_pct": 3.6270279096800424e-11,
"normalized_residual": 3.562082434903159e-11,
"j_p95_A_per_mm2": 1.4523583786069085,
"j_p99_A_per_mm2": 2.343488931087354,
"j_max_A_per_mm2": 19.874944105942777,
"conductor_nodes": 13667,
"floating_components_omitted": 0,
"plated_layer_links": 24,
"resistance_at_80C_mOhm": 12.66252236758831
},
{
"name": "pol5v_switch_node_2A",
"net": "Net-(L3-Pad1)",
"pitch_mm": 0.2,
"load_A": 2.0,
"voltage_drop_mV": 1.2956552078914343,
"resistance_mOhm": 0.6478276039457171,
"copper_loss_mW": 2.5913104157828686,
"joule_balance_error_pct": 3.012474149893486e-13,
"normalized_residual": 2.8558732327729202e-11,
"j_p95_A_per_mm2": 13.708929519333036,
"j_p99_A_per_mm2": 16.7780376923038,
"j_max_A_per_mm2": 22.331540018089083,
"conductor_nodes": 803,
"floating_components_omitted": 0,
"plated_layer_links": 0,
"resistance_at_80C_mOhm": 0.8005853529561172
},
{
"name": "pol5v_rail_2A",
"net": "Net-(U8-VOS)",
"pitch_mm": 0.2,
"load_A": 2.0,
"voltage_drop_mV": 5.522406367206378,
"resistance_mOhm": 2.761203183603189,
"copper_loss_mW": 11.044812734412755,
"joule_balance_error_pct": 2.8742397335054e-12,
"normalized_residual": 1.7515541854408082e-11,
"j_p95_A_per_mm2": 12.917541049444266,
"j_p99_A_per_mm2": 15.378487540526804,
"j_max_A_per_mm2": 17.82336198490303,
"conductor_nodes": 3271,
"floating_components_omitted": 0,
"plated_layer_links": 24,
"resistance_at_80C_mOhm": 3.412294894296821
},
{
"name": "pol5v_output_2A",
"net": "/V5V_OUT",
"pitch_mm": 0.2,
"load_A": 2.0,
"voltage_drop_mV": 3.011788265059361,
"resistance_mOhm": 1.5058941325296804,
"copper_loss_mW": 6.0235765301187225,
"joule_balance_error_pct": 5.990170145577352e-12,
"normalized_residual": 1.4533514630174163e-11,
"j_p95_A_per_mm2": 14.990634174089346,
"j_p99_A_per_mm2": 15.487408302773625,
"j_max_A_per_mm2": 17.89372020554413,
"conductor_nodes": 2400,
"floating_components_omitted": 0,
"plated_layer_links": 3,
"resistance_at_80C_mOhm": 1.860983968980179
},
{
"name": "pol3v3_switch_node_1A",
"net": "Net-(U9-SW)",
"pitch_mm": 0.2,
"load_A": 1.0,
"voltage_drop_mV": 3.5654167334531848,
"resistance_mOhm": 3.5654167334531848,
"copper_loss_mW": 3.565416733453185,
"joule_balance_error_pct": 1.0825550062166599e-12,
"normalized_residual": 1.1106544468555293e-11,
"j_p95_A_per_mm2": 46.368934658130186,
"j_p99_A_per_mm2": 47.1872073771716,
"j_max_A_per_mm2": 57.74402857145654,
"conductor_nodes": 214,
"floating_components_omitted": 0,
"plated_layer_links": 0,
"resistance_at_80C_mOhm": 4.406141999201446
},
{
"name": "pol3v3_rail_1A",
"net": "Net-(C32-Pad1)",
"pitch_mm": 0.2,
"load_A": 1.0,
"voltage_drop_mV": 2.2207359585979662,
"resistance_mOhm": 2.2207359585979662,
"copper_loss_mW": 2.2207359585979667,
"joule_balance_error_pct": 8.514513314804354e-12,
"normalized_residual": 1.3956229013373294e-11,
"j_p95_A_per_mm2": 6.434544451528777,
"j_p99_A_per_mm2": 10.93189156603885,
"j_max_A_per_mm2": 11.054825987707257,
"conductor_nodes": 2849,
"floating_components_omitted": 0,
"plated_layer_links": 36,
"resistance_at_80C_mOhm": 2.7443854976353665
},
{
"name": "pol3v3_output_1A",
"net": "/V3V3_OUT",
"pitch_mm": 0.2,
"load_A": 1.0,
"voltage_drop_mV": 0.6606835512966446,
"resistance_mOhm": 0.6606835512966446,
"copper_loss_mW": 0.6606835512966444,
"joule_balance_error_pct": 1.1487216826427263e-13,
"normalized_residual": 1.0161300907926106e-11,
"j_p95_A_per_mm2": 7.029183158710377,
"j_p99_A_per_mm2": 11.933062724211485,
"j_max_A_per_mm2": 19.04028794440149,
"conductor_nodes": 1849,
"floating_components_omitted": 0,
"plated_layer_links": 9,
"resistance_at_80C_mOhm": 0.8164727326923934
},
{
"name": "load_ground_return_3A",
"net": "GND",
"pitch_mm": 1.0,
"load_A": 3.0,
"voltage_drop_mV": 0.4331363206173226,
"resistance_mOhm": 0.14437877353910755,
"copper_loss_mW": 1.299408961851968,
"joule_balance_error_pct": 3.8381526831438694e-13,
"normalized_residual": 2.4381556541164712e-11,
"j_p95_A_per_mm2": 0.2771575163322693,
"j_p99_A_per_mm2": 0.4483153086622171,
"j_max_A_per_mm2": 1.7039306709434026,
"conductor_nodes": 60099,
"floating_components_omitted": 0,
"plated_layer_links": 687,
"resistance_at_80C_mOhm": 0.17842328833962912
},
{
"name": "charge_ground_return_2p5A",
"net": "GND",
"pitch_mm": 1.0,
"load_A": 2.5,
"voltage_drop_mV": 0.6135974993656905,
"resistance_mOhm": 0.24543899974627623,
"copper_loss_mW": 1.5339937484142265,
"joule_balance_error_pct": 1.1025829739044462e-12,
"normalized_residual": 2.769374958087924e-11,
"j_p95_A_per_mm2": 0.22635926795179584,
"j_p99_A_per_mm2": 0.37559127201193454,
"j_max_A_per_mm2": 1.4745239410863478,
"conductor_nodes": 60099,
"floating_components_omitted": 0,
"plated_layer_links": 687,
"resistance_at_80C_mOhm": 0.30331351588644817
}
],
"mesh_convergence": [
{
"name": "panel_raw_5A",
"coarse_pitch_mm": 0.2,
"fine_pitch_mm": 0.15,
"coarse_resistance_mOhm": 2.7187015552837694,
"fine_resistance_mOhm": 2.6438457163627156,
"difference_pct": 2.831324023855566
},
{
"name": "pol5v_switch_node_2A",
"coarse_pitch_mm": 0.2,
"fine_pitch_mm": 0.15,
"coarse_resistance_mOhm": 0.6478276039457171,
"fine_resistance_mOhm": 0.641651934609721,
"difference_pct": 0.9624640717014917
},
{
"name": "load_ground_return_3A",
"coarse_pitch_mm": 1.0,
"fine_pitch_mm": 0.75,
"coarse_resistance_mOhm": 0.14437877353910755,
"fine_resistance_mOhm": 0.14541297144645393,
"difference_pct": 0.711214341512309
}
],
"via_plating_sensitivity": [
{
"plating_um": 15,
"resistance_mOhm": 0.1487308427345574,
"copper_loss_mW": 1.3385775846110166
},
{
"plating_um": 25,
"resistance_mOhm": 0.14437877353910755,
"copper_loss_mW": 1.299408961851968
},
{
"plating_um": 35,
"resistance_mOhm": 0.14212688270864288,
"copper_loss_mW": 1.2791419443777858
}
],
"thermal_sources_W": {
"Q2": 0.3,
"Q3": 0.25,
"Q4": 0.3,
"Q5": 0.25,
"U4": 0.4,
"RS1": 0.25,
"RS2": 0.13,
"L2": 0.75,
"L3": 0.32,
"L4": 0.05,
"U8": 0.6,
"U9": 0.45,
"U1": 0.05,
"U2": 0.15,
"U5": 0.02,
"U6": 0.02
},
"thermal_sensitivity": [
{
"h_convection_W_m2K_per_side": 5.0,
"h_radiation_W_m2K_per_side": 6.268613382559663,
"ambient_C": 25.0,
"total_power_W": 4.29,
"max_board_C": 45.630637462610395,
"average_board_C": 34.32456771720661,
"hotspot_x_mm": 86.5,
"hotspot_y_mm": 25.5,
"energy_balance_error_pct": 1.1635344332668308e-11,
"source_average_board_C": {
"Q2": 41.900267358914675,
"Q3": 41.524668308922955,
"Q4": 41.159211200468214,
"Q5": 40.75345673622349,
"U4": 43.34955465792522,
"RS1": 38.545623154164765,
"RS2": 37.64503384652206,
"L2": 44.55958723137098,
"L3": 40.07405660609712,
"L4": 37.64978592865009,
"U8": 43.15930240924148,
"U9": 40.49838458426724,
"U1": 39.14985229808073,
"U2": 37.74172474615153,
"U5": 39.43356385231073,
"U6": 38.32567410197289
},
"copper_layer_coverage_pct": {
"F.Cu": 97.43803272264132,
"In1.Cu": 99.57382188694034,
"In2.Cu": 4.932889193690604,
"B.Cu": 98.9663956108553
}
},
{
"h_convection_W_m2K_per_side": 10.0,
"h_radiation_W_m2K_per_side": 6.268613382559663,
"ambient_C": 25.0,
"total_power_W": 4.29,
"max_board_C": 41.952855304640295,
"average_board_C": 31.458752574291342,
"hotspot_x_mm": 86.5,
"hotspot_y_mm": 25.5,
"energy_balance_error_pct": 4.500932131533968e-11,
"source_average_board_C": {
"Q2": 38.50901562510377,
"Q3": 38.107545709350134,
"Q4": 37.543866516547936,
"Q5": 37.12412044662864,
"U4": 39.72997561086606,
"RS1": 35.475191201405536,
"RS2": 34.15454443878142,
"L2": 40.829946516545505,
"L3": 36.7973561013751,
"L4": 34.30450959172591,
"U8": 39.832061687899724,
"U9": 37.133834939117826,
"U1": 35.9647413071453,
"U2": 34.72380674062339,
"U5": 36.15822528018008,
"U6": 34.787370433832926
},
"copper_layer_coverage_pct": {
"F.Cu": 97.43803272264132,
"In1.Cu": 99.57382188694034,
"In2.Cu": 4.932889193690604,
"B.Cu": 98.9663956108553
}
},
{
"h_convection_W_m2K_per_side": 20.0,
"h_radiation_W_m2K_per_side": 6.268613382559663,
"ambient_C": 25.0,
"total_power_W": 4.29,
"max_board_C": 38.32011826885193,
"average_board_C": 29.000018845093614,
"hotspot_x_mm": 86.5,
"hotspot_y_mm": 25.5,
"energy_balance_error_pct": 6.086817142000859e-12,
"source_average_board_C": {
"Q2": 35.234090174619055,
"Q3": 34.80417149393154,
"Q4": 34.13458512446474,
"Q5": 33.726926487678,
"U4": 36.17747789631708,
"RS1": 32.64651383954047,
"RS2": 31.030153384133513,
"L2": 37.19482035629229,
"L3": 33.83503774080187,
"L4": 31.34541981890969,
"U8": 36.792926854813885,
"U9": 34.12994837276516,
"U1": 32.973068197414825,
"U2": 31.950197449435365,
"U5": 33.05434224117816,
"U6": 31.566713616078303
},
"copper_layer_coverage_pct": {
"F.Cu": 97.43803272264132,
"In1.Cu": 99.57382188694034,
"In2.Cu": 4.932889193690604,
"B.Cu": 98.9663956108553
}
}
],
"rectangle_validation": {
"rectangle_length_mm": 50.0,
"rectangle_width_mm": 2.0,
"analytic_mOhm": 12.314285714285717,
"discrete_mOhm": 12.265028571428571,
"error_pct": 0.4000000000000172
}
}