{"id":941,"date":"2021-03-29T09:24:18","date_gmt":"2021-03-29T09:24:18","guid":{"rendered":"https:\/\/imperix.com\/doc\/?p=941"},"modified":"2025-05-08T07:49:55","modified_gmt":"2025-05-08T07:49:55","slug":"using-the-angle-decoder-modules","status":"publish","type":"post","link":"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules","title":{"rendered":"Using the angle decoder modules"},"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\/help\/using-the-angle-decoder-modules\/#Technical-resources\" >Technical resources<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules\/#Incremental-encoder\" >Incremental encoder<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules\/#Decoder\" >Decoder<\/a><\/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\/help\/using-the-angle-decoder-modules\/#Computing-angular-speed\" >Computing angular speed<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules\/#Initialization-of-the-rotor-position\" >Initialization of the rotor position<\/a><\/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\/help\/using-the-angle-decoder-modules\/#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-7\" href=\"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules\/#Simulink\" >Simulink<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules\/#PLECS\" >PLECS<\/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\/help\/using-the-angle-decoder-modules\/#CC-code\" >C\/C++ code<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n\n<p>This document provides instructions on how to interface an incremental encoder with a <a href=\"https:\/\/imperix.com\/products\/control\/bbox\">B-Box RCP<\/a> or a <a href=\"https:\/\/imperix.com\/products\/control\/bboard\">B-Board PRO<\/a> and how to read the motor rotor position using the angle decoder modules. It also presents a simple and effective way to derive an angular velocity from the measured angle.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Technical-resources\"><\/span>Technical resources<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/imperix.com\/wp-content\/uploads\/document\/B-Box_Datasheet.pdf\">B-Box datasheet<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/imperix.com\/wp-content\/uploads\/document\/B-Board_Datasheet.pdf\">B-Board datasheet<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/imperix.com\/doc\/uncategorized\/dec-angle-decoder\">DEC &#8211; Angle decoder function block<\/a><\/li>\n\n\n\n<li>Implementation example: <a href=\"https:\/\/imperix.com\/doc\/implementation\/field-oriented-control-of-permanent-magnet-synchronous-machine\">Field-oriented control of permanent magnet synchronous machine<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Incremental-encoder\"><\/span>Incremental encoder<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>In drive applications, the knowledge of both the rotor angular position and angular speed is a central point to achieve oriented vector control and robust speed control. These two variables can either be measured (sensored) or estimated (sensorless).<\/p>\n\n\n\n<p>In sensored applications, one possible way of measuring the rotor position is by using incremental encoders. They notably differ from absolute encoders in that the latter provides an absolute position, often coded in <a href=\"https:\/\/en.wikipedia.org\/wiki\/Gray_code\">Gray code<\/a>. Incremental encoders, on the contrary, provide only incremental position changes and an interface is needed to compute the rotor absolute position. This is the purpose of the decoder module available on the B-Box RCP and B-Board PRO.<\/p>\n\n\n\n<p>The most common incremental encoders are quadrature encoders. They produce quadrature signals <em>A<\/em> and <em>B<\/em>, allowing to deduce the direction of rotation, depending on which signal is leading. Optionally, a reset signal <em>Z<\/em> is present to provide an absolute position (one pulse per turn). Finally, to offer more robustness against perturbations, some encoders provide also the complementary signals <em>\\A<\/em>, <em>\\B<\/em> and <em>\\Z<\/em>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">References<\/h4>\n\n\n\n<p>[1] Encoder Products Company, \u201cWP-2011: The Basics of How an Encoder Works\u201c, White paper, March 2018<br>[2] Autonics, \u201cRotary encoders &#8211; Technical description\u201d, Feb 2018<\/p>\n\n\n\n<div class=\"wp-block-simple-alerts-for-gutenberg-alert-boxes sab-alert sab-alert-info\" role=\"alert\">Given that the\u00a0<a href=\"https:\/\/imperix.com\/doc\/uncategorized\/dec-angle-decoder\">DEC &#8211; Angle decoder<\/a> is fully configurable, it should accommodate a wide range of commercially available sensors, provided that their output voltage level is compatible as well. As an example, CFS50 series from Sick is fully supported.<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Decoder\"><\/span>Decoder<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>The decoder modules present on the B-Box RCP and B-Board PRO are meant to decode the angle information from a <strong>quadrature incremental encoder<\/strong>, with or without <em>Z <\/em>signal and with or without complementary signals. They offer the following configuration parameters:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><th><strong>Parameter<\/strong><\/th><th><strong>Possible values<\/strong><\/th><th><strong>Remark<\/strong><\/th><\/tr><tr><td>Input mode<\/td><td>Single-ended \/ Differential<\/td><td>If <em>Differential<\/em>, the complementary signals are also considered<\/td><\/tr><tr><td>Pulse per rotation (ppr)<\/td><td>Between 1 and 65536<\/td><td>Must correspond to the encoder specifications<\/td><\/tr><tr><td>Reset mode<\/td><td>Maximum value \/ Z input<\/td><td>If <em>Maximum value, <\/em>the decoder counter is reset when it reaches the ppr value. Otherwise, it\u2019s reset on a rising edge of the <em>Z<\/em> signal.<\/td><\/tr><tr><td>Direction<\/td><td>Clockwise \/ Counterclockwise<\/td><td>If<em> Clockwise <\/em>and <em>A<\/em> is leading, the angle increases<\/td><\/tr><tr><td>Invert input signals<\/td><td>No \/ Yes<\/td><td>If <em>Yes<\/em>, all the inputs signals are inverted<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>The decoder driver is implemented in FPGA with the following logic:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"633\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-169-1024x633.png\" alt=\"FPGA logic diagram of the motor angle decoder\" class=\"wp-image-942\" style=\"width:800px\" title=\"Product notes &gt; PN104: Using the angle decoder modules &gt; DEC_FPGA.png\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-169-1024x633.png 1024w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-169-300x185.png 300w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-169-768x474.png 768w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-169.png 1261w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">FPGA logic diagram of one angle decoder module<\/figcaption><\/figure>\n\n\n\n<p>There are a total of 4 decoder modules on each B-Box or B-Board. The encoder signals have to be connected to the GPI inputs of the device, using the following pins:<\/p>\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\">\n<figure class=\"wp-block-table\"><table><tbody><tr><th class=\"has-text-align-left\" data-align=\"left\"><strong>Conn. pin<\/strong><\/th><th class=\"has-text-align-left\" data-align=\"left\"><strong>GPI signal<\/strong><\/th><th class=\"has-text-align-left\" data-align=\"left\"><strong>DEC signal<\/strong><\/th><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">A2<\/td><td class=\"has-text-align-left\" data-align=\"left\">GPI 0<\/td><td class=\"has-text-align-left\" data-align=\"left\">A0<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">A3<\/td><td class=\"has-text-align-left\" data-align=\"left\">GPI 1<\/td><td class=\"has-text-align-left\" data-align=\"left\">B0<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">A4<\/td><td class=\"has-text-align-left\" data-align=\"left\">GPI 2<\/td><td class=\"has-text-align-left\" data-align=\"left\">Z0<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">A5<\/td><td class=\"has-text-align-left\" data-align=\"left\">GPI 3<\/td><td class=\"has-text-align-left\" data-align=\"left\">A1 or \\A0<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">A6<\/td><td class=\"has-text-align-left\" data-align=\"left\">GPI 4<\/td><td class=\"has-text-align-left\" data-align=\"left\">B1 or \\B0<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">A7<\/td><td class=\"has-text-align-left\" data-align=\"left\">GPI 5<\/td><td class=\"has-text-align-left\" data-align=\"left\">Z1 or \\Z0<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-table\"><table><tbody><tr><th class=\"has-text-align-left\" data-align=\"left\"><strong>Conn. pin<\/strong><\/th><th class=\"has-text-align-left\" data-align=\"left\"><strong>GPI signal<\/strong><\/th><th class=\"has-text-align-left\" data-align=\"left\"><strong>DEC signal<\/strong><\/th><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">B2<\/td><td class=\"has-text-align-left\" data-align=\"left\">GPI 8<\/td><td class=\"has-text-align-left\" data-align=\"left\">A2<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">B3<\/td><td class=\"has-text-align-left\" data-align=\"left\">GPI 9<\/td><td class=\"has-text-align-left\" data-align=\"left\">B2<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">B4<\/td><td class=\"has-text-align-left\" data-align=\"left\">GPI 10<\/td><td class=\"has-text-align-left\" data-align=\"left\">Z2<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">B5<\/td><td class=\"has-text-align-left\" data-align=\"left\">GPI 11<\/td><td class=\"has-text-align-left\" data-align=\"left\">A3 or \\A2<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">B6<\/td><td class=\"has-text-align-left\" data-align=\"left\">GPI 12<\/td><td class=\"has-text-align-left\" data-align=\"left\">B3 or \\B2<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">B7<\/td><td class=\"has-text-align-left\" data-align=\"left\">GPI 13<\/td><td class=\"has-text-align-left\" data-align=\"left\">Z3 or \\Z2<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-simple-alerts-for-gutenberg-alert-boxes sab-alert sab-alert-info\" role=\"alert\">For operation with the B-Box RCP, imperix provides a handy breakout board for the digital signal connectors, available <a href=\"https:\/\/imperix.com\/products\/control\/accessories\">here<\/a>.<br><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"727\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-170-1024x727.png\" alt=\"VHDCI breakout board\" class=\"wp-image-943\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-170-1024x727.png 1024w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-170-300x213.png 300w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-170-768x545.png 768w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-170.png 1246w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-simple-alerts-for-gutenberg-alert-boxes sab-alert sab-alert-warning\" role=\"alert\">For operation with the B-Board PRO and a <a href=\"https:\/\/imperix.com\/doc\/help\/b-board-pro-carrier-board\">custom carrier board<\/a>, the designer must make sure to use the appropriate pins so that the DEC functions are available.<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Computing-angular-speed\"><\/span>Computing angular speed<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>The angular speed can be derived from the angle information, directly inside the user application. The angular speed being the derivative of the angle, it can be computed as the variation of the measured angle between two consecutive samples:<\/p>\n\n\n\n<p>$$ \\omega_m(k) = \\displaystyle\\frac{\\theta_m(k)-\\theta_m(k-1)}{T_s} $$<\/p>\n\n\n\n<p>As the measured angle is in the range \\(\\left[ 0; 2\\pi\\right]\\), its value jumps from \\(2\\pi\\) to \\(0\\). These discontinuities can be compensated as follows:<\/p>\n\n\n\n<p>$$ \\omega_m(k) = \\left\\{\\begin{array}{ll} (\\theta_m(k)-\\theta_m(k-1)+2\\pi)\/T_s &amp; \\text{if } \\theta_m(k)-\\theta_m(k-1) &lt; -\\pi\\\\ (\\theta_m(k)-\\theta_m(k-1)-2\\pi)\/T_s &amp; \\text{if } \\theta_m(k)-\\theta_m(k-1) &gt; \\pi\\\\ (\\theta_m(k)-\\theta_m(k-1))\/T_s &amp; \\text{otherwise} \\end{array}\\right. $$<\/p>\n\n\n\n<p>Oftentimes, the speed value needs to be filtered to minimize the effect of the quantization error of the angle encoder. A simple filtering solution is by using an IIR filter, with the following transfer function:<\/p>\n\n\n\n<p>$$ H(z) = \\displaystyle\\frac{\\alpha}{1+(\\alpha-1)z^{-1}} $$<\/p>\n\n\n\n<p>The \\(\\alpha\\) parameter depends on the filter cutoff frequency \\(f_c = 1\/(2\\pi t_c)\\) and the sampling period \\(T_s\\) (i.e. execution rate of the filter):<\/p>\n\n\n\n<p>$$ \\alpha = \\displaystyle\\frac{T_s}{t_c+T_s} = \\frac{2\\pi f_c T_s}{1+2\\pi f_c T_s} $$<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Initialization-of-the-rotor-position\"><\/span>Initialization of the rotor position<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>The Z signal of an incremental encoder gives a reference for the rotor position, allowing the decoder to provide an absolute rotor angle, once initialized. However, there is no guarantee that this reference corresponds to 0 rad electrically. A possible way to initialize the rotor position is to proceed manually:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Before energizing the converter, one complete rotation of the rotor is done manually to reset the decoder counter with a pulse on the\u00a0<em>Z<\/em>\u00a0signal.<\/li>\n\n\n\n<li>The converter is energized (DC bus charged) and a current (typically 0.5 p.u.) is applied to the phase\u00a0<em>a<\/em>\u00a0of the motor. This will align the rotor with one of the poles of phase\u00a0<em>a<\/em>.<\/li>\n\n\n\n<li>The offset of the measured angle is compensated, in order to measure 0 rad when the rotor is aligned with phase\u00a0<em>a<\/em>\u00a0(i.e. when the permanent magnet flux is completely along the \u03b1-axis).<\/li>\n<\/ol>\n\n\n\n<p>Other initialization methods are of course possible. The above procedure has the advantage of being extremely simple to set up and is applicable to most drive testbenches.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><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\"><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-simple-alerts-for-gutenberg-alert-boxes sab-alert sab-alert-info\" role=\"alert\">The dedicated Simulink block is described in\u00a0<a href=\"https:\/\/imperix.com\/doc\/uncategorized\/dec-angle-decoder\">DEC &#8211; Angle decoder<\/a>.<\/div>\n\n\n\n<p>The decoder block (DEC) provides the measured angle. As such, the speed can also be derived as follows:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"513\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-171-1024x513.png\" alt=\"Simulink implementation of angle decoder\" class=\"wp-image-945\" style=\"width:629px;height:315px\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-171-1024x513.png 1024w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-171-300x150.png 300w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-171-768x385.png 768w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-171.png 1392w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>The following function accounts for discontinuities in the measured angle:<\/p>\n\n\n\n<p class=\"has-text-align-center\"><code>f(u) = u(1)+2*pi*((u(1)-u(2))&lt;-pi)-2*pi*((u(1)-u(2)&gt;pi))<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"PLECS\"><\/span>PLECS<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<div class=\"wp-block-simple-alerts-for-gutenberg-alert-boxes sab-alert sab-alert-info\" role=\"alert\">The dedicated PLECS blocks is described in\u00a0<a href=\"https:\/\/imperix.com\/doc\/uncategorized\/dec-angle-decoder\">DEC &#8211; Angle decoder<\/a>.<\/div>\n\n\n\n<p>Similarly to the Simulink implementation, the decoder block (DEC) can be used as follows:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"936\" height=\"285\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-172.png\" alt=\"PLECS implementation of angle decoder\" class=\"wp-image-946\" style=\"width:459px;height:139px\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-172.png 936w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-172-300x91.png 300w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-172-768x234.png 768w\" sizes=\"auto, (max-width: 936px) 100vw, 936px\" \/><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"198\" src=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-173-1024x198.png\" alt=\"Computation of the rotor speed in PLECS\" class=\"wp-image-947\" style=\"width:642px;height:124px\" srcset=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-173-1024x198.png 1024w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-173-300x58.png 300w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-173-768x148.png 768w, https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/image-173.png 1397w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>The following function accounts for discontinuities in the measured angle:<\/p>\n\n\n\n<p class=\"has-text-align-center\"><code>f(u) = u(1)+2*pi*((u(1)-u(2))&lt;-pi)-2*pi*((u(1)-u(2)&gt;pi))<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><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-simple-alerts-for-gutenberg-alert-boxes sab-alert sab-alert-info\" role=\"alert\">The corresponding C\/C++ routines are described in\u00a0<a href=\"https:\/\/imperix.com\/doc\/uncategorized\/dec-angle-decoder\">DEC &#8211; Angle decoder<\/a>.<\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Implementation example<\/h4>\n\n\n\n<p>In <code>UserInit<\/code>: configuration of a differential decoder, with 4096 pulses per rotation and Z signal:<\/p>\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-function\">tUserSafe <span class=\"hljs-title\">UserInit<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">void<\/span>)<\/span>\n<\/span>{ \n  <span class=\"hljs-comment\">\/\/ ... <\/span>\n\n  <span class=\"hljs-comment\">\/\/ Configuration of the decoder (angle measurement) <\/span>\n  Dec_ConfigureInputMode(DECODER_CHANNEL_0, DIFFERENTIAL); \n  Dec_ConfigurePulsePerRotation(DECODER_CHANNEL_0, <span class=\"hljs-number\">4096<\/span>); \n  Dec_ConfigureResetMode(DECODER_CHANNEL_0, ZINPUT); \n  \n  <span class=\"hljs-comment\">\/\/ ... <\/span>\n}\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\n<p>In the main interrupt <code>UserInterrupt<\/code>: get the measured angle and compute the speed. An angle offset can be added to the measured angle to match the angle reference with the application.<\/p>\n\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\">\/\/ ... <\/span>\n\n  <span class=\"hljs-comment\">\/\/ Get angle from decoder module <\/span>\n  angle_meas = Dec_GetAngle(DECODER_CHANNEL_0) + angle_offset; \n\n  <span class=\"hljs-comment\">\/\/ Speed measurement <\/span>\n  speed_meas_raw = ComputeSpeed(angle_meas, previous_angle); \n  previous_angle = angle_meas; \n  <span class=\"hljs-comment\">\/\/ Low-pass filter measured speed <\/span>\n  speed_meas = speed_meas - (alpha * (speed_meas - speed_meas_raw)); \n\n  <span class=\"hljs-comment\">\/\/ ... <\/span>\n} \n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">float<\/span> <span class=\"hljs-title\">ComputeSpeed<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">float<\/span> current_angle, <span class=\"hljs-keyword\">float<\/span> previous_angle)<\/span> \n<\/span>{ \n  <span class=\"hljs-keyword\">float<\/span> corr = <span class=\"hljs-number\">0.0<\/span>; \n\n  <span class=\"hljs-keyword\">if<\/span> (current_angle - previous_angle &lt; -PI) \n    corr = <span class=\"hljs-number\">2<\/span>*PI; \n  <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (current_angle - previous_angle &gt; PI) \n    corr = <span class=\"hljs-number\">-2<\/span>*PI; \n\n  <span class=\"hljs-keyword\">return<\/span> (current_angle - previous_angle + corr)\/SAMPLING_PERIOD; \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>","protected":false},"excerpt":{"rendered":"<p>This document provides instructions on how to interface an incremental encoder with a B-Box RCP or a B-Board PRO and how to read the motor&#8230;<\/p>\n","protected":false},"author":2,"featured_media":2993,"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":[3],"tags":[],"software-environments":[105,103,104],"provided-results":[],"related-products":[50,31,32,92,166,51],"guidedreadings":[],"tutorials":[],"user-manuals":[147],"coauthors":[63],"class_list":["post-941","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-help","software-environments-c-plus-plus","software-environments-matlab","software-environments-plecs","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","user-manuals-motor-testbench"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Using the angle decoder modules - imperix<\/title>\n<meta name=\"description\" content=\"This notes presents how to use the angle decoder modules of the B-Box and B-Board controllers to read the rotor position of a motor.\" \/>\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\/help\/using-the-angle-decoder-modules\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using the angle decoder modules - imperix\" \/>\n<meta property=\"og:description\" content=\"This notes presents how to use the angle decoder modules of the B-Box and B-Board controllers to read the rotor position of a motor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules\" \/>\n<meta property=\"og:site_name\" content=\"imperix\" \/>\n<meta property=\"article:published_time\" content=\"2021-03-29T09:24:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-05-08T07:49:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/3_2_ratio_PN104.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=\"Julien Orsinger\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Julien Orsinger\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/using-the-angle-decoder-modules#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/using-the-angle-decoder-modules\"},\"author\":{\"name\":\"Julien Orsinger\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#\\\/schema\\\/person\\\/65ef663818eab76f53cc627ab80e0a51\"},\"headline\":\"Using the angle decoder modules\",\"datePublished\":\"2021-03-29T09:24:18+00:00\",\"dateModified\":\"2025-05-08T07:49:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/using-the-angle-decoder-modules\"},\"wordCount\":1150,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/using-the-angle-decoder-modules#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/imperix.com\\\/doc\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/3_2_ratio_PN104.png\",\"articleSection\":[\"Product notes\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/using-the-angle-decoder-modules#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/using-the-angle-decoder-modules\",\"url\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/using-the-angle-decoder-modules\",\"name\":\"Using the angle decoder modules - imperix\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/using-the-angle-decoder-modules#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/using-the-angle-decoder-modules#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/imperix.com\\\/doc\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/3_2_ratio_PN104.png\",\"datePublished\":\"2021-03-29T09:24:18+00:00\",\"dateModified\":\"2025-05-08T07:49:55+00:00\",\"description\":\"This notes presents how to use the angle decoder modules of the B-Box and B-Board controllers to read the rotor position of a motor.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/using-the-angle-decoder-modules#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/using-the-angle-decoder-modules\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/using-the-angle-decoder-modules#primaryimage\",\"url\":\"https:\\\/\\\/imperix.com\\\/doc\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/3_2_ratio_PN104.png\",\"contentUrl\":\"https:\\\/\\\/imperix.com\\\/doc\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/3_2_ratio_PN104.png\",\"width\":450,\"height\":300,\"caption\":\"Simulink implementation of angle decoder\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/imperix.com\\\/doc\\\/help\\\/using-the-angle-decoder-modules#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Knowledge base\",\"item\":\"https:\\\/\\\/imperix.com\\\/doc\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Product notes\",\"item\":\"https:\\\/\\\/imperix.com\\\/doc\\\/category\\\/help\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Using the angle decoder modules\"}]},{\"@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\\\/65ef663818eab76f53cc627ab80e0a51\",\"name\":\"Julien Orsinger\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0a0328b09c6abe61fa1e263a1066dcb26ea8f3b9e8b1d78056047620947bb388?s=96&d=mm&r=g6545a7220411572e799ad58574cce259\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0a0328b09c6abe61fa1e263a1066dcb26ea8f3b9e8b1d78056047620947bb388?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0a0328b09c6abe61fa1e263a1066dcb26ea8f3b9e8b1d78056047620947bb388?s=96&d=mm&r=g\",\"caption\":\"Julien Orsinger\"},\"description\":\"Julien is a senior power electronics engineer. On the knowledge base, he is acting as the editorial manager and is therefore the co-author of numerous articles on a broad variety of topics.\",\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/in\\\/julien-orsinger-640ab2129\\\/\"],\"url\":\"https:\\\/\\\/imperix.com\\\/doc\\\/author\\\/orsinger\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Using the angle decoder modules - imperix","description":"This notes presents how to use the angle decoder modules of the B-Box and B-Board controllers to read the rotor position of a motor.","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\/help\/using-the-angle-decoder-modules","og_locale":"en_US","og_type":"article","og_title":"Using the angle decoder modules - imperix","og_description":"This notes presents how to use the angle decoder modules of the B-Box and B-Board controllers to read the rotor position of a motor.","og_url":"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules","og_site_name":"imperix","article_published_time":"2021-03-29T09:24:18+00:00","article_modified_time":"2025-05-08T07:49:55+00:00","og_image":[{"width":450,"height":300,"url":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/3_2_ratio_PN104.png","type":"image\/png"}],"author":"Julien Orsinger","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Julien Orsinger","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules#article","isPartOf":{"@id":"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules"},"author":{"name":"Julien Orsinger","@id":"https:\/\/imperix.com\/doc\/#\/schema\/person\/65ef663818eab76f53cc627ab80e0a51"},"headline":"Using the angle decoder modules","datePublished":"2021-03-29T09:24:18+00:00","dateModified":"2025-05-08T07:49:55+00:00","mainEntityOfPage":{"@id":"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules"},"wordCount":1150,"commentCount":0,"publisher":{"@id":"https:\/\/imperix.com\/doc\/#organization"},"image":{"@id":"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules#primaryimage"},"thumbnailUrl":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/3_2_ratio_PN104.png","articleSection":["Product notes"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules#respond"]}]},{"@type":"WebPage","@id":"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules","url":"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules","name":"Using the angle decoder modules - imperix","isPartOf":{"@id":"https:\/\/imperix.com\/doc\/#website"},"primaryImageOfPage":{"@id":"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules#primaryimage"},"image":{"@id":"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules#primaryimage"},"thumbnailUrl":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/3_2_ratio_PN104.png","datePublished":"2021-03-29T09:24:18+00:00","dateModified":"2025-05-08T07:49:55+00:00","description":"This notes presents how to use the angle decoder modules of the B-Box and B-Board controllers to read the rotor position of a motor.","breadcrumb":{"@id":"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules#primaryimage","url":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/3_2_ratio_PN104.png","contentUrl":"https:\/\/imperix.com\/doc\/wp-content\/uploads\/2021\/03\/3_2_ratio_PN104.png","width":450,"height":300,"caption":"Simulink implementation of angle decoder"},{"@type":"BreadcrumbList","@id":"https:\/\/imperix.com\/doc\/help\/using-the-angle-decoder-modules#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Knowledge base","item":"https:\/\/imperix.com\/doc\/"},{"@type":"ListItem","position":2,"name":"Product notes","item":"https:\/\/imperix.com\/doc\/category\/help"},{"@type":"ListItem","position":3,"name":"Using the angle decoder modules"}]},{"@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\/65ef663818eab76f53cc627ab80e0a51","name":"Julien Orsinger","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/0a0328b09c6abe61fa1e263a1066dcb26ea8f3b9e8b1d78056047620947bb388?s=96&d=mm&r=g6545a7220411572e799ad58574cce259","url":"https:\/\/secure.gravatar.com\/avatar\/0a0328b09c6abe61fa1e263a1066dcb26ea8f3b9e8b1d78056047620947bb388?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0a0328b09c6abe61fa1e263a1066dcb26ea8f3b9e8b1d78056047620947bb388?s=96&d=mm&r=g","caption":"Julien Orsinger"},"description":"Julien is a senior power electronics engineer. On the knowledge base, he is acting as the editorial manager and is therefore the co-author of numerous articles on a broad variety of topics.","sameAs":["https:\/\/www.linkedin.com\/in\/julien-orsinger-640ab2129\/"],"url":"https:\/\/imperix.com\/doc\/author\/orsinger"}]}},"_links":{"self":[{"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/posts\/941","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\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/comments?post=941"}],"version-history":[{"count":15,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/posts\/941\/revisions"}],"predecessor-version":[{"id":33158,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/posts\/941\/revisions\/33158"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/media\/2993"}],"wp:attachment":[{"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/media?parent=941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/categories?post=941"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/tags?post=941"},{"taxonomy":"software-environments","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/software-environments?post=941"},{"taxonomy":"provided-results","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/provided-results?post=941"},{"taxonomy":"related-products","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/related-products?post=941"},{"taxonomy":"guidedreadings","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/guidedreadings?post=941"},{"taxonomy":"tutorials","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/tutorials?post=941"},{"taxonomy":"user-manuals","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/user-manuals?post=941"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/imperix.com\/doc\/wp-json\/wp\/v2\/coauthors?post=941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}