Other Parts Discussed in Thread: BOOSTXL-DRV8320RS
主题中讨论的其他器件: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()函数结束