请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:INSTASPINFOCMOTORWAREGUI
工具/软件:
您好、
我们将 instaspin FOC 用于中等功率逆变器。 在评估过程中、我们注意到电流反馈传感器中存在线性误差。 它们存在因传感器而稍有不同的传感器缩放误差。 当电机运行时、这在电机的相位中显示为相电流失衡约为13%。 如何针对代码中的各个感测调节误差进行调整? 我是否会在以下代码中添加乘法常量?
//! \brief Reads the ADC data
//! \details Reads in the ADC result registers, adjusts for offsets, and
//! scales the values according to the settings in user.h. The
//! structure gAdcData holds three phase voltages, three line
//! currents, and one DC bus voltage.
//! \param[in] handle The hardware abstraction layer (HAL) handle
//! \param[in] pAdcData A pointer to the ADC data buffer
static inline void HAL_readAdcData(HAL_Handle handle,HAL_AdcData_t *pAdcData)
{
HAL_Obj *obj = (HAL_Obj *)handle;
_iq value;
_iq current_sf = HAL_getCurrentScaleFactor(handle);
_iq voltage_sf = HAL_getVoltageScaleFactor(handle);
// convert current A
// sample the first sample twice due to errata sprz342f, ignore the first sample
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_1);
value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[0]; // divide by 2^numAdcBits = 2^12
pAdcData->I.value[0] = value;
// convert current B
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_2);
value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[1]; // divide by 2^numAdcBits = 2^12
pAdcData->I.value[1] = value;
// convert current C
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_3);
value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[2]; // divide by 2^numAdcBits = 2^12
pAdcData->I.value[2] = value;
// convert voltage A
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_4);
value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[0]; // divide by 2^numAdcBits = 2^12
pAdcData->V.value[0] = value;
// convert voltage B
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_5);
value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[1]; // divide by 2^numAdcBits = 2^12
pAdcData->V.value[1] = value;
// convert voltage C
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_6);
value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[2]; // divide by 2^numAdcBits = 2^12
pAdcData->V.value[2] = value;
// read the dcBus voltage value
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_7); // divide by 2^numAdcBits = 2^12
value = _IQ12mpy(value,voltage_sf);
pAdcData->dcBus = value;
// read the dc total current
return;
} // end of HAL_readAdcData() function
//! \brief Reads the ADC data
//! \details Reads in the ADC result registers, and
//! scales the values according to the settings in user.h. The
//! structure gAdcData holds three phase voltages, three line
//! currents, and one DC bus voltage.
//! \param[in] handle The hardware abstraction layer (HAL) handle
//! \param[in] pAdcData A pointer to the ADC data buffer
static inline void HAL_readAdcDataWithOffsets(HAL_Handle handle,HAL_AdcData_t *pAdcData)
{
HAL_Obj *obj = (HAL_Obj *)handle;
_iq value;
_iq current_sf = HAL_getCurrentScaleFactor(handle);
_iq voltage_sf = HAL_getVoltageScaleFactor(handle);
// convert current A
// sample the first sample twice due to errata sprz342f, ignore the first sample
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_1);
value = _IQ12mpy(value,current_sf);
pAdcData->I.value[0] = value;
// convert current B
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_2);
value = _IQ12mpy(value,current_sf);
pAdcData->I.value[1] = value;
// convert current C
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_3);
value = _IQ12mpy(value,current_sf);
pAdcData->I.value[2] = value;
// convert voltage A
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_4);
value = _IQ12mpy(value,voltage_sf);
pAdcData->V.value[0] = value;
// convert voltage B
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_5);
value = _IQ12mpy(value,voltage_sf);
pAdcData->V.value[1] = value;
// convert voltage C
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_6);
value = _IQ12mpy(value,voltage_sf);
pAdcData->V.value[2] = value;
// read the dcBus voltage value
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_7);
value = _IQ12mpy(value,voltage_sf);
pAdcData->dcBus = value;
return;
} // end of HAL_readAdcDataWithOffsets() function
请注意、这不是初始校准时的偏移、而是缩放误差。 我需要分别调整传感器。 有没有好的方法来实现这一点?
/Mikael