【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功能?

相关推荐
智者知已应修善业1 小时前
【51单片机用数码管显示流水灯的种类是按钮控制数码管加一和流水灯】2022-6-14
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
智商偏低7 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen9 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
森焱森11 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白11 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D11 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术14 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt15 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘15 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang15 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c