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.
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 上获得了出色的速度。
Gi 是否有任何特定的 ePWM 配置可供我使用?
你好、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 发生器没有。 无需只回答一个观察结果。
下面的 BTW 捕获是梯形快速衰减 PWM 的样子。 看到与上面 CH1的相似之处吗?
对于 CMPB、如果 SDK 代码不更新 CMPB、CMPB 寄存器中的值是多少?
你好、Nima、
[引用 userid="280106" URL"~/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/995530/launchxl-f280049c-epwm-period-load-counts-cmpb-via-svm-fails-dead-band-mode-2/3680890 #3680890"]如果 SDK 代码不更新 CMPB,CMPB 寄存器中的值是多少?0x0000
捕获红色框是否看起来是正确的调制 CH1来产生全正弦电感电流 CH2? 很难 通过2通道示波器来确定这个问题
由于 ePWMx TBPRD 计数器寄存器与比较计数 CMPA 0x4E2/1250的时基倍数匹配、因此可能不需要 CMPB。 可能会解释 结束时的延长周期(红框)? 零很重要、并且会累加十六进制计数。
Gi、
这似乎是正确的。 如果应用程序代码未使用 CMPB、那么它一定不是必需的、尤其是当寄存器读取0x00时。 此外、死区模块有时通过将 EPWMA 用作源来控制 EPWMB。
NIMA
您可能没有看到存储器映射 CMPA 计数寄存器是 CMPA 匹配计数和 TBPRD 值的16倍。 该计数附加了16位左移<<内容、实际 TBPRD 计数加载2500。 为什么存储器映射 CMPA 十进制计数比匹配的 CMPA 值高16倍?
即使选择了周期加载、也不会对非常高的 CMPA 存储器映射计数进行任何更改。 其他类型的 PWM 存储器映射 CMPA 计数变为零、计数重新开始。 动作限定器在 CMPA 递增和递减计数时输出 A。 周期计数为2500、加载的 CMPA 匹配为1250十进制。
/* set comparator control load mode for default shadows CMP-A or B */ EPWM_setCounterCompareShadowLoadMode(obj->pwmHandle[cnt], EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_PERIOD); // setup the Action-Qualifier Output A Register (AQCTLA) EPWM_setActionQualifierAction(obj->pwmHandle[cnt], EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(obj->pwmHandle[cnt], EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
这就是 CMPA + CMPAHR 的组合。
CMPA 左移+ CMPAHR
只需查看 CMPA 而不是组合 CMPA (大值)
地球上的谁会通过加载的 GEL 文件知道这一点。 但存储器映射值仍然不会重置为零或在 CMPA 匹配计数上递增计数。
我不关注。 什么不是递增计数?
然而 、CMPAHR 寄存器被禁用、所以向左移位16位似乎确认了在更高的计数时、高序字节 CMPA 匹配计数相对于 TBPRD 模块发生、然后实际加载。 单个周期是正确的(50µs)、但周期比它应该长。 多余的1/2波脉冲(红框)必须源自某些位置。 相电流应为 整个 TBPRD 周期的正弦电流、不会发生中断。
请注意 、ePWM 模块 A 输出 CH1之间的宽间隔与行业标准三相正弦电流生成不一致。 相位控制寄存器 PHSEN 均已禁用 SDK v2.01 MOTION FOC、但 TRM 图18-67仅显示 EPWM1 CTR 0、无 Synci。 我在以下添加了对 ePWM 2、3模块的 synci、synco 的更改、匹配计数 CMPA 仍然没有更改。 存储器映射 CMPA 寄存器不应以递增计数自由运行、当 CMPA 匹配发生时、计数应停止并递减至零。 仿真模式控制仅用于 CCS 调试无待机运行时间、而不是执行时间。 因此、我们应该看到存储器映射 CMPA 在 TBPRD 下进行计数和倒计数。
CMPA 其他配置:
for(cnt=0;cnt<3;cnt++) { // setup the Time-Base Control Register (TBCTL) EPWM_setTimeBaseCounterMode(obj->pwmHandle[cnt], EPWM_COUNTER_MODE_UP_DOWN); // disable PHSEN bit in TB submodule EPWM_disablePhaseShiftLoad(obj->pwmHandle[0]); // enable PHSEN bit TBRD phase shifted load by TBHRS counts EPWM_enablePhaseShiftLoad(obj->pwmHandle[1]); // enable PHSEN bit TBRD phase shifted load by TBHRS counts EPWM_enablePhaseShiftLoad(obj->pwmHandle[2]); // set the period load mode quiet shadow loading / EPWM_setPeriodLoadMode(obj->pwmHandle[cnt], EPWM_PERIOD_SHADOW_LOAD); //EPWM_PERIOD_DIRECT_LOAD // set EPWM1 Master Sync Out pulse counter is zero and // set EPWM2, EPWM3 Slaves Sync pulse In/Out PWMxSYNCI/O. EPWM_setSyncOutPulseMode(obj->pwmHandle[0], EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO); EPWM_setSyncOutPulseMode(obj->pwmHandle[1], EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN); //EPWM_SYNC_OUT_PULSE_ON_SOFTWARE EPWM_setSyncOutPulseMode(obj->pwmHandle[2], EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);//EPWM_SYNC_OUT_PULSE_ON_SOFTWARE // Set 100Mhz PWMCLK EPWM_setClockPrescaler(obj->pwmHandle[cnt], EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); EPWM_setCountModeAfterSync(obj->pwmHandle[cnt], EPWM_COUNT_MODE_UP_AFTER_SYNC); EPWM_setEmulationMode(obj->pwmHandle[cnt], EPWM_EMULATION_FREE_RUN); /* You can clear the PWM trip zone flag via EPwm1Regs.TZCLR.bit.OST */ //EPwm1Regs.TZCLR.bit.OST; // setup the Time-Based Phase Register (TBPHS)=Zero EPWM_setPhaseShift(obj->pwmHandle[1], 0); // setup the Time-Based Phase Register (TBPHS)=Zero EPWM_setPhaseShift(obj->pwmHandle[2], 0); // setup the Time-Base Counter Register (TBCTR) EPWM_setTimeBaseCounter(obj->pwmHandle[cnt], 0); // setup the Time-Base Period Register (TBPRD) // set to zero initially EPWM_setTimeBasePeriod(obj->pwmHandle[cnt], 0); ~~~~~~~~~~~~~~~~ Other configuration code such a dead band etc.. }
"Registers"视图中的 CMPA 为:
CMPA CMPA 和 CMPAHR 的组合版本(十进制值不是具有 CMPAHR 的总 CMPA 的实际小数值
CMPA CMPA 的实际值
CMPAHR
只有这样、CMPA 匹配操作事件才会发生变化、直到暂停 CCS 调试。 这可能是一个仿真问题、使 TB 模块看起来与计数器比较子模块不同步。 我希望内存映射计数和 CMPA 计数值仅在发生匹配时才会锁存 TRM 图18-18和图16-68。
我们还可以如何通过 CCS 调试验证 CMPA 与计数的匹配?
/* set comparator control load mode for default shadows CMP-A or B */ EPWM_setCounterCompareShadowLoadMode(obj->pwmHandle[cnt], EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_PERIOD);
奇怪的是、我们切换到 CMPA 存储器映射 GEL 单元的十进制视图、该值不仅<10、TBPRD 计数值极高。 很抱歉,忘记提到这一点 。
不会立即在寄存器中设置该值。 但它将被影子化到活动寄存器、在事件发生时不会向用户显示该寄存器。
问题似乎是 CMPA 计数器比较寄存器位存在与存储器映射计数 TBCTR 寄存器无关的高阶 DWORD (<10)。 ePWM_setCounterCompareValue()调用将0x1添加到偏移地址。 那么、CMPA 0x6A 有效地偏移0x6B?
也许 CMPA 比较应该移动结果(<10)来将存储器映射的 TBCTR 计数与 CMPA 高阶 DWORD 位进行比较、或者是否假定这样?
// // Get the register offset for the Counter compare // registerOffset = EPWM_O_CMPA + (uint16_t)compModule; // // Write to the counter compare registers. // if((compModule == EPWM_COUNTER_COMPARE_A) || (compModule == EPWM_COUNTER_COMPARE_B)) { // // Write to COMPA or COMPB bits // HWREGH(base + registerOffset + 0x1U) = compCount; } else { // // Write to COMPC or COMPD bits // HWREGH(base + registerOffset) = compCount; }
TB 计数的十进制视图表示整个32位都用于位于高位 DWORD 中的 TBCTR 计数(CMPA、CMPB)低分辨率寄存器内容。 周期加载仅为2500、但 CMPA 的存储器映射十进制计数(TBCTR)与存储器映射 CMPA 的高阶/低阶 Dwords 组合相比过高。
实际的 TBCTR 比较值取决于对存储器映射寄存器的指令解码。 似乎 CMPA 比较了 TBCTR 的存储器映射计数、因为16位字寄存器在大多数情况下仍保持稳定状态值。
Gi、
同样、应在上使用十进制双脚垫
CMPA
CMPA ->这个
而不是组合的 CMPA 寄存器。 CMPA 位域
您实际上应该键入32位十进制值、但不应该使用 CMPA。 同意但是...
然而 、TBCTR 的存储器映射计数为24位进入(CMPA)、此计数被比较。 似乎解释了>170ms ePWM-A/B 低电平状态信号空隙(捕捉 CH1、CH2)。 Instaspin PWM 328µs 抽取时间(μ s)、通过 GPIO 端口测量的示波器。
除非将 TBCTR 24位值与 CMPA 进行比较、否则 PWM 脉冲的空空间如何大于170ms。 CMPA 16位寄存器值在稳态发电时间内保持静态。 CMPA 存储器映射的十进制计数不应高、HRPWM 已启用/未启用!
同样、周期是固定的(2500)计数50µs、只有脉宽可以通过 CMPA 改变占空比与 TBCTR 值相比、更新了负载计数。 CMPA 比较肯定会与24位 TBCTR 存储器映射 HRPWM 十进制计数发生比较。 请注意、Vsense EMF 反馈回 Clarke 发生在 PWM 空时间内、请捕获 以下图。
ePWM 生成的输出中有很多死区时间。 因此、在 我的稳态示例中、生成的正弦电流波形 CH2的空闲时间大于170ms。 请注意、TRM 忽略了 TB、TBCTR、CC 子模块的 HRPWM 寄存器详细信息。
您能不能详细说明为什么在 Instaspin 中断抽取时间为328µs μ s 时会出现>170ms 的 PWM 无效?
您实际上应该键入32位十进制值、但不应该使用 CMPA。 同意但是...
然而 、TBCTR 的存储器映射计数为24位进入(CMPA)、此计数被比较。 似乎解释了>170ms ePWM-A/B 低电平状态信号空隙(捕捉 CH1、CH2)。 Instaspin PWM 328µs 抽取时间(μ s)、通过 GPIO 端口测量的示波器。
除非将 TBCTR 24位值与 CMPA 进行比较、否则 PWM 脉冲的空空间如何大于170ms。 CMPA 16位寄存器值在稳态发电时间内保持静态。 CMPA 存储器映射的十进制计数不应高、HRPWM 已启用/未启用!
同样、周期是固定的(2500)计数50µs、只有脉宽可以通过 CMPA 改变占空比与 TBCTR 值相比、更新了负载计数。 CMPA 比较肯定会与24位 TBCTR 存储器映射 HRPWM 十进制计数发生比较。 请注意、Vsense EMF 反馈回 Clarke 发生在 PWM 空时间内、请捕获 以下图。
ePWM 生成的输出中有很多死区时间。 因此、在 我的稳态示例中、生成的正弦电流波形 CH2的空闲时间大于170ms。 请注意、TRM 忽略了 TB、TBCTR、CC 子模块的 HRPWM 寄存器详细信息。
您能不能详细说明为什么在 Instaspin 中断抽取时间为328µs μ s 时会出现>170ms 的 PWM 无效?
点为 TB 模块 TBCTR 存储器映射 CMPA 寄存器在 HRPWM 被启用/未启用时不应计数>2500。 HRPWM 模式似乎在未知情况下启用。 一个 WA,减少24位内存映射的 TBCTR 运行计数到 CMPA,通过 ASM 增补程序的值>10。
如果 HRPE 为0、那么它不被启用。
根据 MCU 数据表、WOW x49c 具有24位 CMPA 寄存器、上面的 TRM 图已过时。 原始 SDK v2.01项目是使用通用 C28xx 器件工具链构建的。 但更改 LAB5工具链 TMS320F28049C 注意到170ms 无效问题、并且未在任何一个 CCS 调试运行上检查 GEL 版本。
CMPA 为16位。 然后是 CMPAHR 最高有效8位。
CMPA = CMPA + CMPAHR 总共24位。
已同意 、但 HRPE=0x0未启用、因此24位十进制 TBCNT 会混淆16位寄存器匹配值、无论 CMPA +1U 位31-16位置如何。
在测试中、我将 CMPA 值加载到位15-0中、并且 mem 映射十进制计数(1024)与加载值 CCS 调试完全匹配、但它只使 EPWMA-A 状态变为高电平并保持高电平。 可以尝试 CMPAHR 加载值与24位 TBCTR 值匹配。 这似乎是计数争用产生170ms 宽空白 PWM 周期的地方?
似乎 CMPA 寄存器的位置相反、CMPAHR 应该占用位 23-0 和 CMPA 位15-0、而不是它现在的存在方式。 24位 TBCTR 计数比 CMPA 16位加载值大得多。
为什么 TBCTR 默认为24位宽计数、而 CMPA 仅为16位宽、HRPE=0x0? 此外、仅显示16位宽负载图18-127 CMPA 寄存器、而非24。 也许寄存器布局从未更新过 TRM、以显示 HRPWM 可能曾经通过 CMPAHR 24位更新过匹配计数? 借助 TM4C TI 系列 MCU 寄存器、存在16位值15-0和24位只需通过位23-0附加8位即可计数负载。
TRM SPRUI33D–2015年11月–2020年9月修订图18-127 CMPA 寄存器未正确地将任何此类情况传达给读者。 ePWM 模块似乎默认模式4 (HRPWM)、因为 TBCTR 计数为24位宽、CMPA 加载值位31-16匹配计数截断? 似乎不应允许 TBPRD 进入计数器比较子模块超过 CMPA 匹配计数加载值。 这种情况似乎会向 CMPA 匹配计数中添加幻象周期。
正确答案 是24位仅在启用 HR 模式时适用。
奇怪的是、上图表示24位 CMPA 和 CMPAHR 为+8 = 32位。 与 CMPA 寄存器相反、图18-127。 这就是我试图表达的观点,存在着不一致的现象。 计数器比较子模块默认为24位有源总线、上图中的+8是完整的32位(uint_32t) CMPAHR。
CMPA 寄存器 x49c 工具链布局(2x16)不表示存在+8结构。 无法通过 CCS 调试通过 CMPA 匹配计数的可视比较来确定 TBCTR 存储器映射读取。
我们只能确定当 CMPA 值强制加载到低阶位(15:0)时 TBCTR 匹配发生。 然后情况变得时髦、16位数字比较器匹配计数逻辑无法正确锁存上/下操作事件。 低分辨率 CMPA 位应加载(15:0)、而高分辨率24位+8在(23:0)的前16位的左侧增加、32位寄存器中的总左至右24位、而不是两个16位寄存器。
工具链+ GEL 文件与计数器比较子模块总线符号的数据表寄存器图不完全匹配。 它不能通过两种方式加载、即争用点、似乎因不匹配的计数事件而发生无效。 然而、PRD 为50µs μ A、占空比和奇数消隐消隐消隐消隐消隐消隐消隐消隐时间为170ms 未启用直流消隐、仅启用边沿计数滤波器、因此存在170毫秒的消隐。
否、CMPA 标准是且始终是16位。 添加的 HR 将使其成为24位。
x49c 是更新的类型4 ePWM 模块、不是 旧版 C2000类的类型0/1。 x49c 数据表图5-58显示了 CMPA 寄存器和总线24位宽、加上 CMPAHR (+8)产生32位寄存器对。 TRM 图18-127不是 x49 MCU 的正确寄存器布局、 图18-15也描述了0/1类 ePWM 模块、数据表具有最高优先级、显示 了4类 ePWM 模块、而不是 TRM。 如果器件类工具链是针对0/1类开发的、它将解释 CMPA 是如何被截断的、从而导致错误的 PWM 周期和170ms 宽的消隐间隔。
同样、PWM 中断抽取328µs CMPA 负载和170ms EPWM-A 脉冲体空产生是不合理的! 我们如何对图5-58中实际 x49数据表显示的内容进行折扣?
0/1型和4型 ePWM 模块之间的差异似乎是内部数据总线的大小从16位扩展到24位。
4类支持:
CMPA 标准是且始终是16位。 添加的 HR 将使其成为24位
本章指南适用于 ePWM 1类。 请参见 TMS320x28xx、28xxx DSP 外设
参考指南(SPRU566)中具有相同类型 ePWM 模块的所有器件的列表、以确定
类型之间的差异、以及 TYPE.T 内特定于器件的差异列表
本章包括模块概述及其每个子模块的相关信息:
•时基模块
•计数器比较模块
•操作限定符模块
•死区发生器模块
•PWM 斩波器(PC)模块
•触发区模块
•事件触发器模块
ePWM 1类与0类模块完全兼容。 类型1在中具有以下增强功能
除了0类特性:
TMS320x28xx CMPA 位15:0
对于24位寄存器访问 HR 模式、ePWM 类型4似乎具有24位宽的计数器比较总线。 通常使用32位寄存器对来处理额外的8位、但 x49c 工具链中的低 CMPA 16位似乎相反。
似乎匹配计数 CMPA 发生在极高的 TBCTR 计数。 似乎适合 TB 重载周期之间的170ms 消隐间隔。
请注意、CMPA 位(15:0) x49c 工具链 GEL 被移入高位字(31:16)、并且未与 TBCTR 24位宽总线完全对齐。
CMPA 寄存器现在加载到基址+1U。 似乎使 CMPA 匹配计数仅为8位宽。 因此有一个 CMPA 匹配计数、但不在预期的 TBCTR 计数。
我们能否修复 GEL 或工具链以将 CMPA 输入移动到位(15:0)和 CMPAHR (23:0)中? 再次删除用于写入的基址(+1U) CMPA (15:0)按预期工作、但未检测到 TBCTR 匹配计数。 TBCTR 显示为24位宽、我们无法在逻辑上将 CMPA 有效(24)负载压榨为16位宽 TBTCR 总线比较器类型4 ePWM 模块。
似乎 TBCTR 计数24位顺序、如上面的逻辑图(红框)所示为 CMPA 24位。 CMPA 寄存器似乎是位(31:16)、由于在32位字段中附加了较低的15:0计数、因此匹配计数周期延长。 计数器比较模块 CCM 对齐接近15:0 TBDCTR 计数时、可能会将 TB 输出减少为16位? 如何做到这一点?
如果我们信任 x49c 数据表或 TRM、则 x49c 工具链完全有可能被处理。 TBCTR 是24位宽的总线、计数超过 TB 负载值15:0 (2500)、如上面的 CCS 调试捕获所示。 由于类型4 ePWM 24位总线问题、我认为将 TBCTR 寄存器16位设置为逻辑 WA。
将级联故障 CMPA 加载到寄存器位(31:16)中。 没有过载屏蔽来停止24位高 TBCTR 计数到 CMPA 31:16。 下面的捕获力加载了 CMPAHR (15:0)和 CMPA 数据、如 x49c 数据表和 TRM 图所示。
然而、根据图 TB 和 CCM、TBCTR 位(15:0)没有发生变化。 TBCTR 总线为24位宽(而非16位)、因此工具链和存储器映射不一致。 TI 工具链 WA 不工作、捕获表示 TBCTR 计数超过了 TB 的加载值。 似乎是谁制作了 x49c 工具链、但没有意识到 CMPAHR +8位被添加到由类型4 ePWM 指示的 TBCTR 输出总线中。
CMPA 总寄存器为32位。
CMPA 标准为16位、后跟8个 CMPAHR 位。 后跟8个保留位。
如4类 ePWM 模块图所示、当 CMPA 应该位于位15:0时、似乎 x49c 工具链将其推入位31:16。 CMPA 寄存器被存储器映射到32位宽的 TBCTR 计数。 图18-129寄存器视图中没有显示16+8位多功能寄存器可能需要的位掩码。 某些 TI MCU 具有预分频寄存器、可将8位添加到16位寄存器中、该 x49c 中不存在该寄存器。
当 CMPA 应该位于位(15:0)时、它位于寄存器位31:16。 请注意、我上次布置的存储器映射图像位15:0中没有 TBCTR 计数。 进一步向上布置的图像 TBCTR 通过存储器映射地址 TBCTR 中的32位整数计算非常高的24位宽视图。
通过16位 DWORD 屏蔽24位存储器映射寄存器可能不会产生预期结果。 当 TBCTR 最大计数为2500而不是32位宽时、TBCTR 似乎是 CMPA 的锁存位、位于31:16、通过2500、0000的 TB 周期计数产生与时间参考不正确的比较器匹配事件。
也就是说、TBCTR 存储器如何映射到 TB 周期计数可能是一个问题。 请注意、在捕获上方、32位整数 TBCTR 计数72548352超过2500个最大周期。 PWM 半周期1250和 TBCTR 溢出以匹配 CMPA 事件。 这似乎是因为 CMPA 位于31:16、因此允许 TBCTR 运行到远远高于 TB 周期计数的溢出时间。