【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.1.3.1 Emios_Mcl_lp_1配置](#1.1.3.1 Emios_Mcl_lp_1配置)
- 1.1.3.2:Emios_Pwm_1配置
- 1.1.3.3:Siul1_Port_1配置
- [1.1.3.4: Trgmux_lp 配置](#1.1.3.4: Trgmux_lp 配置)
- [1.1.3.5:Lcu_Ip 配置](#1.1.3.5:Lcu_Ip 配置)
- [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功能?