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.
您好!
我正在使用 TMS320F28069并研究 TMS320F28069的 ePWM 模块、我想为三相半波桥式整流器的三个 SCR 生成栅极脉冲。
因此、将使用"过零检测器"、根据 ZCD 的输出、我将触发栅极脉冲。
请建议我正确的流速来驱动栅极脉冲,以及使用哪个 ePWM 模块来实现它。
谢谢你
您的忠实客户
Mihir Dave
嗯、遗憾的是、Mihir、您必须确定要用于控制系统的输出和控制方案。
关于要使用哪些 PWM 模块的主题、我可能能够提供一些有用的输入。 该器件的同步链非常简单、ePWM1依次连接到 ePWM2和 ePWM3、依此类推。 如果您想同步3个不同的 PWM 模块、我建议连续选择3个、例如1、2、3或4、5、6。 如果您选择1、3、4个可以同步、但 PWM 2将永远无法与除 PWM1以外的任何其他 PWM 同步、从而减少了稍后修复系统中错误的机会。
此外、在选择发送同步脉冲的"主"PWM 模块时、您需要选择最慢的 PWM 信号。 这将避免同步脉冲在从 PWM 模块的周期完成之前复位从 PWM 模块的问题。
祝你好运。
此致、
Cody
您好!
因此、我想生成7毫秒的 ePWM 来发出 SCR 栅极脉冲。
有可能吗?
谢谢你
您的忠实客户
Mihir Dave
是的、您可以。 这是一个非常长的脉冲、因此您应该了解 PWM 的计数器和比较寄存器只有16位宽。 以90MHz 运行 TBCLK、您将需要近700、000个时钟周期、这不适合16b 寄存器。
您有2个选项。
我建议您阅读本文档中有关操作限定符的部分。 http://www.ti.com/lit/pdf/spruh18
观看下面签名中的视频也可能有助于您更好地大致了解 PWM 模块。
此致、
Cody
您好!
非常感谢您、我将介绍该信息并让您了解状态。
您好!
我在1、2、3上生成了三个 PWM。
但是,我没有收到中断,我已经附上了代码,请仔细检查,告诉我哪里出错了。
谢谢你
您的忠实客户
Mihir Dave
///-------------------------------------- //文件:DeadBandPWM-Main.c //(死区被应用于 UP、单边不对称波形、 在 EPWM2A 和 EPWM2B 上具有独立//调制) // 说明:该程序设置 EV TIMER2以生成具有 一定数量死区的互补// PWM 波形。观察 //相对使用 ePWM2A 和 ePWM2B 引脚的示波器观察波形。 //-为了改变 PWM 频率、用户应该改变 //"周期"的值。 //- PWM 波形可由"设置操作"下的寄存器重新配置。 //-要观察其他 PWM 引脚、应 正确设置相关的 PWM 时钟和 GPIO MUX 配置//设置(在 ePWM_Sym-DevInit_F28xxx.c 中)。 // 有关更多详细信息、请在 TI.com 上搜索 SPRU791.PDF (TMS320x28xx、// 28xxx 增强型脉宽调制器模块)。 // //目标:TMS320F2806x 或 TMS320F2803x 系列(F28069) // //../../----------- //$TI 发行版:$V1.0 //$发行 日期:$2010年1月11日- VSC //../../----------- // //请阅读-有关此项目的有用说明 //尽管此项目由多个文件组成,但最重要的是: //-"DeadBandPWM.c"、此文件 //-应用程序初始化、外设配置 //-应用程序管理 //-较慢的后台代码循环和任务调度 //"DeadBandPWM-DevInit_F28xxx.c" //-器件初始化、例如时钟、PLL、WD、 GPIO 映射 //-外设时钟启用 //其他文件通常用于支持和将寄存器定义为 C //结构。 一般而言、这些文件不需要更改。 //"F2806X_RAM_DeadBandPWM.CMD"或"F2806X_FLASH_DeadBandPWM.CMD" //-将程序和数据空间分配到器件的存储器映射中。 //"F2806x_Headers_nonBIOS.cmd"和"F2806x_GlobalVariableDefs.c" //-将寄存器结构分配到数据存储器中。 这些寄存器结构是 //在外设头中定义的,包括(F2806x_ADC.h,...) ///////--------------- #include "PeripheralHeaderIninclude.h" #include "F2806X_ePWM_define.h"//初始 化的有用定义#include "F2806x_examples.h"// F2806x 示例包含文件 #include "F2806x_Device.h" // F2806x 头文件包含文件 #include "DSP28x_Project.h" //器件头文件和示例包括文件 #include "piccolo_lcd.h" #define 总线电压1240 ///%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //函数原型 ///%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% void DeviceInit(void); void InitFlash(void); void Memcopy(UINT16 * SourceAddr、UINT16* SourceEndAddr、UINT16* DestAddr); //void initpwm34(); unsigned int VVL=0; //********* void InitEPwm1Gpio (void); void InitEPwm2Gpio (void); void InitEPwm3Gpio (void); typedef 结构 { volatile struct ePWM_regs * EPwmRegHandle; uint16 ePWM_CMPA_DIRECTION; uint16 ePWM_CMpa_uint16;uintmEPwmEP_uint16;uintmEPwmEP_uintmEP16 uint16 EPwmMinCMPA; uint16 EPwmMaxCMPB; uint16 EPwmMinCMPB; }ePWM_INFO; void InitEPwm1Examples(void); void InitEPwm2Example (void); void InitEPwm3Example (void); __interrupt void epwm1_ISR (void); __interrupt void epwm2_ISR (void); __interrupt void epwm3_ISR (void); void update_compare (ePWM_info*); unsigned int jooj=0; //此示例中使用的全局变量 ePWM_info epwm1_info; ePWM_info epwm2_info; ePWM_info epwm3_info; //为每个计时 器配置周期#define EPWM1_TIMER_TBPRD 2000 //周期寄存 器#define EPWM1_MAX_CMPRD 1950 #define EPWM1_MIN_CMPA 50 #define EPWM1_MAX_CMPB 1950 #define EPWM1_MIN_CMPB 50 #define EPWM2_TIMER_TBPRD 2000 //周期寄存 器#define EPWM2_MAX_CMPA 1950 #define EPWM2_MIN_CMPA 50 #define EPWM2_MAX_CMPB 1950 #define EPWM2_MIN_CMPB 50 #define EPWM3_TIMER_TBPRD 2000 //周期寄存 器#define EPWM3_MAX_CMPA 950 #define EPWM3_MIN_CMPA 50 #define EPWM3_MAX_CMPB 1950 #define EPWM3_MIN_CMPB 1050 //跟踪比较值移动 的方式#define ePWM_CMP_UP 1 #define ePWM_CMP_DOWN 0 // //#define DELAY_US (a) DSP28x_usDelay (((( 长双精度) A * 1000.0L)/(长双精度) CPU_RATE)- 9.0L)/5.0L) ///%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //主代码-从此处开始 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% void main (void) { //================================================= //初始化-常规 //================================================= DeviceInit();//器件寿命支持和 GPIO 多路复用器设置 //仅在从闪存运行时使用 //请注意变量闪存由编译器(-d 闪存) #ifdef 闪 存//将时间关键代码和闪存设置代码复制到 RAM // RamfuncsStart、RamsLoadEnd、 和 RamfuncsRunStart //符号由链接器创建。 请参阅链接器文件。 Memcopy (&RamfuncsLoadStart、&RamfuncsLoadEnd、&RamfuncsRunStart); //调用闪存初始化以设置闪存等待状态 //此函数必须驻留在 RAM vcxz InitFlash ()中;//调用闪存包装程序初始化函数 #endif //(FLASH) InitEPwm1Gpio (); EP3Gpio();EPm3Inpio()。 清除所有中断并初始化 PIE 矢量表: //禁用 CPU 中断 DINT; //将 PIE 控制寄存器初始化为默认状态。 //默认状态是禁用所有 PIE 中断并 清除标志//。 //此函数位于 F2806x_PIECTRL.c 文件中。 InitPieCtrl(); //禁用 CPU 中断并清除所有 CPU 中断标志: IER = 0x0000; IFR = 0x0000; //使用指向 shell 中断 //服务例程(service routinese, ISR)的指针初始化 PIE 矢量表。 //这将填充整个表,即使在 本示例中未使用中断//也是如此。 这对于调试很有用。 //可以在 F2806x_DefaultIsr.c 中找到 shell ISR 例程 //此函数可在 F2806x_PieVect.c 中找到 InitPieVectTable(); //此示例中使用的中断被重新映射到 这个文件中的// ISR 函数。 EALLOW;//这是写入 EALLOW 受保护寄存 器 PieVectTable.EPWM1_INT =&epwm1_ISR 所必需的; PieVectTable.EPWM2_INT =&epwm2_ISR; PieVectTable.EPWM3_INT =&epwm3/ISR; EDIS;//禁用写入 EALLOW 受保护寄存器 EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0; EDIS; InitEPwm1Examples(); DELAY_US (500); InitEPwm2Examples(); DELAY_US (500); InitEPwm3Examples(); EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1; EDIS; //步骤4. 初始化所有器件外设: //此函数可在 F2806X_InitPeripherals.c 中找到// InitPeripherals ();//此示例不需要 //步骤5。 特定于用户的代码、启用中断: //在 PIE 中启用 ADCINT1 PieCtrlRegs.PIEIER3.bit.INTx1 = 1; PieCtrlRegs.PIEIER3.bit.INTx2 = 1; PieCtrlRegs.PIEIER3.bit.INTx3 = 1; IER |=M_INT3;//启用 CPU 中断1 EINT;//启用全局中断 INTM ERTM;//启用全局实时中断 DBGM while (1) { VVL=EPwm1Regs.TBCTR; jooj=VVL; if (jooj<40000){ GpioDataRegs.GPBSET.BIO58 = 1; }否则{ EALLOW; GpioDataRegs.GPBCLEAR.bit.GPIO58=1; } } Ctrl_interrupt void epwm1_ISR (void) { //更新 CMPA 和 CMPB 值 update_compare (&epwm1_info); //清除此计时器 的 INT 标志 EPwm1Regs.ETCLR.bit.INT = 1; //确认此中断以接收来自组3 PieRegs.PIEPACK_all 的更多中断;} _interrupt void epwm2_ISR (void) { //更新 CMPA 和 CMPB 值 update_compare (&epwm2_info); //清除此计时器 的 INT 标志 EPwm2Regs.ETCLR.bit.INT = 1; //确认此中断以接收来自组3 的更多中断 PieCtrlRegs.Pwm2Regs.Pch_isc (void 和 Cepm3_isr = 3);//确认此中断 //清除此计时器 EPwm3Regs.ETCLR.BIT.INT 的 INT 标志= 1; //确认此中断以接收来自组3 的更多中断 PieCtrlRegs.PIEACK.ALL = PIEACK_Group3; } void InitEPwm1Examples() { //设置 TBCLK EPwm1Regs.PTIFF.TBRD= 0xTBIT_CTLDFF.TBIT.COUNT = 0xTBIT_UFFFF.TBRD/计数 //设置定时器周期 EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载 EPwm1Regs.TBPHS.Half.TBPHS = 0x0000; //相位为0 EPwm1Regs.TBCTR = 0x0000; //清除计数 器 EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x00;//时钟与 SYSCLKOUT EPwm1Regs.TBCTL.bit.CLKDIV = 0x04; //设置影子寄存器在0 EPwm1Regs.SHDWCTL.bit.EPCMDRP.1RCMPA.SET = 0;/EPWCMDR.CMPA.RCMPA.MODCMPO.RCMPO.RCMPO.RCMP1.M1= 0;EP1RCMPA.MODCMPA.RCMPADCMPO.RCMPO.RCMPO.RCMPO.RCMPO.RCMPO.RCMP1.M1= 0 = 0 = EP1RCMPO.EP1RCMPO.EP1RCMPO.EP1RCMPADCMPO.EP1RCMPA.MODCMPO.ECC.EP_RCMPADCMPADCMPADCMPO.RCMPADCMPADCMP1.MODCMPO.RCMPO.RCMPO.EM //设置比较 B 值 //设置操作 EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; //在零 EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR 上设置 PWM1A; //在事件 A 上清除 PWM1A,向上计数 EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET; //在零 EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR 上设置 PWM1B; //清除事件 B 上的 PWM1B,向上计数 //中断,其中我们将更改比较值 EPwm1Regs.ETSEL.bit.INTSEL = et_CTR_zero; //选择零事件 EPwm1Regs.ETSEL.bit.INTEN 上的 INT = 1; //启用 INT EPwm1Regs.ETPS.bit.INTPRD = et_3rd; //生成第3个事件的 INT //信息此示例用于跟踪 // CMPA/CMPB 值 移动的方向,允许的最小值和最大值以及 //指向正确 ePWM 寄存 器 epwm1_info.ePWM_CMPA_DIRECTION = ePWM_CMP_UP 的指针; //首先增大 CMPA & CMPB epwm1_info.ePWM_CMPB_Direction = ePWM_CMP_UP; epwm1_info.EPwmTimerIntCount = 0; //将中断计数器 epwm1_info.EPwmRegHandle =&EPwm1Regs; //设置 EPWM 模块 epwm1_info.EPwmMaxCMPA = 0xFFFE; //设置最小值/最大值 CMPA/CMPB 值 epwm1_info.EPwmMinCMPA = 0x50; epwm1_info.EPwmMaxCMPB = 0xFFFE; epwm1_info.EPwmMinCMPB = 0x50; } void InitEPwm2Examples() { //设置 寄存器= 0xTBDP.CTL = 0xTb.Tb.Tb.Rtb.Tb.Rtb = 0xTb.Tb.Tb.Tb.Tb.Tbd //设置定时器周期 EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载 EPwm2Regs.TBPHS.Half.TBPHS = 0x0000; //相位为0 EPwm2Regs.TBCTR = 0x0000; //清除计数 器 EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0x00;//时钟与 SYSCLKOUT EPwm2Regs.TBCTL.bit.CLKDIV 的比值= 0x05; //设置 影子寄存器在0 EPwm2Regs.SHDWCTL.bit.EPCMOCC.EP2RP.AMCC.AMPCRP.OCC.RCMDR.RCMTL.RCMPO.RCMTL.RCMPO.RCMTL.RCMPO.RCMTL.RCMPO.RCMTL.RCMTL.RCMTL.RCMTL.RCMPO.RCMTL.RCMTL.RCMTL.RCMPO=0 = 0 = 0 = 0;//设置为0 = 0 = EP2RCMOCC_OCC_OCC_OCC.OCC.OCC.RCMOCC.OCC.OCC.RCMOCC.OCT. //设置比较 A 值 EPwm2Regs.CMPB = EPWM2_MAX_CMPB; //设置比较 B 值 //设置操作 EPwm2Regs.AQCTLA.bit.PRD = AQ_CLEAR; //在周期 EPwm2Regs.AQCTLA.bit.CAU = AQ_SET 时清除 PWM2A; //在事件 A 上设置 PWM2A、向上计数 EPwm2Regs.AQCTLB.bit.PRD = AQ_CLEAR; //在周期 EPwm2Regs.AQCTLB.bit.CBU = AQ_SET 时清除 PWM2B; //在事件 B 上设置 PWM2B,向上计数 //中断,其中我们将更改比较值 EPwm2Regs.ETSEL.bit.INTSEL = et_CTR_zero; //选择零事件 EPwm2Regs.ETSEL.bit.INTEN 上的 INT = 1; //启用 INT EPwm2Regs.ETPS.bit.INTPRD = et_3rd; //生成第3个事件的 INT //信息此示例用于跟踪 // CMPA/CMPB 值 移动的方向,允许的最小值和最大值以及 //指向正确 ePWM 寄存 器的指针 epwm2_info.ePWM_CMPA_DIRECTION = ePWM_CMP_UP;//开始增加 CMPA epwm2_cmp_info.ePWM_ePWM_DIRECTION = ePWM_CMP_DOWN;//开始增加 CMpm_CMpm_CMpM_CMpM_CMpM_CMpM_B 方向 //并减小 CMPB epwm2_info.EPwmTimerIntCount = 0; //将中断计数器 epwm2_info.EPwmRegHandle =&EPwm2Regs; //设置 ePWM 模块 epwm2_info.EPwmMaxCMPA = 0xFFFE 的指针; //设置最小值/最大值 CMPA/CMPB 值 epwm2_info.EPwmMinCMPA = 0x50; epwm2_info.EPwmMaxCMPB = 0xFFFE; epwm2_info.EPwmMinCMPB = 0x50; } void InitEPwm3Examples() { //设置 TBCLk_info.EPwtb.EPwtb = 0xtb.rtb.prd 计数;}void InitEPwmCRTb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.Rtb = 0xTb. //设置定时器周期 EPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载 EPwm3Regs.TBPHS.Half.TBPHS = 0x0000; //相位为0 EPwm3Regs.TBCTR = 0x0000; //清除计数 器 EPwm3Regs.TBCTL.bit.HSPCLKDIV = 0x00;//时钟与 SYSCLKOUT EPwm3Regs.TBCTL.bit.CLKDIV = 0x06; //设置影子寄存器加载于0 EPwm3Regs.SHDWCTL.bit.EPCMDRC.WCMDRP.= 0;EP3CMDRC.WCMDRP.WCMDRP.WCMDRP.= 0;EP3RCMPO.EP_ADCMDRP.CMDRP.WCMPA.SET = 0 EP3RCMPO.EP_OCC.EP3RCMPO.EP_ADCMPA.MODCMPO.= 0;EP3RCMPO.EP_OCC.EP3RCMPO.EP_EP_EPCMPADCMPO.CMPADCMPADCMPADCMPO.= 0 = 0 = EP3RCMPADCMPADCMPADCMPADCMPADCMPADCMPADCMPADCMPADCMPAD.EP3RCMPAD.EP_EP_O //设置比较 B 值 //设置操作 EPwm3Regs.AQCTLA.bit.CAU = AQ_SET; //在事件 B 上设置 PWM3A、向上计数 EPwm3Regs.AQCTLA.bit.CBU = AQ_CLEAR; //在事件 B 上清除 PWM3A,向上计数 EPwm3Regs.AQCTLB.bit.ZRO = AQ_TOGGLE; //将 EPWM3B 切换为零 //中断,其中我们将更改比较值 EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; //选择零事件 EPwm3Regs.ETSEL.bit.INTEN 上的 INT = 1; //启用 INT EPwm3Regs.ETPS.bit.INTPRD = et_3rd; //在发生第三个事件时生成 INT //首先增大比较 A 并减小比较 B epwm3/info.ePWM_CMPA_Direction = ePWM_CMP_UP; epwm3/info.ePWM_CMPB_Direction = ePWM_CMPB_DOWN; //在0 epwm3_info.EPwmTimerfp = 0xEPwmf3 ;EPwm_CMPB_0= 0xEPmcm3 regnf3;EPwm_EPwmfm = 0xEPwmcm2 = 0xEPwmfm epwm3/info.EPwmMinCMPB = EPWM3_min_CMPB; } void update_compare (ePWM_info * ePWM_info) { //每隔10次中断、如果 (ePWM_INFO->EPwmTimerIntCount = 10) {、请更改 CMPA/CMPB 值 ePWM_INFO->EPwmTimerIntCount = 0; //如果我们增加 CMPA,请检查是否 //我们达到了最大值。 如果不是、请增大 CMPA //否则、更改方向并减小 CMPA if (ePWM_INFO->ePWM_CMPA_DIRECTION == ePWM_CMP_UP) { if (ePWM_INFO->EPwmRegHandle->CMPA.half.CMPA < ePWM_INFO->EPwmMaxCMPA) { ePWM_INFO->EPwmRegHandle->CMPA.half-CMPA++; } 其他 { ePWM_INFO->ePWM_CMPA_DIRECTION = ePWM_CMP_DOWN; ePWM_INFO->EPwmRegHandle->CMPA.half-CMPA-; } } //如果我们降低了 CMPA,请检查是否 //我们达到最小值。 如果不是、请减小 CMPA //否则,更改方向并增加 CMPA 其他 { if (ePWM_INFO->EPwmRegHandle->CMPA.half.CMPA =ePWM_INFO->EPwmMinCMPA) { ePWM_INFO->ePWM_CMPA_DIRECTION = ePWM_CMP_UP; ePWM_INFO->EPwmRegHandle->CMPA.half-CMPA++; } 其他 { ePWM_INFO->EPwmRegHandle->CMPA.half-CMPA-; } } //如果我们增加 CMPB,请检查是否 //我们达到了最大值。 如果不是、则增加 CMPB //否则、更改方向并减小 CMPB if (ePWM_INFO->ePWM_CMPB_DIRECTION == ePWM_CMP_UP) { if (ePWM_INFO->EPwmRegHandle->CMPB < ePWM_INFO->EPwmMaxCMPB) { ePWM_INFO->EPwmRegHandle->CMPB++; } 其他 { ePWM_INFO->ePWM_CMPB_DIRECTION = ePWM_CMP_DOWN; ePWM_INFO->EPwmRegHandle->CMPB--; } } //如果我们降低 CMPB,请检查是否 //我们达到最小值。 如果不是、减小 CMPB //否则、更改方向并增加 CMPB 其他 { if (ePWM_INFO->EPwmRegHandle->CMPB =ePWM_INFO->EPwmMinCMPB) { ePWM_INFO->ePWM_CMPB_DIRECTION = ePWM_CMP_UP; ePWM_INFO->EPwmRegHandle->CMPB++; } 其他 { ePWM_INFO->EPwmRegHandle->CMPB--; } } 否则 { ePWM_INFO->EPwmTimerIntCount++; } return; }
Mihir、
在螺母外壳中:
以下专题讨论会将更详细地介绍这一点。
https://training.ti.com/c2000-f2806x-microcontroller-workshop?cu=1137791
如果您想了解此器件上的中断矢量、应查看 TRM 并详细讨论此主题。
此致、
Cody
您好!
谢谢,我会尝试,并返回结果。
Mihir、
你有什么幸运吗?
谢谢、
Cody