agentsclimarketplace

Motor fcs mpc trivector

Skill calebzu/pmsm-control-claude-skills-for-matlab/.claude/skills/motor-fcs-mpc-trivector

PMSM Three-Vector Finite-Control-Set MPC Builder. Build an inner-loop three-vectors-per-period finite-control-set MPC current controller for a three-phase voltage-source-inverter-driven PMSM (SPMSM / mild-saliency IPMSM via parameterization) in Simulink, with an outer speed PI providing iq_ref. Each control period synthesizes an expected voltage vector from two adjacent active vectors + one zero vector and splits the period into three sub-intervals (t_i, t_j, t_z) so that BOTH i_d and i_q hit their references in one period (dual-axis deadbeat) — cutting current ripple below single- and dual-vector FCS-MPC at the same Tsc. Use when constructing, reproducing, porting, or extending a three-vector / triple-vector FCS-MPC current-control simulation in Simulink (keywords three-vector MPC, triple-vector MPC, TV-MPCC, dual-axis deadbeat, expected voltage vector synthesis, sector-based MPCC, 三矢量模型预测, 期望电压矢量). Skip for single-vector FCS-MPC (use motor-fcs-mpc), dual-vector / two-vector FCS-MPC (use motor-fcs-mpc-dualvector), FOC, DTC, SMC, sensorless, scalar V/Hz, BLDC trapezoidal, induction-motor MPC, multi-step-horizon (N>1) MPC, strong-saliency IPMSM MTPA, weak-field, or pure theory questions. Layered on motor-pmsm-base.From its SKILL.md

Install
npx -y skills add calebzu/pmsm-control-claude-skills-for-matlab --skill motor-fcs-mpc-trivector

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 10 stars10 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

11.3 KB, ~3.0k tokens by cl100k_base, as published. Nobody here has run it

motor-fcs-mpc-trivector — PMSM Three-Vector Finite-Control-Set MPC Builder

Three-phase 2-level voltage-source inverter + PMSM (SPMSM / mild-saliency IPMSM via parameterization). Inner loop = three-vector FCS-MPC current control in the dq frame: each control period synthesizes an expected voltage vector per sector from the two adjacent active vectors u_i, u_j plus a zero vector, and splits the period into three sub-intervals — u_i for t_i, u_j for t_j, zero for t_z = Tsc − t_i − t_j — chosen so that both i_d and i_q reach their references in one period (dual-axis deadbeat). Outer loop = speed PI providing iq_ref, id_ref = 0. Synthesizing an arbitrary-direction, arbitrary-amplitude voltage vector and nulling both axes drives switching-cycle current ripple below single- and dual-vector FCS-MPC at the same Tsc.

Distilled from Xu Yanping et al. 2018 (Three-Vector Model Predictive Current Control for PMSM, Trans. China Electrotech. Soc. 33(5):980-986). Control-law formulas are the signed T2(b)–T6(b) in pmsm_formulas.md §F; plant physics, prediction, speed PI, Clarke/Park, the 8-vector set and the 6-sector decode are reused by pointer from pmsm_formulas.md (incl. §B.4/§B.5). The q-axis slope (T2a) is reused by pointer from §E.1 (N2), and the cost criterion from §F.0 (control strategy, non-signed).

Layered on motor-pmsm-base. All base discipline applies (Goto TagVisibility, Vdc/BEMF rule, Visual 4-check, broken-FOC defense).

What makes three-vector different (vs dual-vector motor-fcs-mpc-dualvector and single-vector)

AspectSingle-vectorDual-vectorThree-vector (this skill)
Vectors per period1 (held)2: V_opt1 + V_j3: u_i + u_j (adjacent active) + zero
Deadbeat axesnone (search only)q only (scalar t_opt1)d AND q (2×2 solve for t_i,t_j,t_z)
d-axis slope needednonoyes (T2b)
Candidate set7/8 basic vectorsvector pairs6 synthesized expected vectors (one per sector)
Time allocationq-deadbeat (N3)dual-axis deadbeat 2×2 (T3) + 3-case clamp (T5)
Chart sample-timeINHERITED + dual ZOHtwo-rate DISCRETEtwo-rate DISCRETE: controller/theta @ Tsc, slicer @ Ts
Cost (this reference)L2 weightedL1 unweightedL1 unweighted over the 6 expected vectors (paper eq 7)

There is no SVPWM and no Anti_Park — the selected discrete vectors are applied directly; the gate comes from a 3-segment time-slicer, not a PWM modulator.

Must-Follow Rules

  1. Plan first. Before any add_block, write a numbered plan: parameter table, design-decision choices (design_decisions.md), build-script structure. Get user approval.
  2. One-click reproducibility. Inject all parameters via set_param(mdl, 'InitFcn', sprintf(...)). Model must Run from .slx double-click in a fresh MATLAB session. See crit_conditions.md §J-CRIT.
  3. Controller chart hardcodes machine params via sprintf. The TVMPCC chart embeds Rs/Ld/Lq/psif as numeric literals at build time; the literals MUST equal the InitFcn values digit-for-digit (assert it in the build). See crit_conditions.md §K-CRIT.
  4. Two-rate DISCRETE sample times (the validated structure — see crit_conditions.md §G-CRIT):
    • TVMPCC and ThetaSrcMATLABFunctionConfiguration.UpdateMethod='Discrete', SampleTime='Tsc'.
    • SlicerDiscrete, SampleTime='Ts' (must run at the fast plant rate to slice three segments within the period), fed by a Digital Clock @ Ts.
    • SampleTime is silently ignored unless UpdateMethod='Discrete' is set first. A continuous/inherited gate fails to propagate into the discrete SimPowerSystems bridge (Stateflow:SignalTypePropagationError).
  5. gate is a 6-element COLUMN vector. The Slicer output must be [Sa+;Sa−;Sb+;Sb−;Sc+;Sc−] (column) so the inferred size [6 1] matches the Universal_Bridge gate port [6]; a [1 6] row triggers DataBackPropagationSizeSuffix. See crit_conditions.md §D-CRIT.
  6. R2024b: set the MATLAB-Function code via the config object, not the wrong Stateflow class. The chart class is Stateflow.EMChart (NOT EMLChart); the robust route is get_param(blk,'MATLABFunctionConfiguration').FunctionScript = code. See crit_conditions.md §G-CRIT, anti_patterns.md #2.
  7. DC bus polarity must match. DC +(RConn) → UB RConn(1)(+), DC −(LConn) → UB RConn(2)(−). Reversed polarity clamps the link via the freewheel diodes → vds=vqs=0, zero current, rotor stalls (no error). See crit_conditions.md §DC-CRIT, anti_patterns.md #6.
  8. One theta_e, integrated at Tsc, feeds both Plark and the controller. theta_e += Tsc·(Pn·w) persistent, wrapped via atan2(sin,cos). Do NOT use the PMSM bus theta. Goto/From ⇒ TagVisibility='global'. See crit_conditions.md §A-CRIT.
  9. Outer PI saturation is mandatory. LimitOutput='on', [−iq_max, +iq_max], 1.5·Pn·psif·iq_max ≥ 1.3·TL_max, back-calculation anti-windup. See parameter_defaults.md.
  10. Keep all three vectors live. The T5 three-case clamp must degrade gracefully (drop the out-of-range vector) — not silently collapse to a single/dual vector. Confirm in acceptance that t_i, t_j, t_z are all meaningfully nonzero in steady state. See anti_patterns.md #5.

Build Flow

PhaseActionReference
0Validate inputs + sanity gridbase/pre_build_grid.md
1Plant layer (powergui Discrete @ Ts, DC, UB Inverter, PMSM Salient-pole, TL) — check DC polaritycrit_conditions.md §DC, anti_patterns.md #6
2Measurement layer (BusSelector → Clark → Plark, theta_e source)crit_conditions.md §A
3Outer speed PI (RPM↔rad/s, mandatory saturation)parameter_defaults.md, scripts/speed_pi_design.m
4TVMPCC controller chart (6-sector loop, 2×2 deadbeat, 3-case clamp, 6-candidate cost)algorithm_pseudocode.md + crit_conditions.md §G/§K
5Slicer 3-segment sequencer + Digital Clockalgorithm_pseudocode.md §slicer + crit_conditions.md §G/§D
6Logging (To Workspace @ fast rate for ripple; scopes)acceptance_criteria.md
7Solver (fixed-step discrete, FixedStep = Ts; powergui Discrete) + InitFcn injectioncrit_conditions.md §J
8Self-tests + acceptance (visual 4-check + 3-vector liveness, then §E ripple)acceptance_criteria.md

If issues arise, consult crit_conditions.md (A/D/G/J/K/DC) and anti_patterns.md.

Required User Inputs

Ask the user before starting. Defaults in parameter_defaults.md.

GroupParameter
MachineRs (Ω), Ld, Lq (H; SPMSM: Ld=Lq=Ls), psif (V·s), Pn, J (kg·m²), F (N·m·s)
Power stageVdc (V) — BEMF margin; ripple scales with Vdc·Tsc/L, so it co-sets the ripple level
SamplingTs (plant solver, ~1 μs), Tsc (control period, paper 100 μs @ 10 kHz; Tsc/Ts ≥ 50)
Outer loopKp_w, Ki_w (recommend speed_pi_design.m; B=0 ⇒ Symmetric Optimum a=4), iq_max
MPCcost form (L1-unweighted = paper / L2-weighted = production option), id_ref (SPMSM/mild-IPMSM: 0)
ScenarioStopTime, omega_ref profile (RPM), TL_step_time, TL_value (< 1.5·Pn·psif·iq_max)

Triggers / Skip

✅ Use❌ Skip
Build / port / extend a three-vector (triple-vector) FCS-MPC simulation in SimulinkDual-vector FCS-MPC → motor-fcs-mpc-dualvector; single-vector → motor-fcs-mpc
3 vectors/period (2 adjacent active + zero), dual-axis deadbeat, expected-voltage synthesisFOC, DTC, SMC, sensorless, scalar V/Hz, BLDC trapezoidal
Generalizing three-vector MPC to a new SPMSM / mild-saliency machineMulti-step horizon (N>1), induction-motor MPC
Strong-saliency IPMSM MTPA, weak-field; pure theory questions

Generalization Across Machine Sub-Types

Sub-typeParameter constraintStrategy
SPMSMLd == Lqid_ref = 0. The T2–T6 general (Ld,Lq) form reduces verbatim to the paper's SPMSM equations.
IPMSM mild saliencyLq > Ld, Lq/Ld ≤ 1.5id_ref = 0 workable; the general form already carries the salient cross-terms. The d-axis deadbeat (T3) genuinely uses Ld.
IPMSM strong saliencyLq/Ld ≥ 2id_ref from MTPA (out of v1 scope; ask user)

Topology does not change — same blocks, same wiring, same controller+slicer charts, same CRIT conditions. Only parameters and id_ref strategy differ. Out-of-scope: SynRM (psif ≈ 0), IM, BLDC trapezoidal — different prediction equations.

Sibling Skills

What ships with it: 7 files

32.2 KB alongside SKILL.md

scripts/

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.