RT1052的EPWM

文章目录

  • 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 时钟

RT1052的EPWM_第1张图片 - FLEXPWM 子模块可选的时钟源有 IPBus clock、EXT_CLK。

  • FLEXPWM 子模块 0 还可以选择 AUX_CLK_input 作为时钟源。

1.3 比较寄存器

比较寄存器用于产生 PWM 波,每个 FLEXPWM 拥有 6 个比较寄存器
RT1052的EPWM_第2张图片

  • 第一,只有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);

占空比更新。

你可能感兴趣的:(NXP,fpga开发,单片机,嵌入式硬件)