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.

[参考译文] CCS/TMS320F28377S:不确定如何创建具有死区的三相正弦 PWM

Guru**** 2463330 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/688885/ccs-tms320f28377s-doubt-about-how-to-create-a-3-phase-sine-pwm-with-a-deadband

器件型号:TMS320F28377S
Thread 中讨论的其他器件:controlSUITE

工具/软件:Code Composer Studio

//######################################################################################################################
//
////文件:ePWM_UP_AQ_cpu01.c
//
标题:操作限定器模块-使用向上计数。
//
//! addtogroup cpu01_example_list
//! 

ePWM 操作限定符(ePWM_UP_AQ)

//! //! 此示例将 ePWM1、ePWM2、ePWM3配置为生成 //! EPWMxA 和 //!上具有独立调制的波形 EPWMxB。 //! //! 比较值 CMPA 和 CMPB 在 ePWM 的 ISR 内进行修改。 //! //! 在本示例中、TB 计数器处于向上计数模式。 //! //! 查看 EPWM1A/B (PA0_GPIO0和 PA1_GPIO1)、EPWM2A/B (PA2_GPIO2和 PA3_GPIO3) //! 和 EPWM3A/B (PA4_GPIO4和 PA5_GPIO5)波形。 //! // //########################################################################################################################## //$TI 发行版:F2837xS 支持库 V210 $// $发行 日期:星期二11月1日15:35:23 CDT 2016 $// 版权所有:版权所有(C) 2014-2016德州仪器(TI)公司-// http://www.ti.com/ 保留所有权利$ //############################################################################################################ // //包含的文件 // #include "F28x_Project.h" #define pulsewidth 2499 //(pulsewidth+1)=1/(.04*outputfrequency (in MHz) )#define DUTYCYCLE 2//2表示50% 4表示25%,依此类推 //#define PULSE_WIDTH 28 #define Two _PI 6.2831 // 定义 // ////#define EPWM1_TIMER_TBPRD 2000 //周期寄存 器#define EPWM1_MAX_CMPA 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 EPWM7_TIMER_TBPRD 2000 //周期寄存 器#define EPWM7_MAX_CMPA 950 #define EPWM7_MIN_CMPA 50 #define EPWM7_MAX_CMPB 1950 #define EPWM7_MIN_CMPB 1050 //#define EPWM8_TIMER_TBPRD 2000 //周期寄存 器#define EPWM8_MAX_CMPA 950 #define EPWM8_MIN_CMPA 50 #define EPWM8_MAX_CMPB 1950 #define EPWM8_MIN_CMPB 1050 #define ePWM_CMP_UP 1 #define ePWM_CMP_DOWN 0 const struct PIE_VECT_TABLE PieVectTableInit ={ PI_RESERVE_ISR、 //保留 PI_RESERVE_ISR、 //保留 PI_RESERVE_ISR、 //保留 PI_RESERVE_ISR、 //保留 PI_RESERVE_ISR、 //保留 PI_RESERVE_ISR、 //保留 PI_RESERVE_ISR、 //保留 PI_RESERVE_ISR、 //保留 PI_RESERVE_ISR、 //保留 PI_RESERVE_ISR、 //保留 PI_RESERVE_ISR、 //保留 PI_RESERVE_ISR、 //保留 PI_RESERVE_ISR、 //保留 Timer1_ISR、 // CPU 定时器1中断 TIMER2_ISR、 // CPU 定时器2中断 DATALOG_ISR、 //数据记录中断 RTOS_ISR、 // RTOS 中断 EMU_ISR、 //仿真中断 NMI_ISR、 //不可屏蔽中断 非法_ISR、 //非法操作陷阱 User1_ISR、 //用户定义的陷阱1 User2_ISR、 //用户定义的陷阱2. 用户3_ISR、 //用户定义的陷阱3. User4_ISR、 //用户定义的陷阱4. USER5_ISR、 //用户定义的陷阱5. USER6_ISR、 //用户定义的陷阱6. USER7_ISR、 //用户定义的陷阱7 USER8_ISR、 //用户定义的陷阱8. USER9_ISR、 //用户定义的陷阱9. USER10_ISR、 //用户定义的陷阱10. USER11_ISR、 //用户定义的陷阱11. USER12_ISR、 //用户定义的陷阱12. ADCA1_ISR、 // 1.1 - ADCA 中断1 ADCB1_ISR、 // 1.2 - ADCB 中断1 ADCC1_ISR、 // 1.3 - ADCC 中断1 XINT1_ISR、 // 1.4 - XINT1中断 XINT2_ISR、 // 1.5 - XINT2中断 ADCD1_ISR、 // 1.6 - ADCD 中断1 TIMER0_ISR、 // 1.7 -定时器0中断 WAKE_ISR、 // 1.8 -待机和停止唤醒中断 EPWM1_TZ_ISR、 // 2.1 - ePWM1触发区中断 EPWM2_TZ_ISR、 // 2.2 - ePWM2触发区中断 EPWM3_TZ_ISR、 // 2.3 - ePWM3触发区中断 EPWM4_TZ_ISR、 // 2.4 - ePWM4触发区中断 EPWM5_TZ_ISR、 // 2.5 - ePWM5触发区中断 EPWM6_TZ_ISR、 // 2.6 - ePWM6触发区中断 EPWM7_TZ_ISR、 // 2.7 - ePWM7触发区中断 EPWM8_TZ_ISR、 // 2.8 - ePWM8触发区中断 EPWM1_ISR、 // 3.1 - ePWM1中断 EPWM2_ISR、 // 3.2 - ePWM2中断 EPWM3_ISR、 // 3.3 - ePWM3中断 EPWM4_ISR、 // 3.4 - ePWM4中断 EPWM5_ISR、 // 3.5 - ePWM5中断 EPWM6_ISR、 // 3.6 - ePWM6中断 EPWM7_ISR、 // 3.7 - ePWM7中断 EPWM8_ISR、 // 3.8 - ePWM8中断 eCAP1_ISR、 // 4.1 - eCAP1中断 ECAP2_ISR、 // 4.2 - eCAP2中断 ECAP3_ISR、 // 4.3 - eCAP3中断 ECAP4_ISR、 // 4.4 - eCAP4中断 ECAP5_ISR、 // 4.5 - eCAP5中断 ECAP6_ISR、 // 4.6 - eCAP6中断 PI_RESERVE_ISR、 // 4.7 -保留 PI_RESERVE_ISR、 // 4.8 -保留 EQEP1_ISR、 // 5.1 - eQEP1中断 EQEP2_ISR、 // 5.2 - eQEP2中断 EQEP3_ISR、 // 5.3 - eQEP3中断 PI_RESERVE_ISR、 // 5.4 -保留 PI_RESERVE_ISR、 // 5.5 -保留 PI_RESERVE_ISR、 // 5.6 -保留 PI_RESERVE_ISR、 // 5.7 -保留 PI_RESERVE_ISR、 // 5.8 -保留 SPIA_RX_ISR、 // 6.1 - SPIA 接收中断 SPIA_TX_ISR、 // 6.2 - SPIA 发送中断 SPIB_RX_ISR、 // 6.3 - SPIB 接收中断 SPIB_TX_ISR、 // 6.4 - SPIB 发送中断 MCBSPA_RX_ISR、 // 6.5 - McBSPA 接收中断 MCBSPA_TX_ISR、 // 6.6 - McBSPA 发送中断 MCBSPB_RX_ISR、 // 6.7 - McBSPB 接收中断 MCBSPB_TX_ISR、 // 6.8 - McBSPB 发送中断 DMA_CH1_ISR、 // 7.1 - DMA 通道1中断 DMA_CH2_ISR、 // 7.2 - DMA 通道2中断 DMA_CH3_ISR、 // 7.3 - DMA 通道3中断 DMA_CH4_ISR、 // 7.4 - DMA 通道4中断 DMA_CH5_ISR、 // 7.5 - DMA 通道5中断 DMA_CH6_ISR、 // 7.6 - DMA 通道6中断 PI_RESERVE_ISR、 //7.7 -保留 PI_RESERVE_ISR、 //7.8 -保留 I2CA_ISR、 // 8.1 - I2CA 中断1 I2CA_FIFO_ISR、 // 8.2 - I2CA 中断2 I2CB_ISR、 // 8.3 - I2CB 中断1 I2CB_FIFO_ISR、 // 8.4 - I2CB 中断2 SCIC_RX_ISR、 // 8.5 - SCIC 接收中断 SCIC_TX_ISR、 // 8.6 - SCIC 发送中断 SCID_RX_ISR、 // 8.7 - SCID 接收中断 SCID_TX_ISR、 // 8.8 - SCID 发送中断 SCIA_RX_ISR、 // 9.1 - SCIA 接收中断 SCIA_TX_ISR、 // 9.2 - SCIA 发送中断 SCIB_RX_ISR、 // 9.3 - SCIB 接收中断 SCIB_TX_ISR、 // 9.4 - SCIB 发送中断 CANA0_ISR、 // 9.5 - CANA 中断0 CANA1_ISR、 // 9.6 - CANA 中断1 CANB0_ISR、 // 9.7 - CANB 中断0 CANB1_ISR、 // 9.8 - CANB 中断1 ADCA_EVT_ISR、 // 10.1 - ADCA 事件中断 ADCA2_ISR、 // 10.2 - ADCA 中断2 ADCA3_ISR、 // 10.3 - ADCA 中断3 ADCA4_ISR、 // 10.4 - ADCA 中断4 ADCB_EVT_ISR、 // 10.5 - ADCB 事件中断 ADCB2_ISR、 // 10.6 - ADCB 中断2 ADCB3_ISR、 // 10.7 - ADCB 中断3 ADCB4_ISR、 // 10.8 - ADCB 中断4 CLA1_1_ISR、 // 11.1 - CLA1中断1 CLA1_2_ISR、 // 11.2 - CLA1中断2 CLA1_3_ISR、 // 11.3 - CLA1中断3 CLA1_4_ISR、 // 11.4- CLA1中断4. CLA1_5_ISR、 // 11.5 - CLA1中断5 CLA1_6_ISR、 // 11.6 - CLA1中断6 CLA1_7_ISR、 // 11.7-CLA1中断7 CLA1_8_ISR、 // 11.8 - CLA1中断8 XINT3_ISR、 // 12.1 - XINT3中断 XINT4_ISR、 // 12.2 - XINT4中断 XINT5_ISR、 // 12.3 - XINT5中断 PI_RESERVE_ISR、 // 12.4 -保留 PI_RESERVE_ISR、 // 12.5 -保留 VCU_ISR、 // 12.6 - VCU 中断 FPU_Overflow_ISR、 // 12.7 - FPU 溢出中断 FPU_下溢_ISR、 // 12.8 - FPU 下溢中断 PI_RESERVE_ISR、 // 1.9 -保留 PI_RESERVE_ISR、 //1.10 -保留 PI_RESERVE_ISR、 //1.11 -保留 PI_RESERVE_ISR、 // 1.12 -保留 IPC0_ISR、 // 1.13 - IPC 中断0 IPC1_ISR、 // 1.14 - IPC 中断1 IPC2_ISR、 // 1.15 - IPC 中断2 IPC3_ISR、 // 1.16 - IPC 中断3 EPWM9_TZ_ISR、 // 2.9 - ePWM9触发区中断 EPWM10_TZ_ISR、 // 2.10 - ePWM10触发区中断 EPWM11_TZ_ISR、 // 2.11 - ePWM11触发区中断 EPWM12_TZ_ISR、 // 2.12 - ePWM12触发区中断 PI_RESERVE_ISR、 //2.13 -保留 PI_RESERVE_ISR、 //2.14 -保留 PI_RESERVE_ISR、 //2.15 -保留 PI_RESERVE_ISR、 //2.16 -保留 EPWM9_ISR、 // 3.9 - ePWM9中断 EPWM10_ISR、 // 3.10 - ePWM10中断 EPWM11_ISR、 // 3.11 - ePWM11中断 EPWM12_ISR、 // 3.12 - ePWM12中断 PI_RESERVE_ISR、 // 3.13 -保留 PI_RESERVE_ISR、 //3.14 -保留 PI_RESERVE_ISR、 //3.15 -保留 PI_RESERVE_ISR、 // 3.16 -保留 PI_RESERVE_ISR、 // 4.9 -保留 PI_RESERVE_ISR、 //4.10 -保留 PI_RESERVE_ISR、 // 4.11 -保留 PI_RESERVE_ISR、 //4.12 -保留 PI_RESERVE_ISR、 //4.13 -保留 PI_RESERVE_ISR、 // 4.14 -保留 PI_RESERVE_ISR、 //4.15 -保留 PI_RESERVE_ISR、 // 4.16 -保留 SD1_ISR、 // 5.9 - SD1中断 SD2_ISR、 // 5.10 - SD2中断 PI_RESERVE_ISR、 //5.11 -保留 PI_RESERVE_ISR、 //5.12 -保留 PI_RESERVE_ISR、 //5.13 -保留 PI_RESERVE_ISR、 //5.14 -保留 PI_RESERVE_ISR、 //5.15 -保留 PI_RESERVE_ISR、 //5.16 -保留 SPIC_RX_ISR、 // 6.9 -***接收中断 SPIC_TX_ISR、 // 6.10 -***发送中断 PI_RESERVE_ISR、 // 6.11 -保留 PI_RESERVE_ISR、 //6.12 -保留 PI_RESERVE_ISR、 // 6.13 -保留 PI_RESERVE_ISR、 // 6.14 -保留 PI_RESERVE_ISR、 // 6.15 -保留 PI_RESERVE_ISR、 // 6.16 -保留 PI_RESERVE_ISR、 //7.9 -保留 PI_RESERVE_ISR、 //7.10 -保留 PI_RESERVE_ISR、 //7.11 -保留 PI_RESERVE_ISR、 //7.12 -保留 PI_RESERVE_ISR、 //7.13 -保留 PI_RESERVE_ISR、 //7.14 -保留 PI_RESERVE_ISR、 //7.15 -保留 PI_RESERVE_ISR、 //7.16 -保留 PI_RESERVE_ISR、 //8.9 -保留 PI_RESERVE_ISR、 // 8.10 -保留 PI_RESERVE_ISR、 //8.11 -保留 PI_RESERVE_ISR、 //8.12 -保留 PI_RESERVE_ISR、 //8.13 -保留 PI_RESERVE_ISR、 // 8.14 -保留 #ifdef CPU1 UPPA_ISR、 // 8.15 - UPPA 中断 PI_RESERVE_ISR、 // 8.16 -保留 #Elif Defined (CPU2) PI_RESERVE_ISR、 //8.15 -保留 PI_RESERVE_ISR、 // 8.16 -保留 #endif PI_RESERVE_ISR、 //9.9 -保留 PI_RESERVE_ISR、 // 9.10 -保留 PI_RESERVE_ISR、 //9.11 -保留 PI_RESERVE_ISR、 //9.12 -保留 PI_RESERVE_ISR、 //9.13-保留 PI_RESERVE_ISR、 // 9.14 -保留 #ifdef CPU1 USBA_ISR、 // 9.15 - USBA 中断 #Elif Defined (CPU2) PI_RESERVE_ISR、 // 9.15 -保留 #endif PI_RESERVE_ISR、 // 9.16 -保留 ADCC_EVT_ISR、 // 10.9 - ADCC 事件中断 ADCC2_ISR、 // 10.10 - ADCC 中断2 ADCC3_ISR、 // 10.11 - ADCC 中断3 ADCC4_ISR、 // 10.12 - ADCC 中断4 ADCD_EVT_ISR、 // 10.13 - ADCD 事件中断 ADCD2_ISR、 // 10.14 - ADCD 中断2 ADCD3_ISR、 // 10.15 - ADCD 中断3 ADCD4_ISR、 // 10.16 - ADCD 中断4 PI_RESERVE_ISR、 // 11.9 -保留 PI_RESERVE_ISR、 // 11.10 -保留 PI_RESERVE_ISR、 // 11.11 -保留 PI_RESERVE_ISR、 // 11.12 -保留 PI_RESERVE_ISR、 //11.13 -保留 PI_RESERVE_ISR、 // 11.14 -保留 PI_RESERVE_ISR、 // 11.15 -保留 PI_RESERVE_ISR、 // 11.16 -保留 EMIF_ERROR_ISR、 // 12.9 - EMIF 错误中断 RAM_corrected_error_ISR、// 12.10 - RAM 可纠正的错误中断 FLASH_corrected_error_ISR、// 12.11 -闪存可纠正的错误中断 RAM_ACCESS_violation_ISR、 // 12.12 - RAM 访问冲突中断 SYS_PLL_SLITY_ISR、 // 12.13 -系统 PLL 跳周中断 AUX_PLL_SL滑动_ISR、 // 12.14 -辅助 PLL 跳周中断 CLA_overflow_ISR、 // 12.15 - CLA 溢出中断 CLA_underflow_ISR // 12.16 - CLA 下溢中断 }; void InitPieVectTable (void) { uint16 i; uint32 *源=(void *)&PieVectTableInit; uint32 * dest =(void *) PieVectTable (PieVectTable); // //请勿在前3个32位位置上进行写操作(这些位置是 //由具有引导变量的引导 ROM 初始化) // Source = Source + 3; DEST = Dest + 3; EALLOW; 对于(I = 0;I < 221;I++) { *Dest++=*Source++; } EDIS; } // //全局 // //////float sh; typedef 结构 { volatile struct ePWM_regs * EPwmRegHandle; uint16 ePWM_CMPA_DIRECTION; uint16 ePWM_CMPB_DIRECTION; UINT16 EPwmTimerIntCount; uint16 EPwmMaxCMPA; uint16 EPwmMinCMPA; UINT16 EPwmMaxCMPB; uint16 EPwmMinCMPB; }ePWM_INFO; ePWM_INFO epwm1_INFO; ePWM_INFO epwm2_INFO; ePWM_INFO epwm3_INFO;ePWM_INFO epwm3_INFO; ePWM_info epwm7_info; ePWM_info epwm8_info; // 函数原型 // void InitEPwm1Example (void); void InitEPwm2Example (void); void InitEPwm3Example (void); void InitEPwm7Example (void); void InitEPwm8eEPwmvoid Invoid (void) _interrupt void epwm1_ISR (void); __interrupt void epwm2_ISR (void); __interrupt void epwm3_ISR (void); __interrupt void epwm7_ISR (void); __interrupt void epwm8_ISR (void); void update_compare (ePWM_info*); int vector_pointer、vector_pointer1、vector_pointer2; float input_vector、sinevector[250]、sinevector1[250]、sinevector2[250]; void Initinputvector (void) { int j; //int pulate_width=28; float step_size=two_pi/250; float phase1=two_pi/3; float Phase2=2*two_pi/3; input_vector=0; //sinevector[0]= 0; for (j=1;j<250;j++) { input_vector=input_vector+step_size; Sinevector[j]=pulsewidth*.25*(1+_sin (input_vector)); sinevector1[j]=pulsewidth*.25*(1+_sin (input_vector+phase1)); sinevector2[j]=pulsewidth*.25*(1+_sin (input_vector+Phase2)); } asm (" ESTOP0"); } // // Main // void main (void) { /// //步骤1. 初始化系统控制: // PLL、安全装置、启用外设时钟 //此示例函数位于 F2837xS_SYSCTRL.c 文件中。 // InitSysCtrl(); Initinputvector(); // //步骤2. 初始化 GPIO: //此示例函数位于 F2837xS_GPIO.c 文件和中 //说明了如何将 GPIO 设置为其默认状态。 // // InitGpio(); // //启用 PWM1、PWM2和 PWM3 // CpuSysRegs.PCLKCR2.bit.EPWM1=1; CpuSysRegs.PCLKCR2.bit.EPWM2=1; CpuSysRegs.PCLKCR2.bit.EPWM3=1; CpuSysRegs.PCLKCR2.bit.EPWM7=1; CpuSysRegs.PCLKCR2.bit.EPWM8=1; // //在这种情况下、只需初始化 ePWM1、ePWM2、ePWM3的 GPIO 引脚 //这些函数位于 F2837xS_ePWM.c 文件中 // InitEPwm1Gpio(); InitEPwm2Gpio(); InitEPwm3Gpio(); InitEPwm7Gpio(); InitEPwm8Gpio(); // //步骤3. 清除所有中断并初始化 PIE 矢量表: //禁用 CPU 中断 // Dint; // //将 PIE 控制寄存器初始化为默认状态。 //默认状态为禁用所有 PIE 中断和标志 //被清除。 //此函数位于 F2837xS_PIECTRL.c 文件中。 // InitPieCtrl(); // //禁用 CPU 中断并清除所有 CPU 中断标志: // IER = 0x0000; IFR = 0x0000; // //使用指向 shell 中断的指针初始化 PIE 矢量表 //服务例程(ISR)。 //这将填充整个表,即使是中断也是如此 //在本例中未使用。 这对于调试很有用。 //可以在 F2837xS_DefaultIsr.c 中找到 shell ISR 例程 //此函数可在 F2837xS_PieVect.c 中找到 // InitPieVectTable(); // //此示例中使用的中断被重新映射到 //此文件中的 ISR 函数。 // EALLOW;//这是写入 EALLOW 受保护寄存器所必需的 PieVectTable.EPWM1_INT =&epwm1_ISR; PieVectTable.EPWM2_INT =&epwm2_ISR; PieVectTable.EPWM3_INT =&epwm3/ISR; PieVectTable.EPWM7_INT =&epwm7_ISR; PieVectTable.EPWM8_INT =&epwm8_ISR; EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的 // //对于此示例,只初始化 ePWM // EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0; EDIS; InitEPwm1Examples(); InitEPwm2Examples(); InitEPwm3Examples(); InitEPwm7Examples(); InitEPwm8Examples(); EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1; GpioCtrlRegs.GPAPUD.bit.GPIO4=1; GpioCtrlRegs.GPAPUD.bit.GPIO2=1; EDIS; // //步骤4. 特定于用户的代码、启用中断: // //启用连接到 EPWM1-3 INT 的 CPU INT3: // IER |= M_INT3; // //在 PIE 中启用 ePWM INTn:组3中断1-3 // PieCtrlRegs.PIEIER3.bit.INTx1 = 1; PieCtrlRegs.PIEIER3.bit.INTx2 = 1; PieCtrlRegs.PIEIER3.bit.INTx3=1; PieCtrlRegs.PIEIER3.bit.INTx7=1; PieCtrlRegs.PIEIER3.bit.INTx8 = 1; PieCtrlRegs.PIECTRL.bit.ENPIE=1; // //启用全局中断和更高优先级的实时调试事件: // EINT;//启用全局中断 INTM ERTM;//启用全局实时中断 DBGM // //步骤5. 空闲循环。 只需坐下来循环(可选): // for (;;) { ASM (" NOP"); } } // // epwm1_ISR - EPWM1 ISR 以更新比较值 // __interrupt void epwm1_ISR (void) { // //更新 CMPA 和 CMPB 值 // // update_compare (&epwm1_info); // //清除此计时器的 INT 标志 // EPwm1Regs.ETCLR.bit.INT = 1; // //确认此中断以接收来自组3的更多中断 // PieCtrlRegs.PIEACX.ALL = PIEACK_Group3; } __interrupt void epwm7_ISR (void) { // //更新 CMPA 和 CMPB 值 // //update_compare (&epwm7_info); if (vector_pointer==250) { vector_pointer=0; } EPwm7Regs.CMPA.bit.CMPA=sinevector[vector_pointer]; EPwm7Regs.CMPB.bit.CMPB=sinevector[249-vector_pointer]; vector_pointer++; // //清除此计时器的 INT 标志 // EPwm7Regs.ETCLR.bit.INT = 1; // //确认此中断以接收来自组3的更多中断 // PieCtrlRegs.PIEACX.ALL = PIEACK_Group3; } __interrupt void epwm8_ISR (void) { // //更新 CMPA 和 CMPB 值 // //update_compare (&epwm8_info); if (vector_pointer1==250) { vector_pointer1=0; } EPwm8Regs.CMPA.bit.CMPA=sinevector1[vector_pointer1]; EPwm8Regs.CMPB.bit.CMPB=sinevector1[249-vector_pointer1]; vector_pointer1++; // //清除此计时器的 INT 标志 // EPwm8Regs.ETCLR.bit.INT = 1; // //确认此中断以接收来自组3的更多中断 // PieCtrlRegs.PIEACK.all = PIEACK_Group3; } // epwm2_ISR - EPWM2 ISR 以更新比较值 // __interrupt void epwm2_ISR (void) { // //更新 CMPA 和 CMPB 值 // //update_compare (&epwm2_info); if (vector_pointer2==250) { vector_pointer2=0; } EPwm2Regs.CMPA.bit.CMPA=sinevector2[vector_pointer2]; EPwm2Regs.CMPB.bit.CMPB=sinevector2[249-vector_pointer2]; vector_pointer2++; // //清除此计时器的 INT 标志 // EPwm2Regs.ETCLR.bit.INT = 1; // //确认此中断以接收来自组3的更多中断 // PieCtrlRegs.PIEACX.ALL = PIEACK_Group3; } // epwm3_ISR - EPWM3 ISR、用于更新比较值 // __interrupt void epwm3_ISR (void) { // //更新 CMPA 和 CMPB 值 // update_compare (&epwm3/info); // //清除此计时器的 INT 标志 // EPwm3Regs.ETCLR.bit.INT = 1; // //确认此中断以接收来自组3的更多中断 // PieCtrlRegs.PIEACK.all = PIEACK_Group3; } // InitEPwm1Example -初始化 EPWM1值 // 空 InitEPwm1Examples() { // //设置 TBCLK // EPwm1Regs.TBCTL.bit.CTRMODE = TB_upwPRD 计数;//设置 TBCLK 计数;TBpulm1Rd 宽度; //设置定时器周期 EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载 EPwm1Regs.TBPHS.bit.TBPHS = 0x0000; //相位为0 EPwm1Regs.TBCTR = 0x0000; //清除计数 器//EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;//时钟与 SYSCLKOUT 的比率//EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2; // 设置影子寄存器加载为零 // EPwmCOM.TBCMDR.BIT.WCMDR.BIT.1TL.BIT.SEC.ADCMTL.RCMTL.RCMTL.RCMTL.TL.TL.RCMTL.TL.RCMTL.RCMTL.TL.RCMTL.TL.TL.RCMTL.RCMTL.TL.RCMTL.TL.RCMTL.TL.RBIT_PADTL.TL.RCMTL.TL.RCMTL.TL.TL.TL.TL.RCMTL.TL.TL.TL.TL.TL.TL.TL.TL.TL.TL.TL.TL.TL.TBIT_PADTL.TL.TL.TL.TL.TBIT_PADTL. //设置比较 A 值 EPwm1Regs.CMPB.bit.CMPB = EPWM1_MIN_CMPB; //设置比较 B 值 // 设置操作 // EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; //在零 EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR 上设置 PWM1A; //在事件 A 上清除 PWM1A、 //向上计数 EPwm1Regs.AQCTLB.bit.CAU = AQ_SET; //在零 EPwm1Regs.AQCTLB.bit.ZRO = 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 = EPWM1_MAX_CMPA; //设置最小值/最大值 // CMPA/CMPB 值 epwm1_info.EPwmMinCMPA = EPWM1_MIN_CMPA; epwm1_info.EPwmMaxCMPB = EPWM1_MAX_CMPB; epwm1_info.EPwmCMPB = EPWM1_MIN_CMPB; = EPWM1/ EPWEP2TBRTb/ EPWBIST/ EPW/ EPWCTL = EPWBIST/ EPW/ INEPWCRW/ INW/ INEP2TBRTBIST/ INW/ INWCRW/ INW/ INEPWCTB/ INW/ INEPWCRW/ INEPWCRW/ INEPW/ INEPW/ INEPWCTB/ INEPWCRW/ INEPW/ INEPWCRW/ INEPW/ INEPWCTB/ INEPW/ //设置定时器周期 EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载 EPwm2Regs.TBPHS.bit.TBPHS = 667; //相位为0 EPwm2Regs.TBCTR = 0x0000; //清除计数 器//EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;//时钟与 SYSCLKOUT 的比率//EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;EPwm3REGS.bit.EPCMDRP.TL.RCMTL.BIT.TL.TCMTL.TL.TCMTL.TCLTL.TCMTL.TL.TBIT.TL.TL.TBIT.TL.TCMTCLTL.TL.TL.TBIT.TL.TCMTL.TL.TBIT.TL.TL.TBIT.SET= 0 ;EP2TCMTCMTL.TL.TL.TL.TL.TCLTCMTL.TCLTL.TL.TL.TCLTL.TL.TCLTL.TCLTL.TL.TL.TBIT_OCTRCMTL.TL.TL.TL.TL.TBIT_OCTRCMTL.TL.TBIT.TL.TL.TBIT_OCTRCMTL.TL.TL.TBIT.TL.TL. //设置比较 A 值 EPwm2Regs.CMPB.bit.CMPB =脉宽/DUTYCYCLE; //设置比较 B 值 // //设置操作 // EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET; //在周期 EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR 上清除 PWM2A; //在事件 A 上设置 PWM2A、 //向上计数 EPwm2Regs.DBCTL.bit.out_mode=11; EPwm2Regs.DBCTL.bit.in_mode=00; EPwm2Regs.DBRED.bit.DBRED=100; EPwm2Regs.DBFED.bit.DBFED=100;EPwm2Regs.DBFED=100; EPwm2REFREP.POL=10;EPwmCTL 位 /*EPwm2Regs.TZCTL.bit.TZA=01; EPwm2Regs.TZCTL.bit.TXB=11; */ EPwm2Regs.AQCTLB.bit.ZRO = AQ_SET; //在周期 EPwm2Regs.AQCTLB.bit.CBU = AQ_CLEAR 上清除 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_info.ePWM_CMPB_Direction = ePWM_CMP_DOWN;//并减小 CMPB epwm2_info.EPwmTimerIntCount = 0; //将中断置零 //计数 器 epwm2_info.EPwmRegHandle =&EPwm2Regs; //将指针设置为 // ePWM 模块 epwm2_info.EPwmMaxCMPA = EPWM2_MAX_CMPA; //设置最小值/最大值 // CMPA/CMPB 值 epwm2_info.EPwmMinCMPA = EPWM2_MIN_CMPA; epwm2_info.EPwmMaxCMPB = EPWM2_MAX_CMPB; epwmMinCMPB = EPWM2_MIN_CMPB; } // EPwM2/ EP3TBR = EPWCREM/EPW/ EPWLD3 = EPWCREM/EPW/ EPWLD3 = EPWCREM.E/ EPWCREM.TIFAC/ EPW/ EP3/ EPWCREM.EPT3 = EPW/ EPWLD/ EPWCREM.EPT3 = EPW/ EPWCREM.E/ EPWCREM/EPW/ INLD/ INLD/ EPWCREM.EPWCREM.EMOW = EPWCREM.EM. //设置定时器周期 EPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载 EPwm3Regs.TBPHS.bit.TBPHS =667; //相位为0 EPwm3Regs.TBCTL.bit.SYNCOSEL=00; EPwm3Regs.TBCTR = 0x0000; //清除计数 器 EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;//时钟与 SYSCLKOUT EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV2; // 设置影子寄存器加载为零 // EPwm3Regs.TBCMDR.BIT.OCC.BIT.SEC.AMPCM0=TL.TL.ADCMDR.OCR.TL.TL.TL.RCMTL.TL.RCMTL.TL.TL.RCMTL.RCMTL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.RCMTL.TL.TL.TL.TL.TL.RCMTL.TL.TL.TL.RCMTL.TL.TL.TL.TL.RCMTL.TL.TL.TL.TL.TL.RCMTL.TL.TL.TL.TL.TL.TL.TL.TL. //设置比较 A 值 EPwm3Regs.CMPB.bit.CMPB = EPWM3_MAX_CMPB;//设置比较 B 值 // //设置操作 // EPwm3Regs.AQCTLA.bit.ZRO = AQ_SET; //在事件 B 上设置 PWM3A、向上计数 EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR; //在事件 B 上清除 PWM3A、 //向上计数 EPwm3Regs.AQCTLB.bit.ZRO = AQ_TOGGLE; //将 EPWM3B 切换为零 // 中断,其中我们将更改比较值 // EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//选择零事件上的 INT EPwm3Regs.ETSEL.bit.INTEN = 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 // epwpa_info.ePWM_EPmM3 ;mp3_EPwmcm3 = EPwmcmmcm3 epwm3/info.EPwmMinCMPB = EPWM3_min_CMPB; } void InitEPwm7Exampl() { // //设置 TBCLK // EPwm7Regs.TBCTL.bit.CTRMODE = TB_COUNT_Upth;//向上计数 EPwm7Regs.TBPRD =脉宽;// //设置定时器周期 EPwm7Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载 EPwm7Regs.TBPHS.bit.TBPHS = 0x0000; //相位为0 EPwm7Regs.TBCTR = 0x0000; //清除计数 器//EPwm7Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;//时钟与 SYSCLKOUT 的比率//EPwm7Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2; // 设置影子寄存器加载为零 // EPwmCC.AM7REP.AMCC.AMCC.TRF_ADCMTL.TL.TL.DR.TL.DR.TL.TBIT.AMCMTL.DR.TL.TL.TL.TL.TL.RCMTL.TL.RCMTL.TL.TL.RCMTL.RCMTL.RCMTL.RCMTL.TL.TL.RCMTL.RCMTL.TL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.RCMTL.TL.TL.TL.TL.TL.TL.TL.TL.TL.TL.TBIT_PADDR.TL.TL.TL.TL.TBIT. //设置比较 A 值 EPwm7Regs.CMPB.bit.CMPB =脉宽/DUTYCYCLE; //设置比较 B 值 EPwm7Regs.DBCTL.bit.out_mode=11; EPwm7Regs.DBCTL.bit.in_mode=00; EPwm7Regs.DBRED.bit.DBRED=100; EPwm7Regs.DBFED.bit.DBFED=100; EPwm7Regs.DBCTL.bit.POLSEL=10; // 设置操作 // EPwm7Regs.AQCTLA.bit.ZRO = AQ_SET; //在周期 EPwm7Regs.AQCTLA.bit.CAU = AQ_CLEAR 上清除 PWM2A; //在事件 A 上设置 PWM2A、 //向上计数 EPwm7Regs.AQCTLB.bit.ZRO = AQ_SET; //在周期 EPwm7Regs.AQCTLB.bit.CBU = AQ_CLEAR 上清除 PWM2B; //在事件 B 上设置 PWM2B、 //向上计数 // //中断,其中我们将更改比较值 // EPwm7Regs.ETSEL.bit.INTSEL = et_CTR_ZERO; //选择零事件 EPwm7Regs.ETSEL.bit.INTEN 上的 INT = 1; //启用 INT EPwm7Regs.ETPS.bit.INTPRD = et_3rd; //生成第3个事件的 INT // 信息此示例用于跟踪 // CMPA/CMPB 值 移动的方向,最小和最大允许值以及 //指向正确 ePWM 寄存器的指针 // epwm7_info.epwm_cmpa_Direction = ePWM_cmp_up; //首先增大 CMPA epwm7_info.ePWM_CMPB_Direction = ePWM_CMP_DOWN;//并减小 CMPB epwm7_info.EPwmTimerIntCount = 0; //将中断置零 //计数 器 epwm7_info.EPwmRegHandle =&EPwm7Regs; //将指针设置为 // ePWM 模块 epwm7_info.EPwmMaxCMPA = EPWM7_MAX_CMPA; //设置最小值/最大值 // CMPA/CMPB 值 epwm7_info.EPwmMinCMPA = EPWM7_min_CMPA; epwm7_info.EPwmMaxCMPB = EPWM7_MAX_CMPB; epwm7_info.EPwmCMPB = EPWM7_MIN_CMPB ; = EPWM7_EPWRTCMPB/ EP8W/ EPWEPWEPWCREMB/ EPW8 = EPW/ EPWCREMB/ EPW/ EPWCREMB/ void = EPW8 / EPWEPWCRW/ EPWEPW/ EPWCREMB/ EPW/ EPWEPWCRW/ EPWCREMB/ EP8 = EPWCRW/ EPW/ EPWCREMB/ EPW/ EPWEPWEPWCRW/ EPWEPWCREMB/ EP8 //设置定时器周期 EPwm8Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载 EPwm8Regs.TBPHS.bit.TBPHS =(120/180)*脉宽; //相位为0 EPwm8Regs.TBCTL.bit.SYNCOSEL=00; EPwm8Regs.TBCTR = 0x0000; //清除计数 器//EPwm8Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;//时钟与 SYSCLKOUT 的比率//EPwm8Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2; // 设置影子寄存器加载为零 // EPwmCOM.TBCMDR.BIT.BRC.T= EP8CC.ADCMDR.TL.TL.TL.RCMPOTL.RCMTL.TL.TL.RCMTL.RCMTL.TL.RCMTL.TL.RCMTL.TL.TL.RCMTL.TL.RCMTL.TL.RCMTL.TL.RBIT.RCMTL.TL.RCMTL.TL.RBIT.RCMTL.TL.RCMTL.TL.TL.RCMTL.TL.TL.RBIT.RCMTL.TL.TL.TL.TL.TL.TL.TL.TL.TL.TL.TL.TL.TL.TL.TL.TBIT_PADRBIT. //设置比较 A 值 EPwm8Regs.CMPB.bit.CMPB = EPWM8_MAX_CMPB;//设置比较 B 值 // //设置操作 // EPwm8Regs.AQCTLA.bit.ZRO = AQ_SET; //在事件 B 上设置 PWM3A、向上计数 EPwm8Regs.AQCTLA.bit.CAU = AQ_CLEAR; //在事件 B 上清除 PWM3A、 //向上计数 EPwm8Regs.AQCTLB.bit.CBU = AQ_CLEAR; //将 EPWM3B 切换为零 EPwm8Regs.AQCTLB.bit.ZRO =AQ_SET; // 中断、其中我们将更改比较值 // EPwm8Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//在零事件 EPwm8Regs.ETSEL.bit.intel = ET_0时选择 INT;//在零事件时选择 INT = EPwm8Regs.ETSEL.bit.int10; //启用 INT EPwm8Regs.ETPS.bit.INTPRD = et_3rd; //在发生第3个事件 EPwm8Regs.DBCTL.bit.out_mode=11时生成 INT; EPwm8Regs.DBCTL.bit.in_mode=00; EPwm8Regs.DBRED.bit.DBRED=100; EPwm8Regs.DBFED.bit.DBFED=100; EPwm8Regs.DBCTL.bit.POLSEL=10;// 通过增大比较 A 并减小比较 B 来开始 // epwm8_info.ePWM_CMPA_DIRECTION = ePWM_CMP_UP; epwm8_info.epwPWM_CMPB_DIRECTION = ePWM_CMPWM_8; // EPwm8_EP_EPwm8 = EPmWMP_EP_EPm8 ;epwm8 = EP_EPwm8 EP_EP_EPmWMP_EP_EP_EPm8;epm8 = EPwmWMP_EP_EP_EPm8 = EP_EP_EPmWMP_EP_EP_EP_EPm8;EPm8 = EPmWMP_EP_EP_EP_EPm8 = EP_EPmWMP_EP_EP_EP_EPm8 = EP_EP_EPm8;EP_EP_EPm8 = EPmWMP_EP_EPm8 epwm8_info.EPwmMinCMPB = EPWM8_min_CMPB; } // // update_compare -更新指定 ePWM 的比较值 // void update_compare (ePWM_info * ePWM_info) {// //每10次中断一次,更改 CMPA/CMPB 值 /= ePWM=eIntwmCount ePWM_INFO->EPwmTimerIntCount = 0; // //如果我们增加 CMPA,请检查是否 //我们达到了最大值。 如果不是、请增大 CMPA //否则、更改方向并减小 CMPA // if (ePWM_INFO->ePWM_CMPA_DIRECTION == ePWM_CMP_UP) { if (ePWM_INFO->EPwmRegHandle->CMPA.bit.CMPA < ePWM_INFO->EPwmMaxCMPA) { ePWM_INFO->EPwmRegHandle->CMPA.bit.CMPA++; } 其他 { ePWM_INFO->ePWM_CMPA_DIRECTION = ePWM_CMP_DOWN; ePWM_INFO->EPwmRegHandle->CMPA.bit.CMPA--; } } // //如果我们降低了 CMPA,请检查是否 //我们达到最小值。 如果不是、请减小 CMPA //否则,更改方向并增加 CMPA // 其他 { if (ePWM_INFO->EPwmRegHandle->CMPA.bit.CMPA =ePWM_INFO->EPwmMinCMPA) { ePWM_INFO->ePWM_CMPA_DIRECTION = ePWM_CMP_UP; ePWM_INFO->EPwmRegHandle->CMPA.bit.CMPA++; } 其他 { ePWM_INFO->EPwmRegHandle->CMPA.bit.CMPA--; } } // //如果我们增加 CMPB,请检查是否 //我们达到了最大值。 如果不是、则增加 CMPB //否则、更改方向并减小 CMPB // if (ePWM_INFO->ePWM_CMPB_DIRECTION == ePWM_CMP_UP) { if (ePWM_INFO->EPwmRegHandle->CMPB.bit.CMPB < ePWM_INFO->EPwmMaxCMPB) { ePWM_INFO->EPwmRegHandle->CMPB.bit.CMPB++; } 其他 { ePWM_INFO->ePWM_CMPB_DIRECTION = ePWM_CMP_DOWN; ePWM_INFO->EPwmRegHandle->CMPB.bit.CMPB--; } } // //如果我们降低 CMPB,请检查是否 //我们达到最小值。 如果不是、减小 CMPB //否则、更改方向并增加 CMPB // 其他 { if (ePWM_INFO->EPwmRegHandle->CMPB.bit.CMPB =>= ePWM_INFO->EPwmMinCMPB) { ePWM_INFO->ePWM_CMPB_DIRECTION = ePWM_CMP_UP; ePWM_INFO->EPwmRegHandle->CMPB.bit.CMPB++; } 其他 { ePWM_INFO->EPwmRegHandle->CMPB.bit.CMPB--; } } 否则 { ePWM_INFO->EPwmTimerIntCount++; } return;* } // //////文件结束 //

我使用了上面的代码、在 7A 和7B 上得到的正弦波看起来是这样的、

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

    Deepak、

    我们有一些电机控制示例、其中生成了 SVPWM、如果您不使用 SVPWM、则它是正弦调节 PWM、

    您可以查看一些参考代码并进行比较、以查看问题和差异、

    逐行调试不是我可以通过 e2e 论坛不幸地推断的支持范围。

    C:\ti\controlSUITE\development_kits\TMDSIDDK_v2.0\IDDK_PM_Servo_F2837x_v2_00_00_00