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.
工具/软件:Code Composer Studio
您好!
我有两个 PWM 信号 PWM1和 PWM2、它们使用"//*模型初始化函数*/"生成。 我想读取 引脚的状态 (PWM1A 为 GPIO0、PWM2A 为 GPIO2) 并将它们写回引脚(GPIO4作为 PWM3A、GPIO5作为 PWM3B) 、而无需初始化 PWM3。 我使用了不同的 GPIO 寄存器、如下面的代码所示、但我没有得到完全相同的 GPIO0和 GPIO2产生的信号。 GPIO4和 GPIO5的信号输出会有一些延迟、有时在特定占空比下、当我更改 PWM1和 PWM2的 CAMP 寄存器的值时、我不会从引脚 GPIO4和 GPIO5获得任何输出信号。 那么、请帮帮我。
#include "StackedTwoPhase.h" #include "StackedkedTwoPhase_Private .h" /*块信号(默认存储)*/ B_StackedTwoPhase_T StackedTwoPhase_B; //实时模型* RT_MODEL & StackedTwoPhase_T StackedTwoPhase_M ********************** StackedPhuackedPhuPhase_Stoc相 位*(st_M = ************************************************* /数字输入'*/ { StackedTwoPhase_B.I1 = GpioDataRegs.GPADD.bit.GPIO0; } /* S 函数(c280xgpio_di):' /数字输入1'*/ { StackedTwoPhase_B.I2 = GpioDataRegs.GPADD.bit.GPIO2; } // MATLAB 函数:' /MATLAB Function1'包含: * constant:' /constant' */ /* MATLAB 函数结束:' /MATLAB Function1'*/ /* S-function (c280xgpio_do):' /数字输出'*/ { if (StackedTwoPhase_B.I1) GpioDataRegs.GPASET.BIO4=1; 否则 GpioDataRegs.GPACLEAR.BIO4=1; } // S 函数(c280xgpio_DO):' /数字输出1'*/ { if (StackedTwoPhase_B.I2) GpioDataRegs.GPASET.BIO5=1; 否则 GpioDataRegs.GPACLEAR.BIO5=1; } /*增益:' /TMPRD'包含: *常量:' /constant' */ RTB_TMPRRD = StacTwoPhase_P.TMPRRD_Gain * StackedTwoPhase_P.constant_value; // S 函数(c2802xpwm):' /ePWM1'*/ /*-更新 ePWM1的 CMPA 值-*/ { EPwm1Regs.CMPA.bit.CMPA =(uint16_T)(RTB_TMPRRD); } // S 函数(c2802xpwm):' /ePWM2'包含: *常量:' /Phase_2' */ EPwm2Regs.TBPHS.bit.TBPHS = 499; /*-更新 ePWM2的 CMPA 值-*/ { EPwm2Regs.CMPA.bit.CMPA =(uint16_T)(RTB_TMPRRD); } // 注册模型函数*/* void for ePWM16_t * //初始化's (void)*/* pixedinuinuinuinuinu_gcum_do' /数字输出'*/ EALLOW; GpioCtrlRegs.GPADIR.bit.GPIO4 = 1; EDIS; //开始 S 函数(c280xgpio_do):' /数字输出1'*/ EALLOW; GpioCtrlRegs.GPADIR.bit.GPIO5 = 1; EDIS; //开始 S 函数(c2802xpwm):' /ePWM1'*/ EALLOW; CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0; EDIS; /***初始化 ePWM1 计数器模块***/{/*//时基控制寄存器 EPwm1Regs.bit.TBCLKSYNC0 = 0;TBIT.TMPR0 = TBIT.TMPR0;TCMOP.TCMOPR0 = TMPR0 = TBR0;TBIT.TMPR0 = TBIT.TMPR0 / TMPR0 = TBIT.TBR0 = TCMON.TMPR0;TMPR0 = TBIT.TMPR0 = TCMOPTM0;TMPR0 = TMPR0 = TMPR //相位加载使能 EPwm1Regs.TBCTL.bit.PHSDIR = 0;//相位方向位 EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;//高速 TBCLK 预分频 器 EPwm1Regs.TBCTL.bit.CLKDIV = 0;//所有 ~ 时间 TBDCL = 0*/ TBDCLK 预分频器 EPwCLK = 0XM1RP.TBR = 0;/ TBDCLKCLK = 0XTBR = 0/ TBDCLKT.TBR = 0/ TBR = 0/ TBDCLKCLKCLK = 0*所有时间/ TBR (TBR) /EPwm1Regs.TBPRD = 999;//时基周期寄存器 /*//时基相位寄存 器 EPwm1Regs.TBPHS.bit.TBPHS = 0;//相位偏移寄存 器*/ EPwm1Regs.TBPHS.ALL =(EPwm1Regs.TBPHS.ALL &~μ s)| EPwm1Regs.TBCC.0*/ PRC 计数器0x0000-计数器0x0000*/减计数器0x0000*/减计数器0x0000*/减计数器0x0000.TBRD/减计数器计数器计数器计数器 // //计数器比较控制寄存 器 EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0;//比较 A 寄存器块运行模式 EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0;//比较 B 寄存器块运行模式 EPwm1Regs.CMPCTL.bit.AMODE = 0;//比较 B 寄存器块运行模式 EPwM1REGP.AMODE = 0;EPWMODE.AMODP.0;EPWMODE.ADDR.AMOD0 = 0;EPwM1REP.AMODP.AMODP.AMODP. //活动比较 B 加载 */ EPwm1Regs.CMPCTL.ALL =(EPwm1Regs.CMPCTL.ALL &~ ~0x5F)| 0x0;// EPwm1Regs.CMPCTL2.bit.SHDWCMODE = 0;//比较 C 寄存器块操作模式 EPwm1Regs.CMTL2 = 0xCMDCMDP.RDC0.0;EPwCMDCMDCMDCMDP.0 = 0xCMDCMDCMDCMWCL.RCOM.W0 = 0xM0/ EPwCMDP.RCMDCMDCMDP.0 //计数器比较 A 寄存器 EPwm1Regs.CMPB.CMPB = 0;//计数器比较 B 寄存器 EPwm1Regs.CMPC = 0;//计数器比较 C 寄存 器 EPwm1Regs.CMPD = 0;//计数器比较 D 寄存器 /*-设置操作 -寄存器限定符(AQwLA.CLA)子模块-/ EPwm1Regs.CMPD = 0;//针对 所有 EPwlb. //输出 B 的动作 限定器控制寄存器//动作限定器软件强制寄存器 EPwm1Regs.AQSFRC.bit.RLDCSF = 0;//从影子选项重新加载*/ EPwm1Regs.AQSFRC.ALL =(EPwm1Regs.AQSFRC.ALL &~0xC0)| 0x0;/EPWM1Reger.AQSFRC.FCS0*=(EPwm1Regim1.QFCR.R ) //输出 A EPwm1Regs.AQCSFRC.bit.CSFB 上的持续软件强制= 0;//输出 B 上的持续软件强制 */ EPwm1Regs.AQCSFRC.ALL =(EPwm1Regs.AQCSFRC.ALL &~0xF)| 0x0; /*- Setup Dead-Band-Control =(EPwmRdB/Db.DB-Control =)*/ Db.Dbt dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/ //死区输出模式控制 EPwm1Regs.DBCTL.bit.IN_MODE = 0;//死区输入选择模式控制 EPwm1Regs.DBCTL.bit.POLSEL = 2;//极性选择控制 EPwm1Regs.DBCTL.bit.HALFCMRCLE = 0;//半 ~ 个位 REDP.DBCTRL = 0xDBW1RED.DBRCLD;//所有 EPwmRd.DBC20=0XD.DBRCM.DBRCLD = 0xDBCTRL = 0xDBW1RED.DBRMCTL.DBW1RED.RED.RED.RED.RED.RED.RED.RED.RED.RED.RE //死区发生器上升沿延迟计数寄存 器 EPwm1Regs.DBFED.bit.DBFED = 20;//死区发生器下降沿延迟计数寄存器 /*-设置事件触发(ET)子模块-*/ //事件触发器选择和预分频寄存 器 EPwm1CASC.ETSEL.bit.EEPwSEL.EN=1;EPwSEL.CASTM1CASEPM= 0 = 1;EPwSEL.EN.SOLE.EN.EN.EN.SOEPM4 = 1;EPwSEL.CASTEPwSEL.CASTOL.CAST_1 = 1 = 1;EPM.EN.EN.EN.EN.SOEPM4; //转换开始 A 选择 EPwm1Regs.ETPS.bit.SOCAPRD = 1;// EPWM1SOCA 周期选择 EPwm1Regs.ETSEL.bit.SOCBEN = 0;//转换开始启用 EPwm1Regs.ETSELCMP = 0;EPwm1RP.EPTM.SOSELCMP = 0;EPwm1RP.EPT.EPS.EEPn 位/EPwM1RTE.EPT.EPS.1RP.EEPn = 1;EPwmSESL.EPM.EPT.EPS.1RP.1RP.1RP.1RP.EEPn 位= 0;EPwM1M1RP.EPT.EPS.EN.EPT.EPT.EPS.EPS.EPT.EPS.EN.EPM1.TESL.1RP.1RP.1RP.1RP.1 EPwm1Regs.ETSEL.bit.INTSEL = 4;//转换开始 A Select EPwm1Regs.ETPS.INTPRD = 1;// EPWM1INTn 周期选择 */ EPwm1Regs.ETSEL.ALL =(EPwm1Regs.ETSEL.ALL &~ ~0xFF7F 周期选择*;/EPwm1RP.PWM.0* =)/EPwPC1.01 =(EPwm1RP.0*)/EPwCMP.0X1RP.0*)| EP1RP.EPTMR1RP.0*=(EPW1RP.ETRS.PC.ALL =(EPW1RP.0*)/EPW1P.0*) // PWM 斩波使能 EPwm1Regs.PCCTL.bit.CHPFREQ = 0;//斩波时钟频率 EPwm1Regs.PCCTL.bit.OSHTWTH = 0;//一次性脉冲宽度 EPwm1Regs.PCCTL.bit.CHPDCRY = 0;// chdopt 1WCL.Ep =~0;//所有 跳变频(0* EpwmCL.0*)= 0* EPwmCL.0*(EPwmRETP.0*) //跳闸区域选择寄存器 //跳闸区域控制寄存 器 EPwm1Regs.TZCTL.bit.TZA = 3;// EPWM1A 上的 TZ1至 TZ6跳闸动作。EPwm1Regs.TZCTL.bit.TSB = 3;// EPWM1B 上的 TZ6跳闸动作= TZ1 ;EPWCT1.TZT1 = 3;EPT1 = TZEVTZ1 = TZ1。EPT1.TCAREG3;EPT1.TZ1 = TZ1 = TZEVTZ1。 // DCAEVT2 EPwm1Regs.TZCTL.bit.DCBEVT1上的 EPWM1A 操作= 3;// DCBEVT1 EPwm1Regs.TZCTL.bit.DCBEVT2上的 EPWM1B 操作 */ EPwm1Regs.TZCTL.BIT.DCBEVT2上的 EPWM1B 操作*= ~0;// ETRIP.T1RET.EDRT.T1RET.ETRS.T0 = 0 = 0;// ETRIP.TRIP.TRIP = 0 = 0 = 0;// ETRIP.TRIP.TRIP.TRIP.TRIP.TRIP.TRIP.TRIP.T1RT.E1.T0*= 0 = 0.TRIP.TRIP.TRIP.TRIP.TRIP.TRIP.TRIP.TRIP.TRIP.T1RT.E1.T //跳匣区域逐周期启用 EPwm1Regs.TZEINT.BIT.DCAEVT1 = 0;//数字比较 A 事件1内部启用 EPwm1Regs.TZEINT.BIT.DCAEVT2 = 0;//数字比较 A 事件2内部启用 EPwm1Regs.TZEINT.BIT.B0;数字比较 1 = EBIT.DCBEVT1 = 0;EBIT.DCT2 = 0 //数字比较 B 事件2内部使能 */ EPwm1Regs.TZEINT.ALL =(EPwm1Regs.TZEINT.ALL &~0x7E)| 0x0; //数字比较 A 控制寄存器 EPwm1Regs.DCACTL.bit.EVT1SYNCE = 0;// EPT1RDC1RDC1RDC1RDC1RDC1RDC1RECS.EP.EP.TACTL.EP.EP.EP.DC1RDC1SYNCE = 0;// EPT1RDC1RDC1RDC1RDC1RDC1 = EP.DC1RDC1RDC1RECS.EP.EP.TAC1.TAC1.TAC1.TAC1.TACTL.EP.EP.TAC1.DC1REC.EP.EP.TAC1.TAC1.TAC1. // DCAEVT1源信号 EPwm1Regs.DCACTL.bit.EVT2FRCSYNCSEL = 0;// DCAEVT2强制同步信号 EPwm1Regs.DCACTL.bit.EVT2SRCSEL = 0;// DCAEVT2源信号 *; // EPWM1Regs.DCACTL = 0xDC1RP.EPT0*/ DCMEP1RP.EPT1.RP.0 = 0;/ DCMEP1RP.DC1RP.EPT1.TCM.EP.0 = 0;/ DCMEP1RP.DR1.T1RP.EPT1.T1RP.DCM.EP.0*= 0 ~0;/ DCMEP1RP.DR1.DC1.DC1.TCMEP1RP.EPT1.TCM.EP.DR1.T1RP.DR.EP.DR1.T1RCM. // DCBEVT1 SOC 使能 EPwm1Regs.DCBCTL.bit.EVT1FRCSYNCSEL = 0;// DCBEVT1强制同步信号 EPwm1Regs.DCBCTL.bit.EVT1SRCSEL = 0;// DCBEVT1源信号 EPwm1Regs.DCBEVL = 0xCbT1RP.EPT2.0;/ DCBEVT1RDCRT2RP.EPT2.0 = 0xCRT2 = 0 ~EPT0RES.DCB0R0;EPT0R0 = DCB0/ DCBEVTCB0R20RBTL = 0 = 0;EPT0R20RCTL = 0 = DCBDCBEPT2 = 0 = 0 = DCBEPT0/ DCB0RCTL = DCBEPT0RTE.DCB0RTE.DCB0RTE. /*//数字比较跳闸选择寄存 器 EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 0;//数字比较 A 高 COMP 输入选择 EPwm1Regs.DCTRIPSEL.bit.DCALCOMPSEL = 1;//数字比较 A 低 COMP 输入选择 EPwm1Regs.DCTRIPSEL.bit.DCAMPSEL = 1;数字比较 A 低 COMPREP.DCOMPSEL = 0;数字比较 DCOMPRCOMPL = 0 //数字比较 B 低 COMP 输入选择 */ EPwm1Regs.DCTRIPSEL.ALL =(EPwm1Regs.DCTRIPSEL.ALL &~ 0xFFFF)| 0x1010; //跳匣区域数字比较器选择寄存 器 EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 0/ 数字比较 器0 = 0;数字比较 DCS1RDCSRF.T0 = 0;数字输出 //数字比较输出 B 事件1 EPwm1Regs.TZDCSEL.bit.DCBEVT2 = 0;//数字比较输出 B 事件2 */ EPwm1Regs.TZDCSEL.ALL =(EPwm1Regs.TZDCSEL.ALL &~0xFFF)| 0x0; // EEPwm1Regs.TCCEL.ALL = (EPwCLT.EP.EP.TFPWCTL =禁用 EPwmCL.TRF0 )寄存器;// EPwm1位/EPwCL1.PM1.Cf1位/EPwCLT.EP.EP.EP.Cf1 //针对消隐和捕捉对齐 的脉冲选择 EPwm1Regs.DCFCTL.bit.BLANKINV = 0;//消隐窗口反转 EPwm1Regs.DCFCTL.bit.SRCEL = 0;//滤波器块信号源选择 */ EPwm1Regs.DCTL.ALL =(EPwmCFCTL.bit.SRCSEL = 0);//滤波器块信号源选择*~ = 0xDCFDCW 偏移0XDCW = 0XDCW;EPWM1RF1REGP.DC0XDC0XDCF = 0;EPT.EPT.DC10/偏移 DRF1RF1RCOL = 0XDC0XDC0XDC0XDC10/偏移 //数字比较滤波器窗口寄存 器//数字比较捕捉控制寄存器 EPwm1Regs.DCCAPCTL.bit.Cape = 0;//计数器捕捉使能 */ EPwm1Regs.DCCAPCTL.ALL =(EPwm1Regs.DCCAPCTL.ALL &~0x1)| 0x0; // EPwm1Regs.EPCFG = EPw401.00n 位/EPWCCRPMB.0b = EPw40b = EPwHRCHRCnv1.00n 位/EPwMB;EPW1.SWRPMB.0b = EPwMb = EPWCCRPMB.0b = EPwKb = EPwMb // EPWMB 输出选择位 */ EPwm1Regs.HRCNFG.ALL =(EPwm1Regs.HRCNFG.ALL &~0xA0)| 0x0; //使用所有比较值和 TBPRD 的链接值更新链接寄存器*// ////如果模型中存在 ePWM 寄存器,则不抛出错误* EPwmRCLK.EPWCLK.INK.EPWCLK/ EPwm1Regs.EPWMXLINK.BIT.CMPALINK = 0; EPwm1Regs.EPWMXLINK.BIT.CMBLINK = 0; EPwm1Regs.EPWMXLINK.BIT.CMPCLINK = 0; EPwm1Regs.EPWMXLINK.EPWMXLINK = 0;EPWMXLINK = 0位 EDIS; EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS; } //开始 S 函数(c2802xpwm):' /ePWM2'包含: *常量:' /Phase_2' */ EALLOW; CpuSysRegs.PCLKCR2.bit.EPWM2 = 1; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0; EDIS; /***初始化 ePWM2模块***/ { /*//时基控制寄存 器 EPwm2Regs.bit.TBCLKSYN = 0;TBIT.TCMOS0 = 0;TBR0/ TBR0/ TBIT.TCMOS2计数器= 0;TBR0/ TBR0/ TBIT.TCCTRS0 = TBR0/ TBR0/ TBIT.TBR0/ TBR0/ TBR0/ TBR0/ TBR0/ TBRTCM0 =位 EPn = TCCTRM0/ TBRTBR0.TBR0.TBIT.T //相位加载使能 EPwm2Regs.TBCTL.bit.PHSDIR = 0;//相位方向位 EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0;//高速 TBCLK 预分频 器 EPwm2Regs.TBCTL.bit.CLKDIV = 0;//所有 ~ 时间 TBDCL = 0*/ TBDCTRL = 0/ TBM2CLK 预分频器 EPwCLKCLKCLK = 0;/TBR = 0XMCLKCLKCLK.TBR = 0XMCLK.TBR = 0/ TBR = 0/ TBR = 0XMCLK.Tb.Tb.Tb.TBR = 0/所有时间/ TBR (TBR) /EPwm2Regs.TBPRD = 999;//时基周期寄存器 /*//时基相位寄存 器 EPwm2Regs.TBPHS.bit.TBPHS = 0;//相位偏移寄存 器*/ EPwm2Regs.TBPHS.ALL =(EPwm2Regs.TBPHS.ALL &~μ s)| EPwm2Regs.TBCC.0*计数器/减计数器0x0000*/减计数器0x0000*/减计数器0x0000.TBRC.T/减计数器0 /* //计数器比较控制寄存 器 EPwm2Regs.CMPCTL.bit.SHHDWAMODE = 0;//比较 A 寄存器块运行模式 EPwm2Regs.CMPCTL.bit.SHDWBMODE = 0;//比较 B 寄存器块运行模式 EPwm2Regs.CMPCTL.bit.AMODE = 0;/ ADDRV0/ ADDRODE = 0;EPwM2LODP.AMODP.AMODE = 0 //活动比较 B 加载 */ EPwm2Regs.CMPCTL.ALL =(EPwm2Regs.CMPCTL.ALL &~ ~0x5F)| 0x0;// EPwm2Regs.CMPCTL.bit.SHDPCMMODE = 0;//比较 C 寄存器块操作模式 EPwm2Regs.CMT2.TCL0.0 = 0xCMD/ EPwCMD/ EPCR2.TCL0.T0;EPmRd/ EPmRd/ EPwCMD/ EPwCMD.Rd.Rd.Rd.Rd.Rd= 0xM2MCMTCMD/ Rd.Rd.Rd.Rd.Rd.Rd.Rd.Rd.Rd.CMTCMDCMDCMDCMDCMDCMD/位 //计数器比较 A 寄存器 EPwm2Regs.CMPB.bit.CMPB = 0;//计数器比较 B 寄存器 EPwm2Regs.CMPC = 0;//计数器比较 C 寄存 器 EPwm2Regs.CMPD = 0;//计数器比较 D 寄存器 /*-设置操作 -寄存器限定符(AQWCLA)子模块-ePWM2Regimer.CMPD = 0;// EPwq2LAG.q.Control = 0;//针对 所有 EPwlb. //输出 B 的动作 限定器控制寄存器//动作限定器软件强制寄存器 EPwm2Regs.AQSFRC.bit.RLDCSF = 0;//从阴影选项重新加载*/ EPwm2Regs.AQSFRC.ALL =(EPwm2Regs.AQSFRC.ALL &~0xC0)| 0x0;/EPWM2Reger.AQSFRC.FCS0*/连续动作寄存 器 //输出 A EPwm2Regs.AQCSFRC.bit.CSFB 上的持续软件强制= 0;//输出 B 上的持续软件强制 */ EPwm2Regs.AQCSFRC.ALL =(EPwm2Regs.AQCSFRC.ALL &~0xF)| 0x0; /*- Setup Dead-Band-Control =(EPwmRdB/Db.DB-Control =)*/ Db.Dbt DCM.DCMDCM.DE/ DCMDB-MODULL.DULL.DULL.DCMDCM.ADR/ DULES.ADR=(EPwd/ D/ //死区输出模式控制 EPwm2Regs.DBCTL.bit.IN_MODE = 0;//死区输入选择模式控制 EPwm2Regs.DBCTL.bit.POLSEL = 2;//极性选择控制 EPwm2Regs.DBCTL.bit.HALFCMCLE = 0;//半 ~ 个位 RECLD.EEPwm2Regs.DBC20=0xDBRd.DBRd.EEPw2Rd.DBCTRL = 0Xn (所有) //死区发生器上升沿延迟计数寄存 器 EPwm2Regs.DBFED.bit.DBFED = 20;//死区发生器下降沿延迟计数寄存器 /*-设置事件触发(ET)子模块-*/ //事件触发器选择和预分频寄存 器 EPwm2CASREP.ETSEL.bit.EEPwSEL.EN=4 ;EPwSEL.CASTM0=EN.EN.EN.EN=4;EPwSEL.CASTICAL = 1 = EN.EN.EN.EN.EN.EN.EN.EN.EN.EN.EN.ENTRFICAL 位= 1;EPM.EN.EN.EN.EN.EN.EN. //转换开始 A 选择 EPwm2Regs.ETPS.bit.SOCAPRD = 1;// EPWM2SOCA 周期选择 EPwm2Regs.ETSEL.bit.SOCBEN = 0;//转换开始启用 EPwm2Regs.ETMS.bit.EEPw2PRC.EEPn = 0;EPwm2PRC.EPS2.tn = EPw/ EPwM2PRC.EPM.EN.EPM2.tn 位转换 开始 EPwm2Regs.ETSEL.bit.INTSEL = 4;//转换开始 A Select EPwm2Regs.ETPS.INTPRD = 1;// EPWM2INTn 周期选择 */ EPwm2Regs.ETSEL.ALL =(EPwm2Regs.ETSEL.ALL &~ ~0xFF7INTn 周期选择*)*/ EPwm2Regs.ETPL.0*=(EPwm2RP.0*)/EPwCMPS.TRPm0*=(EPW0X1RP.0*) // PWM 斩波使能 EPwm2Regs.PCCTL.bit.CHPFREQ = 0;//斩波时钟频率 EPwm2Regs.PCCTL.bit.OSHTWTH = 0;//一次性脉冲宽度 EPwm2Regs.PCCTL.bit.CHPDCRY = 0;// chmCL.E0* 所有~ (EPwm2REP.ETRL = 0*)+ 0*(EPwmCL.EmCL.E0*) //跳闸区域选择寄存器 //跳闸区域控制寄存 器 EPwm2Regs.TZCTL.bit.TZA = 3;// EPWM2A EPwm2Regs.TZCTL.bit.TSZ1 = 3;// TZ1至 TZ6跳闸动作在 EPWM2A EPwm2Regs.TZCTL.bit.TSB = 3;// EPT2.TZEVTZ2至 TZ6跳闸动作在 EPT2.TZ2 上= 3;EPT2.TZ2 = TCAREG2.TMR2.TMR2.TMR2 = 3 ;EPT2.TMR2.TMR2.TMR2.TMR2.TMR2.TMR2.TMR2.TMR2.T2 // DCAEVT2 EPwm2Regs.TZCTL.bit.DCBEVT1上的 EPWM2A 动作= 3;// DCBEVT1 上的 EPWM2B 动作 * EPwm2Regs.TZCTL.bit.DCBEVT2 = 3;// DCBEVT2上的 EPWM2B 动作**/ EPwm2Regs.TCB0* /~ ETRIP = 0xW0* TRIP.ETRIP.TRIP.T0/ ETRIP.T0.T0.ETRIP.ETRIP.ETRIP.E0.TRIP.TRIP.E0.TRIP.TRIP.E0.T20.ETRIP.ETRIP.TRIP = 0;// ETRIP.ETRIP.TRIP.TRIP.E0.TRIP.TRIP.TRIP.TRIP.TRIP.TRIP.T //跳匣区域逐周期启用 EPwm2Regs.TZEINT.BIT.DCAEVT1 = 0;//数字比较 A 事件1内部启用 EPwm2Regs.TZEINT.BIT.DCAEVT2 = 0;//数字比较 A 事件2内部启用 EPwm2Regs.TZEINT.BIT.B0 = 0;数字比较 A 事件2 InT.DCBEVT0 = 0;EINT.DCBI = 0;EINT.DBIT.DCT2 = 0 //数字比较 B 事件2内部使能 */ EPwm2Regs.TZEINT.ALL =(EPwm2Regs.TZEINT.ALL &~0x7E)| 0x0; //数字比较 A 控制寄存器 EPwm2Regs.DCACTL.BIT.EVT1SYNCE = 0;// EPT1RDC1RDC1SYSRC.EP.TAC1.TDC0/ EP.DC1RDC0/ EFRTACTRS.TACTL.EP.DC1RDC1RDC0/ EFRTACTRS.TACTRS.TACTL.EP.DC1SYENTRS.TACTRC.EP.DC1 = EP.DC1RDC1RDC0/ EFRTACTRS.TACTL.EP.DC1RCMOC.EP.DC1REC.EP.DC1REC.EP.DC // DCAEVT1源信号 EPwm2Regs.DCACTL.bit.EVT2FRCSYNCSEL = 0;// DCAEVT2强制同步信号 EPwm2Regs.DCACTL.bit.EVT2SRCEL = 0;// DCAEVT2源信号 */ EPwm2Regs.DCACTL ~ = 0;/ DCMEP1RP.DC0*= 0;/ DCMEP2RP.EPT1.DC0* 0 = 0;/ DCMEP2RP.DC0* n = 0;/ DCMEP2RP.DC0* n = 0;DCMEP2RP.EPTC.EP.DC0* n // DCBEVT1 SOC 启用 EPwm2Regs.DCBCTL.bit.EVT1FRCSYNCSEL = 0;// DCBEVT1强制同步信号 EPwm2Regs.DCBCTL.bit.EVT1SRCSEL = 0;// DCBEVT1源信号 EPwm2Regs.DCBEVT2REP.0 = 0xCBTC.0/ EPT2RP.EPT2.TCB0/ DCB0RDCRT2RP.EPT2.RES.ERT2 = 0 ~0;EPT2RP.DCB0RP.DCB0/ DCBEV2信号源= 0xCRT2RDCRT2RP.DCB0RP.DCB0/所有 DCB0RCTL = 0;EPT2.DCB0RCTL = 0RCTL = 0 = 0;EPT0RCTL = 0RCTL = 0 = 0 = 0 /*//数字比较跳闸选择寄存 器 EPwm2Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 0;//数字比较 A 高 COMP 输入选择 EPwm2Regs.DCTRIPSEL.bit.DCALCOMPSEL = 1;//数字比较 A 低 COMP 输入 选择 EPwm2Regs.DCTRIPSEL.BIT.DCOMPSEL = 1;数字比较 A 低 COMPSEL 位= 0;DCOMPRCOMPRCOMPL = 0;DCOMPRCOMPREP.DCMP= 0 //数字比较 B 低 COMP 输入选择 */ EPwm2Regs.DCTRIPSEL.ALL =(EPwm2Regs.DCTRIPSEL.ALL &~ 0xFFFF)| 0x1010; //跳匣区域数字比较器选择寄存 器 EPwm2Regs.TZDCSEL.bit.DCAEVT1 = 0/ 数字比较器0;EPT2.TDCSR2.T0 = 0;数字比较 DCT2 = 0;数字事件 DCTDCTDCOM.DCT2;数字比较 DCT2 = 0 = 0 //数字比较输出 B 事件1 EPwm2Regs.TZDCSEL.bit.DCBEVT2 = 0;//数字比较输出 B 事件2 */ EPwm2Regs.TZDCSEL.ALL =(EPwm2Regs.TZDCSEL.ALL &~0xFFF)| 0x0; // EEPwm2Regs.TbLPM1.Cfb =禁用 EPwCL.EPT.EPM2寄存器;// EPwCLT.Cf.EPM2 //针对消隐和捕捉对齐 的脉冲选择 EPwm2Regs.DCFCTL.bit.BLANKINV = 0;//消隐窗口反转 EPwm2Regs.DCFCTL.bit.SRCEL = 0;//滤波器块信号源选择 */ EPwm2Regs.DCFL.ALL =(EPwm2Regs.EPT.0XDCF =~0) ;//滤波器块信号源偏移量= 0XDCW = 0XDCW;EPW2RF2RF0XDC0XDC0XDC0XDC0XDC0XDCF = 0;EDRV0XDC0XDC0XDC0XDC0XDCF //数字比较滤波器窗口寄存 器//数字比较捕捉控制寄存 器 EPwm2Regs.DCCAPCTL.bit.Cape = 0;//计数器捕捉使能 */ EPwm2Regs.DCCAPCTL.ALL =(EPwm2Regs.DCCAPCTL.ALL &~0x1)| 0x0; // EPwm2Regs.EPCFG = EPw0b = EPwM0.HRCNTL.EPMB.0b;EPWHRCHRCHREST.EPMB.0b = EPwM0b = EPwM0b = EPwM0b = EPWAB.EPMB.EPMB.EPMB.EPMB.EPMB.EPMB.0 // EPWMB 输出选择位 */ EPwm2Regs.HRCNFG.ALL =(EPwm2Regs.HRCNFG.ALL &~0xA0)| 0x0; //使用所有比较值和 TBPRD 的链接值更新链接寄存器*// ////如果模型中存在 ePWM 寄存器,则不抛出错误* EPwmLMK.EPWCLK.EPWINK/ EPwm2Regs.EPWMXLINK.BIT.CMPALINK = 1; EPwm2Regs.EPWMXLINK.BIT.CMBLINK = 1; EPwm2Regs.EPWMXLINK.BIT.CMPCLINK = 1; EPwm2Regs.EPWMXLINK = 1;EPWMXLINK = 1位;EPWMXLINK = 1;EPWCLIN.CMPCLINK = 1 EDIS; EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS; } } //模型终止函数* / void StackedTwoPhase_terminate (void) { //(无需终止代码)* //* //*生成代码的文件尾部。 * *[EOF] */
穆罕默德
我有点困惑、您是如何复制信号的? 状态并将其写回来实现的?
NIMA
你好、Nima、
感谢您的回复。
是的、我是说读取 GPIO0和 GPIO2引脚的状态、并立即将它们写回 GPIO4和 GPIO5引脚。 当我更改 CMPA 值以将 ePWM1和 ePWM2的占空比从0.1更改为0.9时,对于某些值,我在 GPIO04和 GPIO05引脚中看不到任何信号,而使用其他值,我得到的信号与 GPIO0和 GPIO2引脚所需的信号不同。 BTW、信号 ePWM1和 ePWM2之间存在相移。 请查看新上传的图片。
我还在使用 MATLAB 中的嵌入式支持包来生成代码。
此致、
穆罕默德
穆罕默德
您所做的工作将始终存在延迟。 要使信号通过 GPIO 输入电路、然后通过 SW 进行读取、然后通过 SW 写回、然后通过 GPIO 输出电路、您将始终具有此延迟。
NIMA
NIMA、
感谢您抽出宝贵的时间做出响应。 我明白了!
老实说、我的主要目的是实际组合和比较两个 PWM 信号、例如 PWM1A 和 PWM2A、以获得第三个 PWM 信号 、即 PWM3A 和 PWM3B。
换句话说、我想使用栅极逻辑来比较这两个信号。 例如:
(PWM1A XOR PWM2A = PWM3A)、和(PWM1A NXOR PWM2A = ePWM3B)。
因此、我考虑将 GPIO 引脚用作输入和输出信号。 那么、您能不能建议我采用更高效的方式吗?
此致、
穆罕默德
[引用用户="Mohammed Alharbi"]
老实说、我的主要目的是实际组合和比较两个 PWM 信号、例如 PWM1A 和 PWM2A、以获得第三个 PWM 信号 、即 PWM3A 和 PWM3B。
换句话说、我想使用栅极逻辑来比较这两个信号。 例如:
(PWM1A XOR PWM2A = PWM3A)、和(PWM1A NXOR PWM2A = ePWM3B)。
[/报价]
完美、现在我知道您要做的事情、我可以更好地指导您。
您必须使用 CLB、CLB 非常适合这种情况。
您可以通过 CLB 访问 EPWM1、2、3、您可以使用 EPWM1A 和 EPWM2A 作为 CLB 逻辑块的输入(使用 CLB3)、然后在 CLB 模块的 LUT 中实现逻辑、然后通过 CLB 输出相交(覆盖)将信号输出到 EPWM3A。
它将没有延迟。 内置硬件支持。
NIMA
training.ti.com 上提供了大量 CLB 文档(用户指南、应用报告等)+视频教程+ 20多个示例(基于 driverlib)。
NIMA
感谢 Nima 的帮助。 我会尝试研究如何使用建议的方法来执行这些操作。
此致、
穆罕默德