【S32K3 RTD LLD篇4】K344 EMIOS PWM+TRIGMUX+LCU

最近学习了S32K344的EMIOS生成一路PWM, 尝试过上升计数,上升下降计数方式改变频率和占空比,还有输入PWM波捕获等功能,但是不过瘾,还想学习LCU,把一路PWM给输出成两路互补的PWM,不过由于LCU的输入信号不支持引脚直接输入,所以顺势学习了TRIGMUX,TRIGMUX可以把多种的内部信号给转成另外的内部信号。所以,本文主要以如何实现在S32DS RTD4.0.0 LLD,S32K344-EVB板子上使用EMIOS生成一路4KHz,50%占空比的PWM输出,并且把这路PWM接入到TRIGMUX,然后连接到LCU IN0,再通过逻辑单位输出两路互补的PWM到LCU0 OUT0,OUT1引脚,实现功能如下:

在这里插入图片描述

图1

1. 工程模块搭建

从上述框图可以看到,组成块主要有三块:eMIOS,TRGMUX, LCU,那么,到了S32DS K344 RTD LLD工程中,又分为哪些模块呢?主要还是分为Pins,Clocks,Peripherals。只是在Peripherals中需要添加的模块有:BaseNXP, Emios_Mcl_lp_1, Emios_Pwm_1, Lcu_Ip, Siul2_Port_1, Trgmux_Ip.
本文的代码,可以基于S32K344 RTD 4.0.0 现有的Emios_Pwm_Example_S32K344基础,然后删除不必要的代码和配置,添加上自己需要的模块和代码,工程名可以改为自己需要的名称,下面分别给出具体的配置以及代码情况。

1.1 工程配置

1.1.1 Pins

本文使用到的引脚主要有3个,一个Emios0_ch4自己原始输出的PWM波,两个LCU输出一对互补的PWM波,LCU0_OUT0和emios0_ch4同样,LCU0_OUT1和emios0_ch4反向。引脚情况添加如下:

在这里插入图片描述

图 2

1.1.2 clocks

对于时钟,保持原有RTD4.4.0 的Emios_Pwm_Example_S32K344工程默认配置即可,主要关注下emios的时钟源频率,这样可以去计算需要PWM频率所对应的周期counter值。可以看到,EMIOS_CLK默认配置的是48Mhz:

在这里插入图片描述

图 3

1.1.3 Peripherals

对于外设这块,需要添加的内容较多,主要配置的外设模块涉及到:
Emios_Mcl_lp_1: 配置emios通道,bus模式,周期counter,分频系数等。
Emios_PWM_1: 配置具体通道的ID,模式选择, PWM时钟周期以及占空比,时钟分频系数等。
Siul1_Port_1: 添加三个引脚的portpin
Trgmux_lp: 配置逻辑触发单元,硬件输入输出通道
Lcu_Ip: 配置LCU逻辑单元,逻辑输入,逻辑输出,控制值情况。

1.1.3.1 Emios_Mcl_lp_1配置

预想配置的PWM的周期为4KHZ,50%占空比,因为EMIOS0的时钟源为48MHZ,所以在不做分频的情况下,一个周期的counter个数是:48000000/4000=12000。对于Emios_Mcl_Ip_1的配置情况如下:

在这里插入图片描述

图 4

这里选择的emios channel 是EMIOS_CH_23,总线模式走的MCB_UP_COUNTER, ChTypeX类型。

1.1.3.2:Emios_Pwm_1配置

一个周期是12000 counter,那么50%占空比的counter就是一半,6000。对于Emios_Pwm_1的配置如下:

在这里插入图片描述

图 5

通道对应的是EMIOS0_CH4, 模式选择的是OPWMB,即Output Pulse Width Modulation Trigger模式,counter bus走的是counter Bus A。周期是12000 counter,占空比6000 counter,正好是50%。这里注意的是pwmEmiosBusRef选择的这个路径:
/Emios_Mcl_Ip_1/EmiosMcl/EmiosCommon_0/EMIOS_0_MasteBus0
就是前面的Emios_Mcl_lp_1配置的情况。

1.1.3.3:Siul1_Port_1配置

添加三个PortPin,主要需要输入正确的对应引脚的Mscr,具体port引脚的mscr可以在K344RM的附件表格IOMUX中查找到。这里三个引脚的配置情况如下:

在这里插入图片描述

图 6

在这里插入图片描述

图 7

在这里插入图片描述

图8
1.1.3.4: Trgmux_lp 配置
Trigmux的配置,主要是选择输入为EMIOS_CH4,输出为LCU0_INPUT0. 这样就可以把EMIOS和LCU进行连接:

在这里插入图片描述

图 9
1.1.3.5:Lcu_Ip 配置

LCU的几个关键配置如下:

在这里插入图片描述

图 10

在这里插入图片描述

图11

输出有两个,需要输出一对互补的PWM波形:

在这里插入图片描述

图 12

在这里插入图片描述

图 13

这里的output LUT control得出的理论是这样的:

在这里插入图片描述

图 14

实际上就是使用了一组的I0,然后输出到O0,O1,O0=I0, O1= I0取反。
所以最后得出O0的控制值是0XAAAA,O1的控制值是0X5555.

1.2 代码实现

需要添加对应模块的头文件,以及给相应外设给与配置:

#include "Clock_Ip.h"
#include "Emios_Pwm_Ip.h"
#include "Emios_Mcl_Ip.h"
#include "Siul2_Port_Ip.h"
#include "Trgmux_Ip.h"
#include "Lcu_Ip.h"
#define NUM_BLINK_LED     (uint32)10U
#define DELAY_TIMER       (uint32)5000000U
#define INSTANCE_0        (uint8)0U
#define CHANNEL_4         (uint8)4U
#define CHANNEL_23        (uint8)23U

Lcu_Ip_SyncOutputValueType PWM_OutputList[4] = {
		                                        {0, LCU_IP_OUTPUT_DISABLE},
								 {1, LCU_IP_OUTPUT_DISABLE},
								 {2, LCU_IP_OUTPUT_DISABLE},
								 {3, LCU_IP_OUTPUT_DISABLE}
                                                };
int main (void)
{
    uint8 num_blink = 0U;
    /* Initialize clock */

    Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);

    /* Initialize all pins using the Port driver */
    Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS_PortContainer_0_VS_0, g_pin_mux_InitConfigArr_PortContainer_0_VS_0);

    /* Initialize Emios_Mcl driver */
    Emios_Mcl_Ip_Init(INSTANCE_0, &Emios_Mcl_Ip_0_Config_VS_0);


    /* Initialize Emios_Pwm_Ip driver */
    Emios_Pwm_Ip_InitChannel(EMIOS_PWM_IP_VS_0_I0_CH4_CFG, &Emios_Pwm_Ip_VS_0_I0_Ch4);


    Trgmux_Ip_Init(&Trgmux_Ip_xTrgmuxInitPB);
    Lcu_Ip_Init(&Lcu_Ip_xLcuInitPB);
    PWM_OutputList[0].Value = LCU_IP_OUTPUT_ENABLE;
    PWM_OutputList[1].Value = LCU_IP_OUTPUT_ENABLE;
    Lcu_Ip_SetSyncOutputEnable(&PWM_OutputList[0U], 4);

    /* Set new period for the channels that used external counter bus */
    Emios_Mcl_Ip_SetCounterBusPeriod(INSTANCE_0, CHANNEL_23, 12000);
    
    /* Setup new duty cycle to the pin*/
    Emios_Pwm_Ip_SetDutyCycle(INSTANCE_0, CHANNEL_4, 6000);


    while(1)
    {

    }

}

2. 测试结果

分别测试如下3个引脚的波形,理想情况,PTB16波形为4Khz,50%占空比,PTD3和PTB16一样,PTD2和PTD3互补:
CH1: PTB16:emios_ch4
CH4: PTD3 : lcu_o0
CH3: PTD2: lcu_o1

在这里插入图片描述

图 15

可以看到,实际测试的波形,频率, 占空比,互补情况都是满足要求的,另外上一张图说明下TRIGMUX+LCU的硬件延时情况:

在这里插入图片描述

图 16

可以看到,实际的TRIGMUX输入,到LCU输出互补的PWM,之间的延迟只有60ns,是不是跟随性还是很漂亮的硬件IP功能?

  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值