InstantinFOC SDK V2.01:
将 ePWM 模块 CMPB 配置为比较加载/直接加载到周期寄存器中的 DN 计数无法将任何值加载到任何已配置发生器的 CMPB 中。
由于 typedef 枚举缺失 epwm.h 或 HW_EPWM.h、因此无法通过 DBCTL[POLSEL]为模式2 ACK/ACL 互补型配置死区发生器(图18-8)
注意:我尝试在下面添加枚举、但极性位 S2、S3分别为2、3时导致加载馈送模式寄存器位发生变化。 寄存器控制函数调用中存在重叠、因此将(模式/极性)寄存器加载分离为两个函数不会引起混淆。 互补死区模式2的移位/掩码枚举值与模式4不同、因此旧版 C2000固件函数调用无法正常工作、因为它用于模式2死区控制。 从下面的调用中可以设置最近的 DBCTL 寄存器(0x000A)。
//***************************************************************************** // //! Values that can be passed to EPWM_setDeadBandDelayPolarity(), //! EPWM_setDeadBandDelayMode() as the \e delayMode parameter. // //***************************************************************************** typedef enum { EPWM_DB_RED = 1, //!< DB RED (Rising Edge Delay) mode EPWM_DB_FED = 0, //!< DB FED (Falling Edge Delay) mode EPWM_DB_AHC = 1, //!< DB mode AH is Complementary EPWM_DB_ALC = 0 //!< DB mode AL is Complementary } EPWM_DeadBandDelayMode; //***************************************************************************** // //! Values that can be passed to EPWM_setDeadBandDelayPolarity as the //! \e polarity parameter. // //***************************************************************************** typedef enum { EPWM_DB_POLARITY_ACTIVE_HIGH = 0, //!< DB polarity is not inverted EPWM_DB_POLARITY_ACTIVE_LOW = 1, //!< DB polarity is inverted EPWM_DB_POLARITY_ACTIVE_HIGH_COMPLMNT = 2, //!< DB polarity is High Complementary EPWM_DB_POLARITY_ACTIVE_LOW_COMPLMNT = 1 //!< DB polarity is Low Complementary } EPWM_DeadBandPolarity;
1、当 TRM 中显示 Instaspin SVM 模块代码并声明该代码供设计人员检查时、为什么要将其嵌入 ROM 中?
2.为什么在 ROM 中的 SVM 模块没有通过下面给定的代码加载 CMPB 寄存器的任何计数值?
如何在不配置相对于 SDK InstaSPIN FOC 的死区模式2的情况下通过 ROM 或固件配置对称互补(ePWM-A/B 驱动信号)?
4.为什么使用 C2000寄存器枚举值(epwm.h 等) 与 TRM 图和寄存器布局相关的二进制/十六进制值不一致? 相反、C2000固件开发使设计人员无法在不进入 CCS 调试寄存器视图的情况下使用 TRM 快速查看。
// setup the Counter-Compare Control Register (CMPCTL) EPWM_setCounterCompareShadowLoadMode(obj->pwmHandle[cnt], EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO); // setup the Action-Qualifier Output B Register (AQCTLB) EPWM_setActionQualifierAction(obj->pwmHandle[cnt], EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB); // EPWM_setActionQualifierAction(obj->pwmHandle[cnt], EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB); // setup the Dead-Band Generator load mode Register (DBCTL) EPWM_setDeadBandDelayMode(obj->pwmHandle[cnt], EPWM_DB_AHC_RED, true); //EPWM_DB_RED EPWM_setDeadBandDelayMode(obj->pwmHandle[cnt], EPWM_DB_AHC_FED, true); // select EPWMA as the input to the dead band generator EPWM_setRisingEdgeDeadBandDelayInput(obj->pwmHandle[cnt], EPWM_DB_INPUT_EPWMA); // setup DBCTRL mode/polarity for H/L symmetric complementary dead band. EPWM_setDeadBandDelayPolarity(obj->pwmHandle[cnt], EPWM_DB_AHC, EPWM_DB_POLARITY_ACTIVE_HIGH_COMPLMNT); // setup the Dead-Band Rising Edge Delay Register (DBRED) EPWM_setRisingEdgeDelayCount(obj->pwmHandle[cnt], HAL_PWM_DBRED_CNT); // setup the Dead-Band Falling Edge Delay Register (DBFED) EPWM_setFallingEdgeDelayCount(obj->pwmHandle[cnt], HAL_PWM_DBFED_CNT);
epwm.h 存在严重错误、因为它已编码、对于某些模式、无法正确设置 DBCTRL 寄存器位。 模式表 18-9不能进行逻辑感知(红框/s)位 S8必须为1或 S6、S7不能同时考虑。 无论如何、无法为 A/B 通道上的互补高电平输出或 DBCTL=0xB 配置 DB 控制模式2。
似乎需要一个更新的调用来设置表18-8中显示的任何一种模式1-7。 否则、所写入的代码不允许 DB 模式2或使用正确的二进制值(0x3)设置 S1、S0。 HWREG 调用无法确定拒绝将 S0设置为0x1的原因或原因。 我们只能为互补的高电平有效输出设置1模式、但代码似乎认为低电平和高电平有效波形(图18-34)可以同时存在、但这是不可能的。
模式4死区通常用于梯形换向。 SPV 似乎需要模式2或高电平有效互补信号对来连接每个1/2电桥、如图 x49c TRM 图 18-34 (未显示在下方)
可以、模式2 DBCTL=0xB、但在 epwm.h DBCTL 写入或位发生变化时、只需修改几个(|=)即可。
// setup the Dead-Band Generator load mode Register (DBCTL) EPWM_setDeadBandDelayMode(obj->pwmHandle[cnt], EPWM_DB_AHC_RED, true);//EPWM_DB_RED EPWM_setDeadBandDelayMode(obj->pwmHandle[cnt], EPWM_DB_AHC_FED, true);//EPWM_DB_FED
//***************************************************************************** // //! Values that can be passed to PWM_setDeadBandDelayPolarity(), //! EPWM_setDeadBandDelayMode() S4,S5 as \e delayMode parameter. // //***************************************************************************** typedef enum { EPWM_DB_RED = 1, //!< DB RED (Rising Edge Delay) mode EPWM_DB_FED = 0, //!< DB FED (Falling Edge Delay) mode EPWM_DB_AHC_RED = 1, //!< Rising Edge Delay for AH Complementary EPWM_DB_AHC_FED = 0, //!< Falling Edge Delay for AH Complementary EPWM_DB_MODE_AHC = 1, //!< DB mode2 is AH Complementary EPWM_DB_MODE_ALC = 0 //!< DB mode3 is AL Complementary } EPWM_DeadBandDelayMode; //***************************************************************************** // //! Values that can be passed to EPWM_setDeadBandDelayPolarity as the //! \e polarity parameter. // //***************************************************************************** typedef enum { EPWM_DB_POLARITY_ACTIVE_HIGH = 0, //!< DB polarity is not inverted EPWM_DB_POLARITY_ACTIVE_LOW = 1, //!< DB polarity is inverted EPWM_DB_POLARITY_ACTIVE_HIGH_COMPLMNT = 2, //!< DB polarity is High Complementary EPWM_DB_POLARITY_ACTIVE_LOW_COMPLMNT = 1 //!< DB polarity is Low Complementary } EPWM_DeadBandPolarity;
1、当 TRM 中显示 Instaspin SVM 模块代码并声明该代码供设计人员检查时、为什么要将其嵌入 ROM 中?
2.为什么在 ROM 中的 SVM 模块没有通过下面给定的代码加载 CMPB 寄存器的任何计数值?
如何在不配置相对于 SDK InstaSPIN FOC 的死区模式2的情况下通过 ROM 或固件配置对称互补(ePWM-A/B 驱动信号)?
[/报价]ROM 中仅存储 FAST 估算器代码。 所有其他 FOC 代码包括 SVM、它们是 motorControlSDK 中的开源代码、与器件外设无关。
您可以在 hal.c 中引用 HAL_setupPWMs()中的代码、将 EPWMA-A 和 B 配置为具有死区的互补输出、因此 CMPB 不用于 PWM。 您可以查看 第18.6章动作限定符(AQ)子模块、了解如何设置 AQCTLA 以控制 PWM 输出。
不完全正确:只有对句柄的调用位于 RAM/FLASH 中、例如 SVM 块二进制编码扇区查找表在 svgen.h 或 svgen.c 中找不到位置 SPV 控制文件中没有实际函数、只处理 ROM 函数。 值通过在编译的符号表中指定的句柄被转换到 ROM。 我真的看不到 CMPA 在任何文件中的加载位置、因为它似乎源自 ROM。 这极大地限制了设计人员控制 ePWM 模块顺序的能力、从而最大限度地提高任何电机的速度扭矩曲线!
[引用 userid="35051" URL"~/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/995530/launchxl-f280049c-epwm-period-load-counts-cmpb-via-svm-fails-dead-band-generators-mode-2/3678253 #3678253"]您可以查看 第18.6章动作限定符(AQ)子模块,该章介绍如何设置 AQCTLA 以控制 PWM 输出。[/quot]发布于上图、SDK V2.01设置了 DBCTL 极性位 S3、S2 0x0。 为了从死区发生器获得高电平有效的互补输出、需要使 ePWM_setDeadBandDelayPolarity (0、2)。 而 ePWM_DB_POLICLE_ACTIVE_HIGH = 0会使 ePWM-A/B 信号 AH 但不是互补的、尤其是由于 CMPB 已禁用图18-34
[引用 userid="35051" URL"~/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/995530/launchxl-f280049c-epwm-period-load-counts-cmpb-via-svm-fails-dead-band-generators-mode-2/3678253 #3678253"]因此 CMPB 不用于 PWM[/引用]然而、在功率模式期间启用死区模式4会释放能量、模式2死区要好得多、低速振动电机要安静得多。
软件如何操作 DBCTL 寄存器、以便仅在特定开关关闭时禁用 RED 或 FED? 并允许 CMPB 通过死区、从而将低侧 MOSFET 切换至接近饱和或(慢速电流衰减)? 在我看来、1/2波电流脉冲将完全终止、这是快速电流衰减的症状。 我们确实为梯形 FOC 传递了 CMPB 周期、并且它在 SPV 上获得了出色的速度。
你好、Nima、
报告的问题是、epwh.h 具有几个寄存器、而不是在第二次调用同一函数时写入先前的二进制内容、从而改变了 DBCTL 寄存器控制模式。 该寄存器覆盖需要(|=)、而不是(=)将 HWREG 写入或宽松的先前内容置为有效、请查看上述内容。
从技术角度讲、死区模式4高电平有效(AH)应该是模式2 (AHC)互补。 还需要为极性/模式函数0x2添加新枚举。 修复了添加新枚举的延迟模式函数调用后、DBCTL 寄存器现在为0x000A (AHC)与0x0003 (AH)。 稍作修正、但在 ePWM 信号 DSP 方面增加了一些改进、使其更加稳健。
[引用 userid="280106" URL"~/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/995530/launchxl-f280049c-epwm-period-load-counts-cmpb-via-svm-fails-dead-band-generators-mode-2/3679405 #3679405"] GI 是否有任何特定的 ePWM 配置我可以提供帮助?关于 CMPB、SDK v2.1 SVM 变换不会像上面代码剪那样将任何值加载到 CMPB 中。 我尝试配置 AHC 非对称 PWM 发生器对、这需要为固定占空比静态加载 CMPB。 还需要更改 DB 模式2 (S4、S5模式)、请参见 TRM 图18-33。 这种类型的非对称 DSP 模式会在典型的梯形 FOC 换向高侧 MOSFET 中产生慢速电流衰减。
通过 AHC 死区的 ePWM 模块仍在 PWM 完整周期的末尾产生1/2波电流脉冲。 您认为非对称 PWM 会阻止1/2波电流周期的开发、还是其他原因导致了这些周期的开发? 我不是周期直接加载寄存器写入的大粉丝、这是否会导致描述这个1/2波电流脉冲? Yanming 似乎不明白我所描述的是 Instaspin FOC SDK 性能的缺陷。 50%的时间问题与模块配置和其他50%软件有关。
红色方框 CH2是1/2波脉冲、会导致电机崩溃进入加速轨迹、永远无法达到额定速度。 此捕捉 CH1代表快速衰减 PWM 模式。 似乎 ePWM 需要接近100%的占空比来生成(慢速衰减)正弦波(红框)。 CH1 PWM 如何产生感应正弦波令人惊叹、但缺少始终如一的正弦电流生成 CH2。 似乎这不是 Instaspin 电机 FOC 和 ePWM 的目的、即使占空比较低、也可以始终产生稳定的正弦电感电流。
哪些寄存器?
ePWMx DBCTL 位 S3、S2如文本所述在第二个调用生效时被改写、而不是保留之前的写入。
CMPB 负载问题又如何?
我还启用影子模式以基于时间的 PRD 加载零计数。 为3个 PWM 发生器添加了 PWM 周期阴影(零负载)、1/2电桥输出变化很小、但电流周期更强、带宽。 PWM 波 CH1现在具有更低的直流噪声、也许配置全局更新 CMPA 可以进一步改善 DSP。
似乎 x49c CCS 调试 GEL 文件缺少 ePWMx 发生器的影子加载寄存器。 很高兴看到影子值在零 PRD 上被影子加载值更新。 奇怪的是、CMPSSx 具有用于 DACAVALA/B 寄存器的影子寄存器、为什么 ePWMx 发生器没有。 无需只回答一个观察结果。