Regarding the ABZ encoder interface of S32K344, I would like to ask a question. The ST MCU I used before only had one register CNT for counting. When the motor rotates forward, the register CNT counts from the current value to 4096, and when it reverses, it counts from the current value to 0. Angle=CNT/4095 * 360.
Now there are two counters in S32K344. When the motor rotates forward, CW counts from the current value to 4096, The CCW value remains unchanged, and when the motor reverses, the CCW counter counts from the current value to 4096, How can I get the angle when the CW value remains unchanged?
As shown in the figure below, I want to directly obtain angle values from 0 to 360 degrees based on counterCW and counterCCW.
已解决! 转到解答。
I tested the ABZ magnetic encoder interface, the underlying reference S32K344 motor control suite, using ACTUATE () to get a 0-360 angle, and zero the angle by offset in the Z interrupt. The reference code is as follows:
static volatile uint16_t counterCWOffset = 0;
extern eMIOS_Type * const s_emiosBase[];
float ACTUATE_GetPos(void)
{
uint16_t counterCW,counterCCW;
float Absolut_position;
/* read encoder edges to get mechanical position */
// counterCW = (int16_t)(Emios_Icu_Ip_GetEdgeNumbers(0U, 5U)); /* CW counter */
// counterCCW = (int16_t)(Emios_Icu_Ip_GetEdgeNumbers(0U, 6U)); /* CCW counter */
counterCW = (uint16_t)s_emiosBase[0]->CH.UC[5].CNT - counterCWOffset;
counterCCW = (uint16_t)s_emiosBase[0]->CH.UC[6].CNT;
Absolut_position = (float)(((uint16_t)(counterCW-counterCCW))&(uint16_t)(4095)) * 0.0879120879120879F; /* 360 divided by 4095 */
return Absolut_position;
}
void ENC_PHZ_Handler(void)
{
counterCWOffset = (uint16_t)(s_emiosBase[0]->CH.UC[5].CNT - s_emiosBase[0]->CH.UC[6].CNT);
// Emios_Icu_Ip_ResetEdgeCount(0,5); /*Clear A Edge Count*/
// Emios_Icu_Ip_ResetEdgeCount(0,6); /*Clear B Edge Count*/
// Emios_Icu_Ip_SetInitialCounterValue(0U, 5U, (uint32_t)0x1U);
// Emios_Icu_Ip_SetInitialCounterValue(0U, 6U, (uint32_t)0x1U);
// Emios_Icu_Ip_SetMaxCounterValue(0U, 5U, (uint32_t)(4096U));
// Emios_Icu_Ip_SetMaxCounterValue(0U, 6U, (uint32_t)(4096U));
// Emios_Icu_Ip_EnableEdgeCount(0u, 5U);
// Emios_Icu_Ip_EnableEdgeCount(0u, 6U);
}
I tested the ABZ magnetic encoder interface, the underlying reference S32K344 motor control suite, using ACTUATE () to get a 0-360 angle, and zero the angle by offset in the Z interrupt. The reference code is as follows:
static volatile uint16_t counterCWOffset = 0;
extern eMIOS_Type * const s_emiosBase[];
float ACTUATE_GetPos(void)
{
uint16_t counterCW,counterCCW;
float Absolut_position;
/* read encoder edges to get mechanical position */
// counterCW = (int16_t)(Emios_Icu_Ip_GetEdgeNumbers(0U, 5U)); /* CW counter */
// counterCCW = (int16_t)(Emios_Icu_Ip_GetEdgeNumbers(0U, 6U)); /* CCW counter */
counterCW = (uint16_t)s_emiosBase[0]->CH.UC[5].CNT - counterCWOffset;
counterCCW = (uint16_t)s_emiosBase[0]->CH.UC[6].CNT;
Absolut_position = (float)(((uint16_t)(counterCW-counterCCW))&(uint16_t)(4095)) * 0.0879120879120879F; /* 360 divided by 4095 */
return Absolut_position;
}
void ENC_PHZ_Handler(void)
{
counterCWOffset = (uint16_t)(s_emiosBase[0]->CH.UC[5].CNT - s_emiosBase[0]->CH.UC[6].CNT);
// Emios_Icu_Ip_ResetEdgeCount(0,5); /*Clear A Edge Count*/
// Emios_Icu_Ip_ResetEdgeCount(0,6); /*Clear B Edge Count*/
// Emios_Icu_Ip_SetInitialCounterValue(0U, 5U, (uint32_t)0x1U);
// Emios_Icu_Ip_SetInitialCounterValue(0U, 6U, (uint32_t)0x1U);
// Emios_Icu_Ip_SetMaxCounterValue(0U, 5U, (uint32_t)(4096U));
// Emios_Icu_Ip_SetMaxCounterValue(0U, 6U, (uint32_t)(4096U));
// Emios_Icu_Ip_EnableEdgeCount(0u, 5U);
// Emios_Icu_Ip_EnableEdgeCount(0u, 6U);
}
Hi,
Thank you so much for your interest in our products and for using our community.
In 4.2.5. Quadrature decoder section from AN13767: 3-phase Sensorless PMSM Motor Control Kit with S32K344 using RTD Low Level API you can see that it is performed a sum between counterCW and counterCCW to get the absolute position and then is processed by the angle tracking observer (ATO) to get the rotor position. For more detail you can also refer to the MCSPTE1AK344 Development Kit Application Software.
Hope it helps you.
Have a nice day!