This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 主 ISR

Guru**** 2747405 points

Other Parts Discussed in Thread: BOOSTXL-DRV8320RS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/878775/mainisr

器件型号:TMS320F280049C
主题中讨论的其他器件:BOOSTXL-DRV8320RS

您好!

上下文 x49c 启动、BoostXL-drv8320rs 电机 SDK 和(IS_05_MOTOR_id.c) __Interrupt mainISR (void)中断处理程序和通过 GPIO-30的 tick 监控器。

在空闲状态期间,PWM 高侧驱动器永远不会关闭,一旦在 mainISR()的顶部打开 GPIO30,它就永远不会关闭。 PWM 驱动器问题不是很严重、但抽取脉冲时间范围捕获会导致响铃。

除非启用电机 ID、但 LED5在同一函数中切换、否则永远不会调用关闭 GPIO30、因此它会退出、但在哪里? GPI030 (J2引脚13)切换的唯一时间是在电机 ID PWM 频率(20Khz)完全相同的期间。 奇怪的是,主 ISR 中的几个调用在最后一个(})上方有一个强制(return)语句。 因此、mainISR 未按预期在底部退出、并且 GPIO30保持高电平。 在大多数情况下、在 PWM 周期之后、InstaSpin ROM 调用似乎没有给出正确的时间范围。 30Mhz 数字示波器无法检测到 GPIO30脉冲、因为 LED5正在主 ISR 内切换。 GPIO30脉冲峰值仅在 GPIO 快速退出功能时从3V3典型值稍微向下变化。 人们会期望一个具有细长周期向下延伸至接地的明确定义脉冲、而不会发生这种情况。    

我注意到类似的做法,即在上次返回()函数底部之前,有一个(返回)语句 POP 从堆栈中进行寻址。 这种情况是一个假的 GPIO30时间抽取、似乎只在 PWM 周期(50µs 20Khz)发生。 mainISR()中的其他调用似乎永远不会增加50µs μ s 抽取时间。 每次从电机 ID 堆栈调用 ROM 的多个子调用中的任何一个子调用(返回)、主 ISR 电机 ID 环路似乎也会重新进入。 如果 GPIO30始终与 LED5切换、我的30Mhz 示波器无法在从视图中隐藏的鬼脉冲上触发。  

请注意、如果我们将底部 GPIO30低电平调用移至调用 LED5的较慢速率、则永远不会在之前或之后放置 GPIO30。 这可能是某种配置问题 GPIO30、但我们看不到任何冲突代码。 否则、LED5 GPIO 端口被置为开/关的方式会使人困惑它甚至是如何通过看起来是一个钩子连接到一个将另一个触发的调用置为有效的句柄来工作的!  LED5切换方法似乎是 mainISR()问题的一部分...

如果 mainISR()工作正常,即使启用了电机 ID,对 GPIO30的最后一次调用也将始终脉冲。 如果 GPIO30在 函数的最后一个(})末尾处或经常退出时,如何产生正确的抽取时间 mainISR()?

我们如何期望电机 ID 正确识别电机参数,因为 mainISR()被认为在远高于最后一次返回的位置重复进入调用栈? 奇怪的 mainISR()会切换 GPIO30、但只有在启用电机 ID 时、才能通过10KSPS 深度范围触发器捕获任何类型的脉冲。 GPIO30脉冲的 V 形导致担心 mainISR()抽取时间不正确。 这也可能导致100%梯形调制、从而导致 SVPWM 旋转角度的转子振动偏离矢量框架。 我们感觉随机转子振荡发生在电机 ID 标志= 1之后、因此在 ID 电机(700Hz)仅达到115Hz 速度1.1krpm 后、如果不保持在大质量转子开始振动。  

_interrupt void mainISR (void)
{
//
//通过切换 GPIO 来检查 ISR 执行时间
//
HAL_setGPIOHigh (halHandle、HAL_GPIO_ISR);

motorVars.pwmISRCount++;

//
//切换状态 LED
//
counterLED++;

if (counterLED >(uint32_t)(USER_ISR_FREQ_Hz / LED_BLINK FREQ_Hz)
{
HAL_TOGLELED (halHandle、HAL_GPIO_LED2);//LED5
counterLED = 0;
}


//电机 ID 和启用代码检查//


//
//写入 PWM 比较值
//
HAL_writePWMData (halHandle、&pwmData);


//
//强制 TRIG DMA 通道保存数据
//
HAL_TRIGLogWithDMA (halHandle、0);
HAL_TRIGLogWithDMA (halHandle、1);
HAL_TRIGLogWithDMA (halHandle、2);
HAL_TRIGLogWithDMA (halHandle、3);
#endif //_dataalog_EN_

//
//检查 ISR 执行时间
//
HAL_setGPIOLow (halHandle、HAL_GPIO_ISR);

return;
}// mainISR()函数结束 

   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我错过了 GPIO 30被配置为输入(hal.c)、它甚至是如何从主 ISR 调用中运行的? 我将其配置为输出、抽取脉冲周期或形状(J2引脚13)的差异不大、尽管脉冲速度似乎比50µs μ s 快。 由于 PWM 会触发 SOC->EOC 以及来自主 ISR ROM 调用的时间、因此 GPIO-30脉冲应略慢于 PWM 周期、这是不会的。

    与其他调制技术相比、SVPWM 的一个要点是减少转子振动、而不是像现在那样增加转子振动。 尽管这种小型 PM 电机只有1个轴承、转子由特氟龙套管、但如果它应在接近0.040英寸气隙的位置接触定子极、则它会受到特氟龙的影响。 奇怪的是、6代码调制不会产生任何提示的振动、因此编程问题似乎是最可能的可疑问题!  

    此外、减少 IRatedDelta 也没有产生任何差异、从而在斜升估算>100Hz 期间减少转子振动。  

    //! \brief 定义要在估算过程中使用的 IdRated 增量
    //!
    #define USER_IDRATED_DELTA ((float32_t)(0.00002))//0.0001
    
    // GPIO30->保留(不适用)、mainISR 启动/停止
    ifdef CLA
    GPIO_setMasterCore (30、GPIO_CORE_CPU1_CLA1);
    其他
    GPIO_setMasterCore (30、GPIO_CORE_CPU1_CLA1);
    #endif
    GPIO_setMasterCore (30、GPIO_CORE_CPU1);
    GPIO_setPinConfig (GPIO_30_GPIO30);
    GPIO_setDirectionMode (30、GPIO_DIR_MODE_OUT);//默认为 in
    GPIO_setPadConfig (30、GPIO_PIN_TYPE_PULLUP); 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    该 PWM 周期逻辑以毫秒为单位、而不是20Khz 微秒周期1/频率为单位。 因此、为了使50us PWM 维持 ISR、LED5不再发生脉冲、并且在设置使能标志之前电机 ID 标志跳转至1。 如果您的意思是毫秒作为较晚的 InstaSpin 控制周期、请不要写入 PWM 周期为微秒。 如下面的变量所示、如果 PWM 周期确实是微秒、任何人都会立即认为这是计时中的一个错误。  mainISR 中的某些内容会在 ID 期间使该电机振动、而不是 user.h 预设电机设置。  

    相同的公式以秒为单位推导用户控制周期和角度延迟 user.c

    //! \brief 定义脉宽调制(PWM)周期、单位为微秒
    //!
    #define USER_PWM_PERIOD_USEC ((float32_t) 1/USER_PWM_FREQ_kHz)//1000.0
    
    //! \brief 定义控制器执行周期、秒
    //!
    #define USER_CTRL_PERIOD_sec ((float32_t) USER_CTRL_PERIOD_USEC/(float32_t) 1000000.0)
    
    //user.c
    pUserParams->angleDelayed_SF_sec =(float32_t) 0.5 * USER_CTRL_PERIOD_sec;
    
    

      

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    GPIO30在用于开发中测试的 ISR 中切换、因此相关配置已删除、但测试代码未相应删除。 很抱歉、让您感到困惑的是、我们也会删除测试代码。

    我在上面提到的示例项目中找不到代码、它应该使用公式"#define USER_PWM_PERIOD_USEC  ((float32_t) 1000.0/USER_PWM_FREQ_kHz)"。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Yanming Lua"] GPIO30在用于开发测试的 ISR 中切换,因此相关配置已被删除[/quot]

    在主 ISR GPIO30中存在时序问题、其行为不符合显示抽取时序的要求。 mainISR 中没有缺失的代码、我们还能看到 mainISR 的抽取周期吗?  基于 x49c LaunchPad 原理图、J2引脚为 GPIO 30引脚39。 BoosterPack 快速卡已更改以反映原理图 J2/J4、因为用户指南建议插卡 PCB 上的 Silk 错误 J6/J8、但不是 J2/J4、这让人非常困惑。

    同样、GPIO-30的示波器捕获形状非常奇怪、请自行检查。 我们对 TM4C1294 MCU 中的其他中断也执行相同的操作、从未看到过任何周期保持的 GPIO 输出信号。 GPIO-30周期被中断处理程序斩波、否则应该有完整的脉冲周期接地。 否则、GPIO-30V 脉冲(2个提示)似乎表示主 ISR 内部的执行时间极短。

    [引用用户="Yanming Lua"]我在上面提到的示例项目中找不到代码,它应该使用表单

    1000/20.0=50、但不是(0 000050µs)、这就是为什么要尝试 P=1/F 考虑用户参数 PWM 频率20000Hz 而不是像定义的那样简单地使用20.0。 再说一次、50点不是50µs μ s、除非可能是周期性触发的计时器。 用于维持旋转角度的 InstaSpins EOC 中断似乎在相位内和相位外漂移、从而在斜降期间和斜降之后引起负转矩周期。  

    电机磁通仅在极低的用户相电流<0.5mA 时保持稳定、在斜升过程中无法产生>155Hz 的速度。 在大于0.5mA 的斜降中、用户磁通量是高度不稳定的电机 ID 标志=1。 难怪其他人在电机 ID is05方面遇到问题、因为 mainISR 中的时序不一致。 即使在极低的用户电流的情况下、此电机也不会像这样振动。  SPRUHJ1H–2013年1月–2019年6月修订从不声明斜升频率20Hz 高于 USER_MOTOR_FLASH_EXC_FREQ_Hz 状态(LS、CL1、CL2、CL)、这使得它在观察窗口中上升至155Hz 时达到了奇怪的20Hz。 在实验 is05_MOTOR_id.c 中、当它强制达到20Hz 时、它如何做到这一点?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    时序主 ISR 最终可能导致缩短斜升周期<20秒、如下定义。 无论 IND/RES 电流设置如何、电机都无法通过 CL1达到峰值 Hz 以进行磁通检测。 在这种情况下、对于输入值 IND/RES、MotorFreqHighHz (600Hz)转子仅达到155Hz。 斜降(CL1)似乎开始产生小于20秒的转子振动结果。

    也许过调制会导致速度问题、或者某些其他 PWM 触发时序会缩短斜升周期高 Hz 周期? 用户必须设置极低的 IND/RES 电流(<0.5A)以抵消 CL1振动、并且电机永远(安全)不会达到 MotorFreqHighHz (600Hz)。  否则、用户输入 IND/EST 电流(>1.0A)和斜降具有剧烈振动负磁通周期。 方波逆变器输出会在 is05电机 ID 期间产生相电压急剧上升沿小滚降。 发现奇怪的是、3 PGA 增益设置为12级、但你们是专家、我们只是问题的记者、因为它不能很好地工作。  

    6.5.5.2斜升时间和加速度
    斜升状态期间的下一个参数是电机斜升时的时间段(图6-17)。 默认情况下、这设置为20秒、如 user.c 文件中的下一个代码示例所示:

    [EST_State_RampUp]
    pUserParams->estWaitTime =(uint_least32_t)(20.0* USER_EST_FREQ_Hz);
    //! \brief 定义估算器的计时器频率、kHz
    #define USER_EST_FREQ_Hz (USER_ISR_FREQ_Hz) 
    #Elif (USER_MOTOR== NidecMotor_1) 
    #define USER_MOTOR_TYPE MOTOR_TYPE_PM
    #define USER_MOTOR_NUM_POLE_PAIRS (6)
    #define USER_MOTOR_RR_OHM (空)//ACIM 仅
    #define USER_MOTOR_Rs_Ohm (1.46257722)//1.45991349
    #define USER_MOTOR_LS_D_H (0.00211925316)//0.00223078486
    #define USER_MOTOR_LS_q_H (0.00211925316)//0.00223078486
    #define USER_MOTOR_RATed_磁 通_VpHz (0.0239039753)//0.0243388247
    #define USER_MOTOR_磁 化电流_A (NULL)//ACIM Only
    #define USER_MOTOR_RES_EST_CURRENT_A (1.6)//++、用于在负载
    #define USER_MOTOR_IND_EST_CURRENT_A 下旋转电机 (-1.6)//-在负载
    #define USER_MOTOR_MAX_CURRENT_A 下旋转电机 (2.0)// ID 之后再也不会使用
    #define USER_MOTOR_FLUX_EXC_FREQ_Hz (20.0)
    //#define USER_MOTOR_INERIING_Kgm2 (7.06154e-06)
    
    //电机正交编码器
    #define USER_MOTOR_NUM_ENC_SLOTS 上的线数 (空)
    
    #define USER_MOTOR_FREQ_MIN_Hz (5.0) // Hz
    #define USER_MOTOR_FREQ_MAX_Hz (775.0) // Hz
    
    #define USER_MOTOR_FREQ_LOW_Hz (10.0) // Hz
    #define USER_MOTOR_FREQ_HIGH_Hz (600.0) // Hz
    
    #define USER_MOTOR_VOLT_MIN_V (12.0) //伏特
    #define USER_MOTOR_VOLT_MAX_V (24.0) //电压 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    注(iso5_moter_id.c)规则上的语句(user.h) #define USER_MOTOR_FLUX_EXC_FREQ_Hz。 WA 需要以下补丁。  根据 SPRUHJ1H–2013年1月–2019年6月修订版、LC 状态检测似乎不应以如此低的转子速度(Hz)运行。 存在新的状态 CL2、未讨论 RR。

    在状态 OL 磁通之后、CL2似乎将电机斜升至1.3krpm。 补丁允许(300Hz - 500Hz)状态 OL、PM 不会通过更高的频率将转子锁定在此状态。 然而、LC 状态仍然会使转子产生振动、但在更高的 Hz 速度下、注意不到。  LC 似乎未正确识别、因为齿槽似乎是 _IND_EST_CURRENT_A 的一个组成部分、而实验室指南指示我们将其与_RES_匹配 会使其变得更糟糕。 IND (-)电流似乎不等于通过 LS 状态减小负扭矩。

    //
    //设置一些全局变量
    //
    motorVars.pwmISRCount = 0; //清除计数器
    motorVars.speedRef_Hz = USER_MOTOR_FLUX_EXC_FREQ_Hz;//将参考频率设置为300.0Hz
    motorVars.accelerationMax_Hzps = 10.0;//定义速度系统配置的启动最大加速度和减速度、 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    问题是 GPIO 30 x49c LaunchPad 用户指南原理图在错误的接头上标记了 J2/J4。 GPIO 30位于 J4引脚33上。 在每个50µs μ s PWM 周期内、InstaSpin mainISR 的长度为32µs μ s。   

    2.跳过斜升、六步换向中使用的相同 SVPWM 电机电流过高。 因此、1.6A 需要更像0.3A、以防止电机在(30 * User_Est_Freq_Hz)下与未记录的 CL2模式@20Hz 挂钩。 中间相绕组 Rs_Ohm = 1.5。 相同的电机通过6步换向1.6A 稳态峰值运行得很好、但在 InstaSpin SVPWM 调制下热吸烟似乎有点奇怪。

    3.没有减少的 RES_EST_CURRENT 量可以缓解低于200Hz 的低频转子振动。 向逆变器发送 PWM 驱动信号时,信号始终保持一致(0Hz >500Hz),最终进入电机。 进入系统的不断发出的 PWM 噪声似乎来自我最擅长的分析中的 PGA。 我已经调整了 ePWM ADC、SOC、PIE 中断优先级、但仍然无法从 mainISR ROM 调用到 Clarke/Park 转换获取干净的 PWM。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果可能、您是否有任何捕获的波形来显示上述问题? 这将帮助我们充分理解您的问题。 谢谢!