文章目录
- 1 EPWM介绍
- 1.1 引脚
- 1.2 时钟
- 1.3 比较寄存器
- 2 函数
1 EPWM介绍
RT1052 具有 4 个 eFlexPWM(eFlexWM1~eFlex_PWM4)。
- 每个 eFlexPWM 可以产生四路互补 PWM即产生 8 个 PWM,也可以产生相互独立的 PWM 波。四路分别是模块0-3
- 每个 eFlexPWM 具有各自的故障检电路,当故障发生时根据程序锁定 PWM 输出引脚的电平状态。
1.1 引脚
PWM_A 与 PWM_B 可以独立输出也可以作为互补对输出。
- PWM_X 比较特殊,只有 eFlex PWM1 拥有 PWM_X 对应的外部输出引脚可直接输出 PWM。
- eFlexPWM(eFlexWMM2~eFlex_PWM4) 只能通过 XBAR 映射到外部输出引脚才能输出 PWM。
1.2 时钟
- FLEXPWM 子模块可选的时钟源有 IPBus clock、EXT_CLK。
- FLEXPWM 子模块 0 还可以选择 AUX_CLK_input 作为时钟源。
1.3 比较寄存器
比较寄存器用于产生 PWM 波,每个 FLEXPWM 拥有 6 个比较寄存器
- 第一,只有eFlexPWM1拥有与PWMX直接对应的外部引脚,而其他FLEXPWM
需要使用 XBAR 映射到相应的外部引脚才能输出 PWM。 - 第二,比较寄存 0 和 1 可以输出 HalfComp 信号和 Mod Comp 信号,这两个信号可用作 eFlexPWM1 寄存器加载信号。
- 比较寄存器 2 和 3 用于产生 PWM23
- 比较寄存器 4 和 5 用于产生 PWM45
- 根据寄存器配置不同,PWM23 和 PWM45 可以独立输出,也可以组成一对互补的 PWM 波
2 函数
CLOCK_SetDiv(kCLOCK_AhbDiv, 0x2); /* Set AHB PODF to 2, divide by 3 */
CLOCK_SetDiv(kCLOCK_IpgDiv, 0x3); /* Set IPG PODF to 3, divede by 4 */
CLOCK_SetDiv
/* Set the PWM Fault inputs to a low value */
XBARA_Init(XBARA1);
XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputLogicHigh, kXBARA1_OutputFlexpwm1Fault0);
XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputLogicHigh, kXBARA1_OutputFlexpwm1Fault1);
XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputLogicHigh, kXBARA1_OutputFlexpwm1234Fault2);
XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputLogicHigh, kXBARA1_OutputFlexpwm1234Fault3);
XBAR函数
typedef enum _pwm_chnl_pair_operation
{
kPWM_Independent = 0U, /*!< PWM A & PWM B operate as 2 independent channels */
kPWM_ComplementaryPwmA, /*!< PWM A & PWM B are complementary channels, PWM A generates the signal */
kPWM_ComplementaryPwmB /*!< PWM A & PWM B are complementary channels, PWM B generates the signal */
} pwm_chnl_pair_operation_t;
模式配置。 A产生信号,B互补等。
PWM_Init(PWM2,kPWM_Module_3,&pwm2sm3_config); //初始化PWM2模块3
模块初始化
/* Call the init function with demo configuration */
PWM_DRV_Init3PhPwm();
初始化PWM波的配置
//设置PWM2,中央对齐模式
PWM_SetupPwm(PWM2,kPWM_Module_3,&pwm_ignal,2,kPWM_CenterAligned,fre,sourceclock);//使用了两个通道
PWM_SetPwmLdok(PWM2,kPWM_Control_Module_3,true); //设置PWM的load ok位
PWM_StartTimer(PWM2,kPWM_Control_Module_3); //开启定时器
kPWM_CenterAligned 中央对齐模式
/* Update duty cycles for all 3 PWM signals */
PWM_UpdatePwmDutycycle(BOARD_PWM_BASEADDR, kPWM_Module_0, kPWM_PwmA, kPWM_SignedCenterAligned, pwmVal);
PWM_UpdatePwmDutycycle(BOARD_PWM_BASEADDR, kPWM_Module_1, kPWM_PwmA, kPWM_SignedCenterAligned, (pwmVal >> 1));
PWM_UpdatePwmDutycycle(BOARD_PWM_BASEADDR, kPWM_Module_2, kPWM_PwmA, kPWM_SignedCenterAligned, (pwmVal >> 2));
/* Set the load okay bit for all submodules to load registers from their buffer */
PWM_SetPwmLdok(BOARD_PWM_BASEADDR, kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2, true);
占空比更新。