TI中文支持网
TI专业的中文技术问题搜集分享网站

InstaSPIN-FOC lab2a与lab2b请教

以下分别为InstaSPIN-FOC lab 2a与lab 2b的中断服务函数:

lab 2a:

interrupt void mainISR(void)
{
HAL_PwmData_t negPwmData = {_IQ(0.0), _IQ(0.0), _IQ(0.0)};

// toggle status LED
if(gLEDcnt++ > (uint_least32_t)(USER_ISR_FREQ_Hz / LED_BLINK_FREQ_Hz))
{
HAL_toggleLed(halHandle,(GPIO_Number_e)HAL_Gpio_LED2);
gLEDcnt = 0;
}

// acknowledge the ADC interrupt
HAL_acqAdcInt(halHandle,ADC_IntNumber_1);

// convert the ADC data
HAL_readAdcData(halHandle,&gAdcData);

// run the controller
CTRL_run(ctrlHandle,halHandle,&gAdcData,&negPwmData);

// negate PwmData generated by SVGEN module in ROM
gPwmData.Tabc.value[0] = _IQmpy(negPwmData.Tabc.value[0], _IQ(-1.0));
gPwmData.Tabc.value[1] = _IQmpy(negPwmData.Tabc.value[1], _IQ(-1.0));
gPwmData.Tabc.value[2] = _IQmpy(negPwmData.Tabc.value[2], _IQ(-1.0));

// write the PWM compare values
HAL_writePwmData(halHandle,&gPwmData);

// setup the controller
CTRL_setup(ctrlHandle);

return;
} // end of mainISR() function

——————————————————————————————————————

lab 2b:

interrupt void mainISR(void)
{
// toggle status LED
if(gLEDcnt++ > (uint_least32_t)(USER_ISR_FREQ_Hz / LED_BLINK_FREQ_Hz))
{
HAL_toggleLed(halHandle,(GPIO_Number_e)HAL_Gpio_LED2);
gLEDcnt = 0;
}

// acknowledge the ADC interrupt
HAL_acqAdcInt(halHandle,ADC_IntNumber_1);

// convert the ADC data
HAL_readAdcData(halHandle,&gAdcData);

// run the controller
CTRL_run(ctrlHandle,halHandle,&gAdcData,&gPwmData);

// write the PWM compare values
HAL_writePwmData(halHandle,&gPwmData);

// setup the controller
CTRL_setup(ctrlHandle);

return;
} // end of mainISR() function

标红的部分为二者不同的地方,但是在lab user guide中说这两个例程的mainISR()一致,请问为何会有这种区别呢?如果2a的占空比没问题,那2b的占空比岂不是就有问题了?

我跑2a可以跑,2b却没法跑起来,调试发现跑2b时,恒定输出50%的占空比(电机辨识全过程都是这样),但是watch window显示控制器和估算器的状态改变正常。请问原因会不会是mainISR()跟2a不同造成的?

Eric Ma:

Lab2a和2b之所以会有这个区别,应该是由于2a的SVPWM是在ROM中实现,然后写法不一样而已。

50%占空比看起来像是一直在offset校准的情况。

建议你用lab05b跑跑试试,将enable user parameter置为0就可以识别电机参数。

ERIC

以下分别为InstaSPIN-FOC lab 2a与lab 2b的中断服务函数:

lab 2a:

interrupt void mainISR(void)
{
HAL_PwmData_t negPwmData = {_IQ(0.0), _IQ(0.0), _IQ(0.0)};

// toggle status LED
if(gLEDcnt++ > (uint_least32_t)(USER_ISR_FREQ_Hz / LED_BLINK_FREQ_Hz))
{
HAL_toggleLed(halHandle,(GPIO_Number_e)HAL_Gpio_LED2);
gLEDcnt = 0;
}

// acknowledge the ADC interrupt
HAL_acqAdcInt(halHandle,ADC_IntNumber_1);

// convert the ADC data
HAL_readAdcData(halHandle,&gAdcData);

// run the controller
CTRL_run(ctrlHandle,halHandle,&gAdcData,&negPwmData);

// negate PwmData generated by SVGEN module in ROM
gPwmData.Tabc.value[0] = _IQmpy(negPwmData.Tabc.value[0], _IQ(-1.0));
gPwmData.Tabc.value[1] = _IQmpy(negPwmData.Tabc.value[1], _IQ(-1.0));
gPwmData.Tabc.value[2] = _IQmpy(negPwmData.Tabc.value[2], _IQ(-1.0));

// write the PWM compare values
HAL_writePwmData(halHandle,&gPwmData);

// setup the controller
CTRL_setup(ctrlHandle);

return;
} // end of mainISR() function

——————————————————————————————————————

lab 2b:

interrupt void mainISR(void)
{
// toggle status LED
if(gLEDcnt++ > (uint_least32_t)(USER_ISR_FREQ_Hz / LED_BLINK_FREQ_Hz))
{
HAL_toggleLed(halHandle,(GPIO_Number_e)HAL_Gpio_LED2);
gLEDcnt = 0;
}

// acknowledge the ADC interrupt
HAL_acqAdcInt(halHandle,ADC_IntNumber_1);

// convert the ADC data
HAL_readAdcData(halHandle,&gAdcData);

// run the controller
CTRL_run(ctrlHandle,halHandle,&gAdcData,&gPwmData);

// write the PWM compare values
HAL_writePwmData(halHandle,&gPwmData);

// setup the controller
CTRL_setup(ctrlHandle);

return;
} // end of mainISR() function

标红的部分为二者不同的地方,但是在lab user guide中说这两个例程的mainISR()一致,请问为何会有这种区别呢?如果2a的占空比没问题,那2b的占空比岂不是就有问题了?

我跑2a可以跑,2b却没法跑起来,调试发现跑2b时,恒定输出50%的占空比(电机辨识全过程都是这样),但是watch window显示控制器和估算器的状态改变正常。请问原因会不会是mainISR()跟2a不同造成的?

user5947112:

回复 Eric Ma:

我用Lab05b跑过,也出现了问题,lab02b也有问题,估算顺利时电感为正确值得2倍,不顺利时,在估算电感时会发生故障,速度可能会显示负的上万转,电机会有噪音,lab02a一直都没有问题,不知是什么原因?程序我都是重现装的motorware,没有改动过

赞(0)
未经允许不得转载:TI中文支持网 » InstaSPIN-FOC lab2a与lab2b请教
分享到: 更多 (0)