{"id":171,"date":"2021-03-23T11:00:21","date_gmt":"2021-03-23T11:00:21","guid":{"rendered":"https:\/\/imperix.com\/doc\/?p=171"},"modified":"2025-06-05T07:39:32","modified_gmt":"2025-06-05T07:39:32","slug":"proportional-resonant-controller","status":"publish","type":"post","link":"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller","title":{"rendered":"Proportional resonant controller"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 ez-toc-wrap-right-text counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller\/#What-is-a-proportional-resonant-controller\" >What is a proportional resonant controller?<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller\/#Benefits-of-proportional-resonant-controllers\" >Benefits of proportional resonant controllers<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller\/#Operating-principles-of-proportional-resonant-controllers\" >Operating principles of proportional resonant controllers<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller\/#Digital-control-implementation\" >Digital control implementation<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller\/#Tuning-and-performance-evaluation\" >Tuning and performance evaluation<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller\/#Academic-references\" >Academic references<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller\/#B-Box-B-Board-implementation\" >B-Box \/ B-Board implementation<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller\/#Simulink\" >Simulink<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller\/#CC-code\" >C\/C++ code<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller\/#Implementation-example\" >Implementation example<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller\/#Experimental-results\" >Experimental results<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n\n<p>This article presents the basic theory of operation of proportional resonant controllers, and introduces a possible implementation for the control of single-phase voltage source inverters. The corresponding software is given for Simulink and C++ code and is made available for download.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"What-is-a-proportional-resonant-controller\"><\/span>What is a proportional resonant controller?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Proportional resonant controllers (abbreviated PR controllers) are a particular type of transfer function that are often implemented for the closed-loop control of systems with a sinusoidal behavior.  As their name indicates, they possess both a proportional and a resonant term, which can be tuned independently. When needed, additional resonant terms can also be added to attenuate specific harmonics.&nbsp;<\/p>\n\n\n\n<p>In power electronics, proportional resonant controllers (PR) have attracted significant interest for AC current\/voltage control applications due to their performance and simple implementation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Benefits-of-proportional-resonant-controllers\"><\/span>Benefits of proportional resonant controllers<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>In DC applications, conventional <a href=\"https:\/\/imperix.com\/doc\/implementation\/basic-pi-control\">PI controllers<\/a> provide excellent performance, notably a minimal steady-state error, thanks to the (almost) infinite DC gain provided by the integral control action. However, in AC applications, PI controller(s) in the stationary reference frame inevitably present a delayed tracking response, because finite gains at the fundamental frequency cannot prevent steady-state error.<\/p>\n\n\n\n<p>A well-known countermeasure to this shortcoming is the implementation of the control within a synchronous reference frame. This means that PI controller(s) are implemented inside a rotating reference frame (dq), which is synchronized with the AC frequency (e.g. of the grid or the electric motor, see <a href=\"https:\/\/imperix.com\/doc\/implementation\/vector-current-control\">TN106<\/a>). This allows re-locating the (almost) infinite DC gain at the desired frequency, namely 50\/60Hz (or the motor rotating speed). <\/p>\n\n\n\n<p>Proportional resonant controllers offer an alternative to this conventional approach. Indeed, as they operate directly in the stationary reference frame, no coordinate transformations are required. Furthermore, their resonant term(s) offer(s) a finite &#8211; but very high &#8211; gain at the targeted AC frequency, which achieves the same tracking and perturbation rejection capabilities as PI controller(s) in a rotating reference frame (dq-control). <\/p>\n\n\n\n<p>In single-phase systems, the fact that no <a href=\"https:\/\/en.wikipedia.org\/wiki\/Direct-quadrature-zero_transformation\">Park transformation<\/a> is needed is a further and significant benefit, because the formulation of the direct and quadrature axes is not obvious (see <a href=\"https:\/\/imperix.com\/doc\/implementation\/fictive-axis-emulation-fae-for-single-phase-inverter\">TN124<\/a> on fictive axis emulation).<\/p>\n\n\n\n<p>In three-phase systems, controlling unbalanced AC currents and voltages in a stationary reference frame overcomes the need to decouple the controlled variables, which would otherwise be necessary in the rotating reference frame (dq). This presents a significant advantage of the PR controller in a stationary reference frame (abc, or \\(\\alpha \\beta\\)) compared to PI controller(s) in the synchronous reference frame (dq). A typical example of this is found in <a href=\"https:\/\/imperix.com\/doc\/implementation\/active-power-filters-for-harmonics-mitigation\">active power filters<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Operating-principles-of-proportional-resonant-controllers\"><\/span>Operating principles of proportional resonant controllers<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>In essence, the transfer function of proportional resonant (PR) controllers can be derived from a PI controller in the synchronous reference frame (dq) using the Laplace and Park transformations. The result is as follows [1] :<\/p>\n\n\n\n<p>$$ G_{C}(s)=K_{p}+\\displaystyle\\frac{2K_{i}s}{s^{2}+\\omega_{0}^{2}} $$<\/p>\n\n\n\n<p>where \\(\\omega_0\\) designates the target reference current frequency. In this expression, the denominator term \\(s^{2}+\\omega_{0}^{2}\\) creates infinite control gain at \\(\\omega_0\\).<\/p>\n\n\n\n<p>Practically, this expression may be difficult to implement as a digital controller, which is why a more practical alternative is to introduce some damping around the resonant frequency, resulting in:<\/p>\n\n\n\n<p>$$ G_{C}(s)=G_{Cp}(s)+G_{Cr}(s)=K_{p}+\\displaystyle\\frac{2K_{i}\\omega_{c}s}{s^{2}+2\\omega_{c}s+\\omega_{0}^{2}} $$<\/p>\n\n\n\n<p>were&nbsp;\\(\\omega_c\\)&nbsp;designates the resonant cut-off frequency (i.e. width of the resonant filter). <\/p>\n\n\n\n<p>In this second expression, the gain at&nbsp;\\(\\omega_0\\)&nbsp;is now finite, but still high enough to enforce a sufficiently small steady-state error. Interestingly, widening the bandwidth around&nbsp;\\(\\omega_0\\)&nbsp;also offers increased tolerance towards slight frequency deviations, such as in most practical grid-tied applications.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"TN110:ProportionalResonant(PR)control-Digitalimplementation\"><span class=\"ez-toc-section\" id=\"Digital-control-implementation\"><\/span>Digital control implementation<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>A practical implementation can be easily derived using the bilinear (Tustin) transform.&nbsp;The resulting discrete&nbsp;transfer function for the resonant term, discretized with a period&nbsp;\\(T_s\\), yields:<\/p>\n\n\n\n<p>$$ G_{Cr}(z) = \\displaystyle \\frac{Y(z)}{E(z)} = \\displaystyle \\frac{a_{1}(1-z^{-2})}{b_{0}+b_{1}z^{-1}+b_{2}z^{-2} } \\quad\\text{ with }\\quad<br>\\begin{array}{l}<br>a_1=4K_{i}T_{s} \\omega_{c} \\\\<br>b_0=T_{s}^2\\omega_{0}^2+4T_{s}\\omega_{c}+4 \\\\<br>b_1=2T_{s}^2\\omega_{0}^2-8 \\\\<br>b_2=T_{s}^2\\omega_{0}^2-4T_{s}\\omega_{c}+4<br>\\end{array} $$<\/p>\n\n\n\n<p>Once transformed into a difference equation, the resonant part yields:<\/p>\n\n\n\n<p>$$y(k)=\\displaystyle\\frac{1}{b_0}[a_{1}\\cdot e(k)-a_{1}\\cdot e(k-2)-b_{1}\\cdot y(k-1)-b_{2}\\cdot y(k-2)]$$<\/p>\n\n\n\n<p>This difference equation can be easily used for generating run-time code.  The corresponding block diagram is given below and can be easily replicated in Simulink or PLECS. A similar implementation is given in [2].<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"476\" height=\"315\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2024\/04\/PR.png\" alt=\"Implementation of proportional resonant controller \" class=\"wp-image-28237\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2024\/04\/PR.png 476w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2024\/04\/PR-300x199.png 300w\" sizes=\"auto, (max-width: 476px) 100vw, 476px\" \/><figcaption class=\"wp-element-caption\">Proportional resonant controller implementation example<\/figcaption><\/figure>\n<\/div>\n\n\n<p>It is worth noting that the gains \\(b_0, b_1,\\) and \\(b_2\\) depend on the fundamental frequency \\(\\omega_0\\). As such, the PR controller can be made frequency-adaptive by calculating these coefficients at each execution step using frequency estimation methods such as a <a href=\"https:\/\/imperix.com\/doc\/implementation\/sogi-pll\">SOGI-PLL<\/a> for computing \\(\\omega_0\\).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"TN110:ProportionalResonant(PR)control-Tuningandperformanceevaluation\"><span class=\"ez-toc-section\" id=\"Tuning-and-performance-evaluation\"><\/span>Tuning and performance evaluation<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Proportional resonant controllers can be tuned relatively easily. In fact, three gains must be determined: \\(K_p, K_i,\\) and \\(\\omega_c\\). The proportional gain \\(K_p\\) defines the bandwidth and the phase margin in the same way as a PI controller. It can thus be tuned similarly, for example using the <a href=\"https:\/\/imperix.com\/doc\/implementation\/pi-controller\/#MO\">magnitude optimum method<\/a>. The parameters \\(K_i\\) and \\(\\omega_c\\), on the other hand, define the &#8220;height&#8221; and &#8220;width&#8221; of the resonance peak. The following figures show the impact of these parameters on the controller transfer function. Further details regarding the tuning can notably be found in [3].<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"780\" height=\"340\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2024\/04\/Capture-decran-2024-04-30-a-14.54.42-1.png\" alt=\"Transfer function of proportional resonant controller\" class=\"wp-image-28429\" style=\"width:780px;height:340px\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2024\/04\/Capture-decran-2024-04-30-a-14.54.42-1.png 780w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2024\/04\/Capture-decran-2024-04-30-a-14.54.42-1-300x131.png 300w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2024\/04\/Capture-decran-2024-04-30-a-14.54.42-1-768x335.png 768w\" sizes=\"auto, (max-width: 780px) 100vw, 780px\" \/><figcaption class=\"wp-element-caption\">Transfer function of the PR controller with various parameters <\/figcaption><\/figure>\n<\/div>\n\n\n<p>Additionally, the following figure illustrates the step response of the proposed resonant controller for various values of the resonant gain \\(K_i\\).  <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"300\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2024\/04\/PR_KI-3.png\" alt=\"Tuning of proportional resonant controller\" class=\"wp-image-28420\" style=\"width:500px;height:300px\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2024\/04\/PR_KI-3.png 500w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2024\/04\/PR_KI-3-300x180.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><figcaption class=\"wp-element-caption\">Tuning effect of a PR controller<\/figcaption><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"TN110:ProportionalResonant(PR)control-Academicreferences\"><span class=\"ez-toc-section\" id=\"Academic-references\"><\/span>Academic references<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><a href=\"https:\/\/doi.org\/10.1109\/TPEL.2003.810852\">[1]<\/a> D. N. Zmood and D. G. Holmes, &#8220;Stationary frame current regulation of PWM inverters with zero steady-state error,&#8221; in IEEE Trans. on Pow. Elec., Vol. 18, N\u00b0. 3, May 2003.<\/p>\n\n\n\n<p><a href=\"http:\/\/dx.doi.org\/10.1049\/ip-epa:20060008\">[2]<\/a> R. Teodorescu, F. Blaabjerg, M. Liserre and P. C. Loh, \u201cProportional resonant controllers and filters for grid-connected voltage-source converters,\u201d in IEE Proc. on Electr. Power Appl., Vol. 153, N\u00b0. 5, Sep. 2006.<\/p>\n\n\n\n<p><a href=\"https:\/\/doi.org\/10.1109\/TPEL.2009.2029548\">[3]<\/a> D. G. Holmes, T. A. Lipo, B. P. McGrath and W. Y. Kong, \u201cOptimized Design of Stationary Frame Three Phase AC Current Regulators,\u201d in IEEE Trans. on Pow. Elec., Nov. 2009.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"TN110:ProportionalResonant(PR)control-B-Box\/B-Boardimplementation\"><span class=\"ez-toc-section\" id=\"B-Box-B-Board-implementation\"><\/span>B-Box \/ B-Board implementation<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"TN110:ProportionalResonant(PR)control-Simulink\"><span class=\"ez-toc-section\" id=\"Simulink\"><\/span>Simulink<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<div class=\"wp-block-file aligncenter\"><a href=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/TN110_PR_Controller_Simulink.zip\" class=\"wp-block-file__button wp-element-button\" download>Download Simulink model <strong>TN110_PR_Controller<\/strong><\/a><\/div>\n\n\n\n<p>The Simulink model provided above contains a subsystem that uses the above-presented resonant controller implementation. This block can easily be integrated into any control algorithm. Besides, the provided dialog box offers simple configuration parameters.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"613\" height=\"376\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2024\/04\/Simulink-2.png\" alt=\"Simulink implementation of proportional resonant controller\" class=\"wp-image-28433\" style=\"width:460px;height:282px\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2024\/04\/Simulink-2.png 613w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2024\/04\/Simulink-2-300x184.png 300w\" sizes=\"auto, (max-width: 613px) 100vw, 613px\" \/><figcaption class=\"wp-element-caption\">Proposed Simulink implementation of the discrete PR controller<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"424\" height=\"246\" src=\"https:\/\/cdn.imperix.com\/doc\/wp-content\/uploads\/2021\/03\/PR_mask_parameters.png\" alt=\"PR controller parameters\" class=\"wp-image-5123\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/PR_mask_parameters.png 424w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/PR_mask_parameters-300x174.png 300w\" sizes=\"auto, (max-width: 424px) 100vw, 424px\" \/><figcaption class=\"wp-element-caption\">PR controller parameters<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"TN110:ProportionalResonant(PR)control-C\/C++code\"><span class=\"ez-toc-section\" id=\"CC-code\"><\/span>C\/C++ code<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<p>The imperix IDE gives access to a library containing numerous pre-written and pre-optimized functions. Controllers such as P, PI, PID and PR are already available and can be found in the&nbsp;<code>controllers.h\/.cpp<\/code>&nbsp;files.<\/p>\n\n\n\n<p>As for all controllers, proportional resonant controllers are based on:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A pseudo-object&nbsp;<code>PRcontroller<\/code>, which contains pre-computed parameters as well as state variables.<\/li>\n\n\n\n<li>A configuration function, meant to be called during&nbsp;<code>UserInit()<\/code>, named&nbsp;<code>ConfigPrController()<\/code>.<\/li>\n\n\n\n<li>A run-time function, meant to be called during the user-level ISR, such as&nbsp;<code>UserInterrupt()<\/code>, named&nbsp;<code>RunPrController()<\/code>.<\/li>\n<\/ul>\n\n\n\n<p>The necessary parameters are documented within the controller.h header file. They are namely:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Kp<\/code>&nbsp;and&nbsp;<code>Ki<\/code>, proportional and integral gain, respectively.<\/li>\n\n\n\n<li><code>wres<\/code>, which is the nominal frequency (center of the resonant term, in rad\/s.), as well as&nbsp;<code>wdamp<\/code> , the &#8220;width&#8221; of the resonant term (limits the quality factor of the resonant term).<\/li>\n\n\n\n<li><code>tsample<\/code>, corresponding to the sampling (interrupt) period.<\/li>\n<\/ul>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"253\" height=\"483\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/Imperix-Cpp-IDE.png\" alt=\"Imperix CPP IDE\" class=\"wp-image-101\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/Imperix-Cpp-IDE.png 253w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/Imperix-Cpp-IDE-157x300.png 157w\" sizes=\"auto, (max-width: 253px) 100vw, 253px\" \/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Implementation-example\"><\/span>Implementation example<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">\"..\/API\/controllers.h\"<\/span><\/span>\nPrController mycontroller;   <span class=\"hljs-meta\">#resonant controller object<\/span>\n \n<span class=\"hljs-keyword\">float<\/span> Kp = <span class=\"hljs-number\">10.0<\/span>;\n<span class=\"hljs-keyword\">float<\/span> Ki = <span class=\"hljs-number\">500.0<\/span>;\n<span class=\"hljs-keyword\">float<\/span> w0 = TWO_PI*<span class=\"hljs-number\">50.0<\/span>;\n<span class=\"hljs-keyword\">float<\/span> wc = <span class=\"hljs-number\">10.0<\/span>;\n \n<span class=\"hljs-function\">tUserSafe <span class=\"hljs-title\">UserInit<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">void<\/span>)<\/span>\n<\/span>{\n    ConfigPrController(&amp;mycontroller, Kp, Ki, w0, wc, SAMPLING_PERIOD);\n    <span class=\"hljs-keyword\">return<\/span> SAFE;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-function\">tUserSafe <span class=\"hljs-title\">UserInterrupt<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">void<\/span>)<\/span>\n<\/span>{\n    <span class=\"hljs-comment\">\/\/... some code<\/span>\n    Evsi = Vgrid + RunPrController(&amp;mycontroller, Igrid_ref - Igrid);\n    <span class=\"hljs-comment\">\/\/... some code<\/span>\n    <span class=\"hljs-keyword\">return<\/span> SAFE;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Experimental-results\"><\/span>Experimental results<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>In order to illustrate the performance of the proposed PR controller implementation, current control results are shown below. A current reference step is performed both in simulation (dark red) as well as using an experimental setup (light red). The following graphs show a comparison between both results :<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"780\" height=\"300\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2024\/04\/PR_EXP-1.png\" alt=\"Experimental results of proportional resonant controller\" class=\"wp-image-28419\" style=\"width:780px;height:300px\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2024\/04\/PR_EXP-1.png 780w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2024\/04\/PR_EXP-1-300x115.png 300w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2024\/04\/PR_EXP-1-768x295.png 768w\" sizes=\"auto, (max-width: 780px) 100vw, 780px\" \/><figcaption class=\"wp-element-caption\">Experimental results of a current reference step with PR controller<\/figcaption><\/figure>\n<\/div>\n\n\n<p>As it can be seen, the current matches the given reference in steady state. However, slight discrepancies between simulation and experimental results are observed due to harmonic distortions present on the grid. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>A proportional resonant control can be seen as the implementation of PI controllers within a rotating reference frame (dq), which allows to re-locate the infinite DC gain at desired frequency.<\/p>\n","protected":false},"author":22,"featured_media":28702,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[4],"tags":[53],"software-environments":[105,103],"provided-results":[108,107],"related-products":[50,31,32,92,166,51,113,112,111,110],"guidedreadings":[],"tutorials":[152,132,128],"user-manuals":[],"coauthors":[98,69],"class_list":["post-171","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-implementation","tag-current-control","software-environments-c-plus-plus","software-environments-matlab","provided-results-experimental","provided-results-simulation","related-products-acg-sdk","related-products-b-board-pro","related-products-b-box-rcp","related-products-b-box-micro","related-products-b-box-rcp-3-0","related-products-cpp-sdk","related-products-mmc","related-products-peb","related-products-pm","related-products-tpi","tutorials-active-power-filter","tutorials-back-to-back-three-phase-converter-with-grid-tied-lcl-filter","tutorials-single-phase-totem-pole-pfc-rectifier"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Proportional resonant controller - digital implementation - imperix<\/title>\n<meta name=\"description\" content=\"A proportional resonant controller can be seen as a variant of a PI controller that offer infinite gain at the desired frequency.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Proportional resonant controller - digital implementation - imperix\" \/>\n<meta property=\"og:description\" content=\"A proportional resonant controller can be seen as a variant of a PI controller that offer infinite gain at the desired frequency.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller\" \/>\n<meta property=\"og:site_name\" content=\"imperix\" \/>\n<meta property=\"article:published_time\" content=\"2021-03-23T11:00:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-05T07:39:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/3_2_ratio_TN110_2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"450\" \/>\n\t<meta property=\"og:image:height\" content=\"300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Antonin Stampbach, Nicolas Cherix\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Antonin Stampbach, Nicolas Cherix\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/implementation\\\/proportional-resonant-controller#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/implementation\\\/proportional-resonant-controller\"},\"author\":{\"name\":\"Antonin Stampbach\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#\\\/schema\\\/person\\\/1338476cb17e45ff388f2d9915cb27f9\"},\"headline\":\"Proportional resonant controller\",\"datePublished\":\"2021-03-23T11:00:21+00:00\",\"dateModified\":\"2025-06-05T07:39:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/implementation\\\/proportional-resonant-controller\"},\"wordCount\":1371,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/implementation\\\/proportional-resonant-controller#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/imperix.com\\\/doc\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/3_2_ratio_TN110_2.png\",\"keywords\":[\"Current control\"],\"articleSection\":[\"Technical notes\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/imperix.com\\\/doc\\\/implementation\\\/proportional-resonant-controller#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/implementation\\\/proportional-resonant-controller\",\"url\":\"https:\\\/\\\/imperix.com\\\/doc\\\/implementation\\\/proportional-resonant-controller\",\"name\":\"Proportional resonant controller - digital implementation - imperix\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/implementation\\\/proportional-resonant-controller#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/implementation\\\/proportional-resonant-controller#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/imperix.com\\\/doc\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/3_2_ratio_TN110_2.png\",\"datePublished\":\"2021-03-23T11:00:21+00:00\",\"dateModified\":\"2025-06-05T07:39:32+00:00\",\"description\":\"A proportional resonant controller can be seen as a variant of a PI controller that offer infinite gain at the desired frequency.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/implementation\\\/proportional-resonant-controller#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/imperix.com\\\/doc\\\/implementation\\\/proportional-resonant-controller\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/implementation\\\/proportional-resonant-controller#primaryimage\",\"url\":\"https:\\\/\\\/imperix.com\\\/doc\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/3_2_ratio_TN110_2.png\",\"contentUrl\":\"https:\\\/\\\/imperix.com\\\/doc\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/3_2_ratio_TN110_2.png\",\"width\":450,\"height\":300},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/implementation\\\/proportional-resonant-controller#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Knowledge base\",\"item\":\"https:\\\/\\\/imperix.com\\\/doc\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Technical notes\",\"item\":\"https:\\\/\\\/imperix.com\\\/doc\\\/category\\\/implementation\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Proportional resonant controller\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#website\",\"url\":\"https:\\\/\\\/imperix.com\\\/doc\\\/\",\"name\":\"imperix\",\"description\":\"power electronics\",\"publisher\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/imperix.com\\\/doc\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#organization\",\"name\":\"imperix\",\"url\":\"https:\\\/\\\/imperix.com\\\/doc\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/imperix.com\\\/doc\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/imperix_logo.png\",\"contentUrl\":\"https:\\\/\\\/imperix.com\\\/doc\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/imperix_logo.png\",\"width\":350,\"height\":120,\"caption\":\"imperix\"},\"image\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#\\\/schema\\\/person\\\/1338476cb17e45ff388f2d9915cb27f9\",\"name\":\"Antonin Stampbach\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7d8f93c1670fdefaa99799c00f0c32d11f451231460aa951bbd0c5b7377748df?s=96&d=mm&r=g7aa81252baa6af2f21d9ab24227e4a4c\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7d8f93c1670fdefaa99799c00f0c32d11f451231460aa951bbd0c5b7377748df?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7d8f93c1670fdefaa99799c00f0c32d11f451231460aa951bbd0c5b7377748df?s=96&d=mm&r=g\",\"caption\":\"Antonin Stampbach\"},\"description\":\"Antonin is a development engineer at Imperix. On the knowledge base, he is the author of numerous articles on the control and operation of grid-connected inverters.\",\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/in\\\/antonin-stampbach-a75a87205\"],\"url\":\"https:\\\/\\\/imperix.com\\\/doc\\\/author\\\/stampbach\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Proportional resonant controller - digital implementation - imperix","description":"A proportional resonant controller can be seen as a variant of a PI controller that offer infinite gain at the desired frequency.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller","og_locale":"en_US","og_type":"article","og_title":"Proportional resonant controller - digital implementation - imperix","og_description":"A proportional resonant controller can be seen as a variant of a PI controller that offer infinite gain at the desired frequency.","og_url":"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller","og_site_name":"imperix","article_published_time":"2021-03-23T11:00:21+00:00","article_modified_time":"2025-06-05T07:39:32+00:00","og_image":[{"width":450,"height":300,"url":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/3_2_ratio_TN110_2.png","type":"image\/png"}],"author":"Antonin Stampbach, Nicolas Cherix","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Antonin Stampbach, Nicolas Cherix","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller#article","isPartOf":{"@id":"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller"},"author":{"name":"Antonin Stampbach","@id":"https:\/\/imperix.com\/doc\/#\/schema\/person\/1338476cb17e45ff388f2d9915cb27f9"},"headline":"Proportional resonant controller","datePublished":"2021-03-23T11:00:21+00:00","dateModified":"2025-06-05T07:39:32+00:00","mainEntityOfPage":{"@id":"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller"},"wordCount":1371,"commentCount":2,"publisher":{"@id":"https:\/\/imperix.com\/doc\/#organization"},"image":{"@id":"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller#primaryimage"},"thumbnailUrl":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/3_2_ratio_TN110_2.png","keywords":["Current control"],"articleSection":["Technical notes"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller#respond"]}]},{"@type":"WebPage","@id":"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller","url":"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller","name":"Proportional resonant controller - digital implementation - imperix","isPartOf":{"@id":"https:\/\/imperix.com\/doc\/#website"},"primaryImageOfPage":{"@id":"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller#primaryimage"},"image":{"@id":"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller#primaryimage"},"thumbnailUrl":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/3_2_ratio_TN110_2.png","datePublished":"2021-03-23T11:00:21+00:00","dateModified":"2025-06-05T07:39:32+00:00","description":"A proportional resonant controller can be seen as a variant of a PI controller that offer infinite gain at the desired frequency.","breadcrumb":{"@id":"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller#primaryimage","url":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/3_2_ratio_TN110_2.png","contentUrl":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/3_2_ratio_TN110_2.png","width":450,"height":300},{"@type":"BreadcrumbList","@id":"https:\/\/imperix.com\/doc\/implementation\/proportional-resonant-controller#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Knowledge base","item":"https:\/\/imperix.com\/doc\/"},{"@type":"ListItem","position":2,"name":"Technical notes","item":"https:\/\/imperix.com\/doc\/category\/implementation"},{"@type":"ListItem","position":3,"name":"Proportional resonant controller"}]},{"@type":"WebSite","@id":"https:\/\/imperix.com\/doc\/#website","url":"https:\/\/imperix.com\/doc\/","name":"imperix","description":"power electronics","publisher":{"@id":"https:\/\/imperix.com\/doc\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/imperix.com\/doc\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/imperix.com\/doc\/#organization","name":"imperix","url":"https:\/\/imperix.com\/doc\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/imperix.com\/doc\/#\/schema\/logo\/image\/","url":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/imperix_logo.png","contentUrl":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/imperix_logo.png","width":350,"height":120,"caption":"imperix"},"image":{"@id":"https:\/\/imperix.com\/doc\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/imperix.com\/doc\/#\/schema\/person\/1338476cb17e45ff388f2d9915cb27f9","name":"Antonin Stampbach","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/7d8f93c1670fdefaa99799c00f0c32d11f451231460aa951bbd0c5b7377748df?s=96&d=mm&r=g7aa81252baa6af2f21d9ab24227e4a4c","url":"https:\/\/secure.gravatar.com\/avatar\/7d8f93c1670fdefaa99799c00f0c32d11f451231460aa951bbd0c5b7377748df?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7d8f93c1670fdefaa99799c00f0c32d11f451231460aa951bbd0c5b7377748df?s=96&d=mm&r=g","caption":"Antonin Stampbach"},"description":"Antonin is a development engineer at Imperix. On the knowledge base, he is the author of numerous articles on the control and operation of grid-connected inverters.","sameAs":["https:\/\/www.linkedin.com\/in\/antonin-stampbach-a75a87205"],"url":"https:\/\/imperix.com\/doc\/author\/stampbach"}]}},"_links":{"self":[{"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/posts\/171","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/users\/22"}],"replies":[{"embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/comments?post=171"}],"version-history":[{"count":97,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/posts\/171\/revisions"}],"predecessor-version":[{"id":43470,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/posts\/171\/revisions\/43470"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/media\/28702"}],"wp:attachment":[{"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/media?parent=171"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/categories?post=171"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/tags?post=171"},{"taxonomy":"software-environments","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/software-environments?post=171"},{"taxonomy":"provided-results","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/provided-results?post=171"},{"taxonomy":"related-products","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/related-products?post=171"},{"taxonomy":"guidedreadings","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/guidedreadings?post=171"},{"taxonomy":"tutorials","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/tutorials?post=171"},{"taxonomy":"user-manuals","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/user-manuals?post=171"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/coauthors?post=171"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}