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.

[参考译文] TMS320F28069M:不良的闭环电流控制

Guru**** 2614265 points
Other Parts Discussed in Thread: DRV8303, DRV8301, OPA376

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/689744/tms320f28069m-poor-closed-loop-current-control

器件型号:TMS320F28069M
主题中讨论的其他器件:DRV8303DRV8301OPA376

下午好!

我将回顾现有的电路板设计、以进一步提高电流效率。 我能够完成所有实验、包括使用 instaSPIN 的 lab12、并达到电机的最大速度~24kRPM。 但是、它的运行电流大约是预期电流的两倍、因此我知道它没有高效运行。

我再次查看了 lab01c、发现电流跟踪性能非常糟糕。 当 Iq_Ref 恒定为~0.1时、测得的 Iq 信号看起来像噪声。 基准 Iq 有轻微偏置、但振荡过多。 有趣的是、电机确实会旋转、但看起来与实验教程的预期输出完全不同。 看到这一点后、我返回 lab01b、发现电流波形的形状不是很好。 也许我没有在正确的位置对当前通道进行采样?

以下是数据记录器在不同速度下的三个电压和两个不同电流波形示例的快照。 您可以看到、波形看起来与示例中的纯正弦信号完全不同。 我确实必须修改 hal.c 和 hal.h 才能添加4个额外的 ADC 输入(一个编码器有2个模拟输入、用户输入有2个模拟输入)。 添加这些额外输入是否会导致问题?

电压

开环控制期间 A 相、B 相和 C 相电流的第一个和第二个示例(不同速度)(lab01b)

我的 DRV8303配置是否存在问题?

如果您认为可能存在硬件问题、请提供您对问题进行故障排除的建议。

感谢您的支持!

此致、

Chris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    使用 lab01b 在电路板上运行电机时、您能否通过示波器显示一些电流波形? 比较 ADC 采样电流、以确保电流采样正确。 如果两个波形都不是很相似、则必须退一步检查硬件、尤其是在电流/电压采样电路上。
    2.您使用的是什么电流传感器? 还是霍尔传感器上的分流电阻器? 分流电阻对电流采样至关重要。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在 Yanming 度过了美好的夜晚

    感谢您的快速回复。

    1.在哪里测量电流波形? 它是高电流电机的极低电阻分流器、那么我是否可以在运算放大器增益之后检查电流波形?

    2.我们在低侧使用2 m Ω 分流电阻器。 您能否提供有关如何检查电流采样的建议?

    这是用于读取 ADC 值的 hal 代码的一个片段。 如果您在代码中添加四个额外的模拟输入时遇到任何问题、请查看并告知我。 我注意到有一条注释可以两次读取第一个样本、但我在示例代码中没有找到这一点。 您能否确认我是否应该在我的 hal 代码中读取此样本两次?

    //配置中断源
    adc_disableInt (obj->adcHandle、adc_IntNumber_1);
    adc_setIntMode (obj->adcHandle、adc_IntNumber_1、adc_IntMode_ClearFlag);
    ADC_setIntSrc (obj->adcHandle、ADC_IntNumber_1、ADC_IntSrc_EOC7);

    //为 drv8301kit_revD 配置 SOC
    // EXT IA-FB
    ADC_setSockChanNumber (obj->adcHandle、ADC_SockNumber_0、ADC_SockChanNumber_B1);
    ADC_setSockTrigSrc (obj->adcHandle、ADC_SockNumber_0、ADC_SockTrigSrc_EPWM1_ADCSOCA);
    ADC_setSockSampleDelay (obj->adcHandle、ADC_SockNumber_0、ADC_SockSampleDelay_9_cycles);// ADC_SockSampleDelay_9_cycles

    // EXT IA-FB
    //由于 ADC 初始转换错误而导致的重复转换(SPRZ342)
    ADC_setSockChanNumber (obj->adcHandle、ADC_SockNumber_1、ADC_SockChanNumber_B1);
    ADC_setSockTrigSrc (obj->adcHandle、ADC_SockNumber_1、ADC_SockTrigSrc_EPWM1_ADCSOCA);
    ADC_setSockSampleDelay (obj->adcHandle、ADC_SockNumber_1、ADC_SockSampleDelay_9_cycles);

    // EXT IB-FB
    ADC_setSockChanNumber (obj->adcHandle、ADC_SockNumber_2、ADC_SockChanNumber_B2);
    ADC_setSockTrigSrc (obj->adcHandle、ADC_SockNumber_2、ADC_SockTrigSrc_EPWM1_ADCSOCA);
    ADC_setSockSampleDelay (obj->adcHandle、ADC_SockNumber_2、ADC_SockSampleDelay_9_cycles);

    // EXT IC-FB
    ADC_setSockChanNumber (obj->adcHandle、ADC_SockNumber_3、ADC_SockChanNumber_B4);
    ADC_setSockTrigSrc (obj->adcHandle、ADC_SockNumber_3、ADC_SockTrigSrc_EPWM1_ADCSOCA);
    ADC_setSockSampleDelay (obj->adcHandle、ADC_SockNumber_3、ADC_SockSampleDelay_9_cycles);

    // ADC-Vhb1
    ADC_setSockChanNumber (obj->adcHandle、ADC_SockNumber_4、ADC_SockChanNumber_A1);
    ADC_setSockTrigSrc (obj->adcHandle、ADC_SockNumber_4、ADC_SockTrigSrc_EPWM1_ADCSOCA);
    ADC_setSockSampleDelay (obj->adcHandle、ADC_SockNumber_4、ADC_SockSampleDelay_9_cycles);

    // ADC-Vhb2
    ADC_setSockChanNumber (obj->adcHandle、ADC_SockNumber_5、ADC_SockChanNumber_A2);
    ADC_setSockTrigSrc (obj->adcHandle、ADC_SockNumber_5、ADC_SockTrigSrc_EPWM1_ADCSOCA);
    ADC_setSockSampleDelay (obj->adcHandle、ADC_SockNumber_5、ADC_SockSampleDelay_9_cycles);

    // ADC-Vhb3
    ADC_setSockChanNumber (obj->adcHandle、ADC_SockNumber_6、ADC_SockChanNumber_A4);
    ADC_setSockTrigSrc (obj->adcHandle、ADC_SockNumber_6、ADC_SockTrigSrc_EPWM1_ADCSOCA);
    ADC_setSockSampleDelay (obj->adcHandle、ADC_SockNumber_6、ADC_SockSampleDelay_9_cycles);

    // VDCBUS
    ADC_setSockChanNumber (obj->adcHandle、ADC_SockNumber_7、ADC_SockChanNumber_B0);
    ADC_setSockTrigSrc (obj->adcHandle、ADC_SockNumber_7、ADC_SockTrigSrc_EPWM1_ADCSOCA);
    ADC_setSockSampleDelay (obj->adcHandle、ADC_SockNumber_7、ADC_SockSampleDelay_9_cycles);

    // HALL0
    ADC_setSockChanNumber (obj->adcHandle、ADC_SockNumber_8、ADC_SockChanNumber_A5);
    ADC_setSockTrigSrc (obj->adcHandle、ADC_SockNumber_8、ADC_SockTrigSrc_EPWM1_ADCSOCA);// ADC_Int1TriggerSOC?
    ADC_setSockSampleDelay (obj->adcHandle、ADC_SockNumber_8、ADC_SockSampleDelay_9_cycles);

    // HALL1
    ADC_setSockChanNumber (obj->adcHandle、ADC_SockNumber_9、ADC_SockChanNumber_B5);
    ADC_setSockTrigSrc (obj->adcHandle、ADC_SockNumber_9、ADC_SockTrigSrc_EPWM1_ADCSOCA);
    ADC_setSockSampleDelay (obj->adcHandle、ADC_SockNumber_9、ADC_SockSampleDelay_9_cycles);

    // HALL2
    ADC_setSockChanNumber (obj->adcHandle、ADC_SockNumber_10、ADC_SockChanNumber_B6);
    ADC_setSockTrigSrc (obj->adcHandle、ADC_SockNumber_10、ADC_SockTrigSrc_EPWM1_ADCSOCA);
    ADC_setSockSampleDelay (obj->adcHandle、ADC_SockNumber_10、ADC_SockSampleDelay_9_cycles);

    // HALL3
    ADC_setSockChanNumber (obj->adcHandle、ADC_SockNumber_11、ADC_SockChanNumber_A6);
    ADC_setSockTrigSrc (obj->adcHandle、ADC_SockNumber_11、ADC_SockTrigSrc_EPWM1_ADCSOCA);
    ADC_setSockSampleDelay (obj->adcHandle、ADC_SockNumber_11、ADC_SockSampleDelay_9_cycles);

    --------------------------

    //! \brief 读取 ADC 数据
    //! \details 读取 ADC 结果寄存器、调整偏移量、和
    //! 根据 user.h 中的设置缩放值 。
    //! 结构 gAdcData 保存三个相电压、三条线路
    //! 和一个直流总线电压。
    //! \param[in]处理硬件抽象层(HAL)句柄
    //! \param[in] pAdcData 指向 ADC 数据缓冲区的指针
    静态内联空 HAL_readAdcData (HAL_Handle handle、HAL_AdcData_t * pAdcData)

    HAL_Obj * obj =(HAL_Obj *)句柄;

    _IQ 值;
    _IQ Current_SF = HAL_getCurrentScaleFactor (handle);
    _IQ VOLTAGE_SF = HAL_getVoltageScaleFactor (handle);


    //转换电流 A
    //根据勘误 sprz342f 对第一个样本进行两次采样,忽略第一个样本
    值=(_IQ) ADC_readResult (obj->adcHandle、ADC_ResultNumber_1);
    value =_IQ12mpy (value、curry_SF)- obj->adcBias.I.value[0]; //除以2^numAdcBits = 2^12
    pAdcData->I.value[0]=值;

    //转换电流 B
    值=(_IQ) ADC_readResult (obj->adcHandle、ADC_ResultNumber_2);
    value =_IQ12mpy (value、curry_SF)- obj->adcBias.I.value[1]; //除以2^numAdcBits = 2^12
    pAdcData->I.value[1]=值;

    //转换当前 C
    值=(_IQ) ADC_readResult (obj->adcHandle、ADC_ResultNumber_3);
    value =_IQ12mpy (value、curry_SF)- obj->adcBias.I.value[2]; //除以2^numAdcBits = 2^12
    pAdcData->I.value[2]=值;

    //转换电压 A
    值=(_IQ) ADC_readResult (obj->adcHandle、ADC_ResultNumber_4);
    value =_IQ12mpy (value、volte_sf)- obj->adcBias.V.value[0]; //除以2^numAdcBits = 2^12
    pAdcData->V.value[0]=值;

    //转换电压 B
    值=(_IQ) ADC_readResult (obj->adcHandle、ADC_ResultNumber_5);
    value =_IQ12mpy (value、volte_sf)- obj->adcBias.V.value[1]; //除以2^numAdcBits = 2^12
    pAdcData->V.value[1]=值;

    //转换电压 C
    值=(_IQ) ADC_readResult (obj->adcHandle、ADC_ResultNumber_6);
    value =_IQ12mpy (value、volte_sf)- obj->adcBias.V.value[2]; //除以2^numAdcBits = 2^12
    pAdcData->V.value[2]=值;

    //读取 DCBus 电压值
    值=(_IQ) ADC_readResult (obj->adcHandle、ADC_ResultNumber_7); //除以2^numAdcBits = 2^12
    值=_IQ12mpy (值、VOLTGE_SF);
    pAdcData->DCBus =值;

    //读取霍尔0-3电压
    值=(_IQ) ADC_readResult (obj->adcHandle、ADC_ResultNumber_8);
    值=_IQ12mpy (value、_IQ (USER_IQ_FULL_SCALE_TRIGGER_VOLTAGE_V));
    pAdcData->hall0 =值;

    值=(_IQ) ADC_readResult (obj->adcHandle、ADC_ResultNumber_9);
    值=_IQ12mpy (value、_IQ (USER_IQ_FULL_SCALE_TRIGGER_VOLTAGE_V));
    pAdcData->HALL1 =值;

    值=(_IQ) ADC_readResult (obj->adcHandle、ADC_ResultNumber_10);
    值=_IQ12mpy (value、_IQ (USER_IQ_FULL_SCALE_TRIGGER_VOLTAGE_V));
    pAdcData->hall2 =值;

    值=(_IQ) ADC_readResult (obj->adcHandle、ADC_ResultNumber_11);
    值=_IQ12mpy (value、_IQ (USER_IQ_FULL_SCALE_TRIGGER_VOLTAGE_V));
    pAdcData->hall3 =值;

    返回;
    }// HAL_readAdcData()函数结束
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    早上好、Yanming、

    以下是一些用于调试的附加信息、包括一次测试期间的 IQ 参考(最左侧的图形)、IQ (中间)和 ID 电流(右侧)的图形文件。 您可以看到、几乎无法控制 IQ 电流、但有趣的是、尽管跟踪不良、我的电机仍会旋转。 我认为这可能会导致跟踪性能效率低下。

    我还尝试了另一个具有更高电感的电机。 这个问题似乎已经减少了、但仍然不是我希望的。 对于电感极低的电机、是否需要对电流采样进行更改?

    在 lab01b 中针对 Anaheim 自动化电机的开环 PWM 控制期间的电流波形

    在 lab01c 中、对于 Anaheim 自动化电机的闭环电流控制期间的基准 IQ 和反馈 IQ

    此致、

    Chris

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

    您是使用 TI 功率级板还是构建自己的板? 如果您要构建自己的电流反馈电路、您使用的是什么电流反馈电路? 谢谢。

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

    下午好、Han、

    这是我们自己基于 drv8301开发套件的定制板。 我们使用 drv8301套件中的示例作为电流反馈电路。 我们在 A 相的低侧分流电阻器上使用运算放大器、在 B 相和 C 相上使用两个 DRV8303内部增益

    您是否对如何解决此问题有任何建议?

    谢谢、

    Chris

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

    韩燕明的美好夜晚

    我已附加了几个示波器截图、其中包括直接在分流电阻器(测试焊盘 J4)顶部测量的电压、以及 OPA376放大器的输出(在施加10x 增益后)。 我可以清楚地看到、对于分流测量和运算放大器、PWM 转换会在测量的电压上引入欠阻尼振荡、但它看起来在几秒后趋于稳定。 如何在 PWM 转换后调整何时对 ADC 采样? 在 halal 函数中添加四个额外的 ADC 测量值是否存在任何问题?

    此致、

    Chris

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

    PCB 布局在这些大电流应用中发挥着重要作用、尤其是在分流电流反馈应用中。 由于电流分流器的电阻非常小、因此在低电流下运行时的 SNR 将受到 PCB 设计的很大影响。 诸如在功率级区域添加分布式电容器、使运算放大器电路更靠近分流电阻器、以及在 PCB 中使用"屏蔽"保护路径等的良好做法将有助于提高 SNR。

    另一方面、为了测试您的电流环路性能、您需要使用实验4/5、其中电机位置由 FAST 观测器估算并在控制环路中使用。 实验1c 仅用于信号链测试、不用于测试电流环路性能。 谢谢。

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

    下午好、Han、

    是的、我们在布局中添加了所有这些功能、以帮助提高性能。 您是 TI 员工、如果是、您能否查看我们的布局并提供改进设计的建议。

    我还尝试过 lab05、但发现了相同的电流跟踪性能问题。

    此致

    Chris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    下午好、Han、
    我的四个额外霍尔传感器 ADC 输入是否会对电流采样产生不利影响? 如何配置 ADC 中断源? 是否在 ADC_IntSrc_EOC7上触发 hal.c 中设置 ADC_IntNumber_1的源代码? 什么会触发 ADC_IntSrc_EOC7?
    //配置中断源
    adc_disableInt (obj->adcHandle、adc_IntNumber_1);
    adc_setIntMode (obj->adcHandle、adc_IntNumber_1、adc_IntMode_ClearFlag);
    ADC_setIntSrc (obj->adcHandle、ADC_IntNumber_1、ADC_IntSrc_EOC7);
    第二、我是否应该根据 ADC_SockTrigSrc_EPWM1_ADCSOCA 将我的附加 ADC 输入设置为触发? 例如、
    // HALL0
    ADC_setSockChanNumber (obj->adcHandle、ADC_SockNumber_8、ADC_SockChanNumber_A5);
    ADC_setSockTrigSrc (obj->adcHandle、ADC_SockNumber_8、ADC_SockTrigSrc_EPWM1_ADCSOCA);// ADC_Int1TriggerSOC?
    ADC_setSockSampleDelay (obj->adcHandle、ADC_SockNumber_8、ADC_SockSampleDelay_9_cycles);
    // HALL1
    ADC_setSockChanNumber (obj->adcHandle、ADC_SockNumber_9、ADC_SockChanNumber_B5);
    ADC_setSockTrigSrc (obj->adcHandle、ADC_SockNumber_9、ADC_SockTrigSrc_EPWM1_ADCSOCA);
    ADC_setSockSampleDelay (obj->adcHandle、ADC_SockNumber_9、ADC_SockSampleDelay_9_cycles);
    // HALL2
    ADC_setSockChanNumber (obj->adcHandle、ADC_SockNumber_10、ADC_SockChanNumber_B6);
    ADC_setSockTrigSrc (obj->adcHandle、ADC_SockNumber_10、ADC_SockTrigSrc_EPWM1_ADCSOCA);
    ADC_setSockSampleDelay (obj->adcHandle、ADC_SockNumber_10、ADC_SockSampleDelay_9_cycles);
    // HALL3
    ADC_setSockChanNumber (obj->adcHandle、ADC_SockNumber_11、ADC_SockChanNumber_A6);
    ADC_setSockTrigSrc (obj->adcHandle、ADC_SockNumber_11、ADC_SockTrigSrc_EPWM1_ADCSOCA);
    ADC_setSockSampleDelay (obj->adcHandle、ADC_SockNumber_11、ADC_SockSampleDelay_9_cycles);
    谢谢、
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    TI 社区下午好、
    我已经附加了几个示波器截图、其中显示了 A 相高侧和低侧栅极驱动器(绿色和红色)、维护 ISR 开始的时间点(应对应于 ADC 数据采集的结束)以及 A 相电机引脚上的电压(黄色)。 主 ISR/ADC 采样似乎仅在 A 相 LO 栅极驱动处于活动状态(红色)时发生、因此我认为这方面工作正常。
    但是、我注意到的一件事是、在本例中、高侧和低侧 FET 之间的死区时间窗口非常短。 我只能看到最后三幅图中所示的10ns 死区时间。 我使用的是 DRV8303、将 DTC 电阻设置为1kOhm、因此对于该应用、我预计死区时间为~50ns。 请告诉我们您对我们的应用建议的最小死区时间的看法、以及我们为什么看不到预期的50ns 延迟。


    图 十、在电源引脚测量的 A 相电压(黄色)、A 相高栅极驱动(绿色)、A 相低栅极驱动(红色)、mainISR/ADC 采样(蓝色)。 请注意、在 A 相 Lo FET 处于活动状态时进行 ADC 采样后、会立即发生 mainISR。

      


    图 十、在电源引脚测量的 A 相电压(黄色)、A 相高栅极驱动(绿色)、A 相低栅极驱动(红色)、mainISR/ADC 采样(蓝色)。 请注意、在 A 相 Lo FET 处于活动状态时进行 ADC 采样后、会立即发生 mainISR。

    图 十.电机 A 相高栅极驱动(绿色)、A 相低栅极驱动(红色)、主 ISR/ADC 采样(蓝色)。 请注意、当 A 相 Lo FET 处于活动状态时、ADC 采样后会立即发生 mainISR。

    图 十.电机 A 相高栅极驱动(绿色)、A 相低栅极驱动(红色)。 请注意、高电平和低电平 FET 之间的死区时间仅为~10ns。

     

    图 十.电机 A 相高栅极驱动(绿色)、A 相低栅极驱动(红色)。 请注意、高电平和低电平 FET 之间的死区时间仅为~10ns。

    图 十.电机 A 相高栅极驱动(绿色)、A 相低栅极驱动(红色)。 请注意、高电平和低电平 FET 之间的死区时间仅为~10ns。
    此致、
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Chris:

    最新帖子中的数字不显示。 根据您的描述、我认为您的系统的高电流消耗可能与死区时间不足有关。 您可以尝试提高 DTC 电阻器的值、看看这是否能解决您的问题。

    如果您对 DRV8303有其他疑问、请在以下地址发布电机驱动器论坛以获取进一步帮助

    e2e.ti.com/.../38

    谢谢。

    此致、

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

    下午好、Han、

    我尝试使用22kOhm 电阻器替换 DTC电 阻器、这应该会导致~100ns 的死区时间。 但是、我仍然看到高侧和低侧 FET 之间的死区时间仅为~10ns (请参阅上一篇文章中的图像)。 对于我无法根据数据表调整死区时间的原因、有没有人提出任何建议。

    我在 hal.h 中调整了 PWM 延迟、发现可以通过这些软件更改来增加死区。 这仍然不能解释硬件 DTC 不起作用的原因、但我将在电机驱动器论坛中发布该问题。 这是使用22kOhm DTC 电阻器的原始死区图像、后跟将 PWM 延迟调整为20个周期(90MHz 时为~200ns)后的图像。

    增加死区确实会改善电流波形的形状、从而使其在开环 V/Hz lab01b 控制期间呈现出更多的正弦。

    具有原始 DTC 延迟(~10ns)的 lab01b IA、IB、IC 电流波形

    lab01b IA、IB、IC 电流波形、具有软件调节的大 DTC 延迟(~200ns)

    但是、无论是在 lab01c 还是 lab05a 中、我仍然无法实现一致的闭环 IQ 电流跟踪。 以下是 IQ_ref 和测量的 IQ 值的屏幕截图。 我曾尝试调整 KP/KI 增益、但没有成功。 IQ 电流跟踪似乎存在一个更大的根本问题、这会影响性能。 请注意、当电机失速时、Iq 电流跟踪会显著改善、如最后的图像所示。

    lab05a ~1kRPM 速度

    lab05a 电机停止运转

    您对为什么我在失速时看到的性能与在移动时看到的性能差别有什么建议吗?

    谢谢、
    Chris