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

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

  • [1. 工程模块搭建](#1. 工程模块搭建)
    • [1.1 工程配置](#1.1 工程配置)
      • [1.1.1 Pins](#1.1.1 Pins)
      • [1.1.2 clocks](#1.1.2 clocks)
      • [1.1.3 Peripherals](#1.1.3 Peripherals)
    • [1.2 代码实现](#1.2 代码实现)
  • [2. 测试结果](#2. 测试结果)

最近学习了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 代码实现

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

c 复制代码
#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功能?

相关推荐
国科安芯15 小时前
微小卫星红外相机双MCU冗余架构的抗辐照可靠性评估
人工智能·单片机·嵌入式硬件·数码相机·架构·自动化·安全性测试
电子阿板15 小时前
STM32G0B1 NRST复位和其它IO复用了,如何设置成专用复位引脚,
stm32·单片机·嵌入式硬件
兆龙电子单片机设计15 小时前
【STM32项目开源】STM32单片机智慧农业大棚控制系统
stm32·单片机·物联网·开源·毕业设计
不脱发的程序猿15 小时前
使用Python高效对比多个相似的CAN DBC数据
python·单片机·嵌入式硬件·嵌入式
bai54593615 小时前
STM32 CubeIDE 串口通信
stm32·单片机·嵌入式硬件
国科安芯15 小时前
强辐射环境无人机视频系统MCU可靠性分析
人工智能·单片机·嵌入式硬件·音视频·无人机·边缘计算·安全性测试
代码游侠16 小时前
应用——基于 51 单片机的多功能嵌入式系统
笔记·单片机·嵌入式硬件·学习·51单片机
广药门徒16 小时前
为什么访问一地址存16bits的存储芯片需要字节对齐?为什么访问外部Flash需要字节对齐?——深入理解STM32 FMC的地址映射机制
stm32·单片机·嵌入式硬件
国科安芯16 小时前
尺寸约束下商业卫星编码器系统的抗辐照MCU性能边界研究
运维·单片机·嵌入式硬件·安全·安全威胁分析
国科安芯17 小时前
无人驾驶物流车网关的多路CANFD冗余架构与通信可靠性分析
单片机·嵌入式硬件·性能优化·架构·自动驾驶·安全性测试