irpas技术客

S32K3 eMIOS使用介绍(PWM输出与输入捕获)——基于MCAL_Neo_HeFeiyang_s32k输入捕获

网络投稿 1403

本文基于 S32K3xx系列芯片、S32 Design Studio for S32 Platform开发平台以及EB tresos 28.0.0、 MCAL层,介绍pwm的输出及输入捕获。

1.Abbreviation

PWM Pulse Width Modulation FlexIO Flexible I/O eMIOS Enhanced Modular IO Subsystem PCMC Power Conversion and Motor Control LCU Logic Control Unit UC Unified channel

2.eMios简介

S32K3中有四个模块都能生成PWM,分别是eMIOS、FlexIO、PCMC、LCU。

2.1.简介:

K344有3个instance,每个instance24个通道,16位的timer,265分频的全局分频器和8分频的本地分频器,不同型号其配置及差异如下如所示。

由于每个instance的通道比较多(24),因此将其分成了4种type:X/Y/G/H。每个type具有的功能如下图所示。(X表示具有此项功能) 上图中带buffered的功能就是指在下一个周期生效。比如MC和MCB,MC是一个计数器,修改后立即生效,MCB也是计数器,但是在修改后的下一个周期生效。 各个通道对应的type如下图所示,注意type X和G具有自己的timer(下图中灰色部分)。 如何选择通道: 根据需求在Table237中寻找相应的type,根据type在table238中找相应的通道。

2.2.Counter bus

如下图所示,channel 0/8/16提供bus B/C/D,为8个一组的channel提供counter;channel 22提供Second global counter bus F,channel 23提供global counter bus A。 时钟源为system clock。

下图为channel、counter、type一览表图:

2.3.Feature Introduction

UC = Unified channel

2.4.Unified Channels(UC) 2.4.1.Overview

每个UC包含如下内容:

两个双数据缓冲器,An和Bn,能同时实现输入捕获和输出比较。两个比较器,A和B,其值同An和Bn中的值进行比较。一个内部的counter(CNTn[C])运行在除GPIO的所有模式。一个状态寄存器UC Status n(S0 - S23),标记输入捕获和匹配事件,指示标记溢出和溢出,并显示输入和输出引脚状态。一个控制寄存器,UC Control n(C0 - C23)

使用一个UC要操作如下内容:

选择UC的模式(GPIO/SAIC/IPWM/OPWFMB/OPWMT等)操作counter bus提供时基确定时钟的分频系数选择可以通过输入滤波器的最小输入脉冲宽度(以滤波器时钟周期为单位)选择检测的边沿(上升、下降、双边沿)四个输出禁用输入信号(Cn[ODISSL])中的哪一个用于禁用输出对于除GPIO之外的所有输出模式,是否禁用输出触发器(Cn[ODIS]) 2.4.2.UC block diagram

2.4.3.通道中断和DMA分配

注意:不是所有emios通道都有DMA,因此需要用DMA时,要注意通道选择。

2.4.4.模式

EMIOs有多种模式,如下图所示

其中与pwm输出相关的模式为:

2.4.4.1.OPWMB

Output PWM Buffered mode 普通pwm的输出常用OPWMB模式 前边沿和后边沿都可以自由设置。 A1用来设置前边沿,B1用来设置后边沿。当比较器达到A1的值时,引脚输出Edge Polarity的电平值;当比较器达到B1的值时,引脚输出与edge polarity相反的电平值。 在A1/B1的影子寄存器A2/B2中写值后,需要手动更新,若不调用更新API,则写入的新值不会生效,调用更新API后,当前周期立即生效。

2.4.4.2.OPWFMB

Output Pulse Width and Frequency Modulation Buffered mode 可将此模式理解为一种边沿对齐模式,周期占空比都可调。 由图可知,duty cycle是由A1寄存器决定的,当counter到达A1的值时,引脚的输出电平就改变为我们配置的edge polarity的极性(高或者低),A2位A1的影子寄存器,我们设置A2后将在下一个周期在A1中生效。 Period由B1决定。

2.4.4.3.OPWMCB

Center Aligned Output PWM with Dead Time Insertion Buffered mode

中心对齐的带死区插入的模式,需要用到两个counter。 要实现死区插入功能,还需要结合LCU模块才行。

2.4.4.4.OPWMT

Output PWM with Trigger mode

前边沿设置后就不能变了,后边沿可以自由设置,不受前边沿影响,可以跨越周期。Trigger可以在周期内任意位置产生。

2.4.4.5.SAIC

一个捕获上升沿或者下降沿的模式,既可以使用internal counter,也可以使用模块的counter,捕获的结果置于A2寄存器中。

2.4.4.6.IPWM

输入脉冲宽度测量,捕获到上升沿时,将counter保存在B2寄存器中,捕获到下降沿时,将counter的值保存在A2寄存器中,通过一个中断,就可以获得脉冲宽度。注意,若果计数器超出了自身周期,需要在计算结果上加上一个周期。 B1中保存的是上一轮B2中的counter值

2.4.4.7.IPM

通过只捕获上升沿或者只捕获下降沿的方式来测量周期。

2.4.4.8.MC

生成时基,没有buffer的功能,改变周期值,在当前周期生效

2.4.4.9.MCB

有buffer功能的时基,通常用来生产master buses,注意此模式的即时起点是从1开始的,MC模式是从0开始的。

3.Pwm输出 3.1.EB配置 3.1.1.模块依赖

3.1.2.PORT配置

在PortContainer中添加做为pwm输出的引脚,选择其对应的引脚号和引脚模式。

3.1.3.MCU配置

使能用到的外设模块,如EMIOS_2等。

Emios时钟为system clock,其实就是下图中的core clock,如下图所示。

3.1.4.Platform配置

使能channel对应的中断。

配置回调函数 回调函数在文件Emios_Mcl_Irq.c中,中断处理函数与通道对应关系如下: EMIOS0_5_IRQ - PWM_EMIOS_0_CH_0_ISR_USED - PWM_EMIOS_0_CH_1_ISR_USED - PWM_EMIOS_0_CH_2_ISR_USED - PWM_EMIOS_0_CH_3_ISR_USED EMIOS0_4_IRQ - PWM_EMIOS_0_CH_4_ISR_USED - PWM_EMIOS_0_CH_5_ISR_USED - PWM_EMIOS_0_CH_6_ISR_USED - PWM_EMIOS_0_CH_7_ISR_USED EMIOS0_3_IRQ - PWM_EMIOS_0_CH_8_ISR_USED - PWM_EMIOS_0_CH_9_ISR_USED - PWM_EMIOS_0_CH_10_ISR_USED - PWM_EMIOS_0_CH_11_ISR_USED EMIOS0_2_IRQ - PWM_EMIOS_0_CH_12_ISR_USED - PWM_EMIOS_0_CH_13_ISR_USED - PWM_EMIOS_0_CH_14_ISR_USED - PWM_EMIOS_0_CH_15_ISR_USED EMIOS0_1_IRQ - PWM_EMIOS_0_CH_16_ISR_USED - PWM_EMIOS_0_CH_17_ISR_USED - PWM_EMIOS_0_CH_18_ISR_USED - PWM_EMIOS_0_CH_19_ISR_USED EMIOS0_0_IRQ - PWM_EMIOS_0_CH_20_ISR_USED - PWM_EMIOS_0_CH_21_ISR_USED - PWM_EMIOS_0_CH_22_ISR_USED - PWM_EMIOS_0_CH_23_ISR_USED 对于emios1和emios2的instance同emios0. 所有的中断回调函数及其相应的通道对应关系在Emios_Mcl_Ip_Irq.h文件中,EMIOS2_4_IRQ不仅处理pwm通道的中断,还处理了emios的ocu、icu、gpt的中断相应,如下图所示:

3.1.5.Mcl配置

在general中使能emios

emiosCommon中配置:

1.选择instance 2.使能后,Debug模式下暂停counter 3.使能时基,用到counter功能就一定要使能 4.全局的预分频器。 Emios Master Buses中最多能配置5个bus,分别是channel0/8/16/22/23的counter,如下图所示:

某一个bus的配置如下:

1.选择产生counter的channel。 2.选择counter的计数方式,向上还是向下等。如果是带buffer的功能,比如OPWMB,就需要选择MCB的Master Bus Mode。 3.配置周期,此处的周期需与pwm中的周期一致 4.起始偏移 5.Bus的分频器 6.这是一个可选的分频器 7.允许debug模式 8.如果勾选PWM exclusive access,表示这个master bus只能由pwm模块使用,不能被其他模块使用(如ICU模块、OCU模块则不能使用)。

3.1.6.Pwm模块配置

Pwm模块抽象层次图:

3.1.6.1.PwmEmios硬件配置:

Instance选择

Channel配置

1.选择在前边沿还是后边沿置位flag 2.选择counter bus,选择在Mcl模块中master bus中配置的 3.Pwm的极性,作用见2.1.4.3.3节 4.选择flag置位后的相应操作,产生中断或者DMA请求,这儿选择INTERRUPT_REQUEST,前面Platform中配置的相关中断才有效,当然pwm输出并不需要中断,中断的主要作用还是在回调函数中进行一些操作,单纯产生pwm波,我们可以在这把中断disable掉。 5.占空比,一般填0,这样不会产生pwm及其中断,等需要使用在调用api,写入占空比 6.周期,要与逻辑通道及Mcl中的周期配置一致,仅在OPWFMB模式下有用。

3.1.6.2.PwmChannel逻辑通道配置

1.逻辑通道,自动生成的,在代码中用。 2.选择硬件配置作为参考 3.配置周期是否可变,打开可变,不打开则不可变 4.配置周期的单位为tick 5.周期,要跟硬件中的和Mcl中的配置一致。这儿相当于40000个tick,每个tick的时间为core clock分之一,相乘得到周期的具体时间。 6.默认占空比,一般填0,这样MCU的pwm初始化完成后既不生成pwm也不产生中断,等我们需要使用pwm的时候,调用设置占空比的api来使能。 7.极性,作用见2.1.4.3.3节 8.空闲时的电平状态。 9.每产生一个周期的pwm波,就会进一次这个回调函数。 10.参考时钟

3.2.S32DS配置 3.2.1.模块依赖

3.2.2.头文件

3.2.3.初始化

调用Pwm_SetDutyCycle();后就可以直接产生pwm了,准确的说是pwm初始化后就已经产生了,只是我们配置的占空比为0,在此调用api来产生我们想要的占空比。

3.2.4.API Pwm_SetDutyCycle(ChannelNumber, DutyCycle)

周期为32768,是一个定值,具体要输出百分之多少的占空比,用32768做分母来算。

Pwm_EnableNotification(PwmChannel_0, PWM_FALLING_EDGE); 使能回调函数,第一个阐述为逻辑通道,第二个参数选择在上升沿还是下降沿产生中断。

Pwm_SetOutputToIdle(ChannelNumber) 关闭pwm输出

Pwm_GetChannelState() 返回channel的duty cycle参数

Pwm_SetDutyCycle_NoUpdate()

Pwm_SetPeriodAndDuty_NoUpdate() 这两个调用后都没生效,需要调用

Pwm_SyncUpdate()后生效配置

Pwm一旦初始化完成后就跑起来了,没有start或者begin这样Api。一般将Pwm的占空比设置为0或者1,中断会自动关闭,因此建议配置,后期通过调用Pwm_SetDutyCylce()或者Pwm_SetPeriodAndDuty()来恢复或者停止pwm

3.3.注意事项

Pwm的输出可以用中断的方式(如果你需要在每个边沿处进行一些操作),当然也可以不用中断的方式。当我们从用中断方式转为不用中断的模式时,除了去Platform里面把相关的中断和中断回调关掉,还要记得关下面这个,否则EB能过,代码编译却报错

4.输入捕获 4.1.EB配置 4.1.1.模块依赖

4.1.2.Port配置

4.1.3.Mcu配置使能外设:

对应eMIOS instance

如果要使用DMA功能,则需要打开相应的外设时钟,既要打开总开关,也要打开通道的开关。

4.1.4.Platform配置

emios中的icu的中断与其通道的对应关系如下表,来源于Mcal_Plugins/Mcl_TS_T40D34M1010R0/Include中的Emios_Mcl_Irq.h中 EMIOS0_5_IRQ - ICU_EMIOS_0_CH_0_ISR_USED - ICU_EMIOS_0_CH_1_ISR_USED - ICU_EMIOS_0_CH_2_ISR_USED - ICU_EMIOS_0_CH_3_ISR_USED EMIOS0_4_IRQ - ICU_EMIOS_0_CH_4_ISR_USED - ICU_EMIOS_0_CH_5_ISR_USED - ICU_EMIOS_0_CH_6_ISR_USED - ICU_EMIOS_0_CH_7_ISR_USED EMIOS0_3_IRQ - ICU_EMIOS_0_CH_8_ISR_USED - ICU_EMIOS_0_CH_9_ISR_USED - ICU_EMIOS_0_CH_10_ISR_USED - ICU_EMIOS_0_CH_11_ISR_USED EMIOS0_2_IRQ - ICU_EMIOS_0_CH_12_ISR_USED - ICU_EMIOS_0_CH_13_ISR_USED - ICU_EMIOS_0_CH_14_ISR_USED - ICU_EMIOS_0_CH_15_ISR_USED EMIOS0_1_IRQ - ICU_EMIOS_0_CH_16_ISR_USED - ICU_EMIOS_0_CH_17_ISR_USED - ICU_EMIOS_0_CH_18_ISR_USED - ICU_EMIOS_0_CH_19_ISR_USED EMIOS0_0_IRQ - ICU_EMIOS_0_CH_20_ISR_USED - ICU_EMIOS_0_CH_21_ISR_USED - ICU_EMIOS_0_CH_22_ISR_USED - ICU_EMIOS_0_CH_23_ISR_USED 对于emios1和emios2的instance同emios0. EMIOS0_0_IRQ不仅处理ICU通道的中断,还处理了emios的OCU、PWM、GPT的中断相应,如下图所示:

根据上表,对中断进行相关配置: 使能相应的中断

配置中断处理函数

若要使用DMA功能,则需使能相应的DMA中断,配置中断回调函数。 中断使能:

中断回调函数: 此函数位于Mcal_Plugin/Mcl_TS_TXXXXXX/src/Dma_Ip_Irq.c中

4.1.5.Mcl配置

打开时基,配置相应的分频:

Master Buses配置:

1.能作为Mater bus的通道只有0/8/16/22/23,详见2.1.2节 2.不同的IcuSubModeforMeasurment有不同的Master bus要求,根据实际情况选择。绝大部分模式要求使用MCB_UP_COUNTER. 3.作为mater bus来使用时的default period必须填65535. 4.使能后,Debug模式下回暂停counter 5.使能后这个counter仅供pwm使用

对于signal measure模式,若使用DMA来获取数据,需要在这儿配置DMA的通道,但是不是所有emios通道都支持DMA,详见2.4.3节 使能DMA

配置DMA instance

配置DMA channel

2处先不填,等配置完了点生产代码,会报错,报错里面会告诉你怎么填。

Global配置:

Transfer配置:

4.1.6.Icu配置 4.1.6.1.硬件通道配置

4.1.6.2.IcueMios channel配置 填写对应的instance

配置channel

1.选择bus,可以选择internal counter,也可以选择在Mcl的master buses中配置的bus。Internal counter只有type X/G有,详见2.1.2节,type X/Y必须要使用master buses,若使用master buses,则需要在2处选择相应的参考。 2.根据需求,选择Mcl中配置的bus 3.测量模式,有SAIC,IPW,IPWM,不同见文档或EB中的解释。 使用signalMeasur这个模式时是否使用中断,对于signalMeasure这个模式,目前要么使 4.用中断的方式,即不勾选这个选框,要么使用DMA的模式,在逻辑通道中使能DMA,并在MCL模块中配置DMA的相关设置。

4.1.6.3.逻辑通道配置

注意: 当我们的测量模式选择edge counter时,对于ICU模块是通过MCB模式实现的,因此只有Type X和Type G这两类通道支持。(来自NXP AE) 对于signal measure模式,若我们使用DMA来获取测量数据,需勾选第三个选项,使能DMA,并在MCL中进行DMA的通道配置。

对于信号测量模式,注意下面的选项,emios通道中选择SAIC模式,对应逻辑通道中必须要选择ICU_DUTY_CYCLE的测量模式才行,图中2所示。

1中的边沿选择会影响测得的占空比的值,正常情况下选择rising_edge,结果就是我们要的占空比(高电平时间),如果选falling_edge,结果则正好相反,是低电平的时间,若果选both_edge,结果与rising_edge的结果一致。

4.2.S32DS配置 4.2.1.模块依赖

4.2.2.头文件

4.2.3.初始化

各个模块的初始化

信号测量不支持回调函数,获取结果要等测量完成后再去获取,只能轮询,但是轮询频率不能过高,否则出错

4.2.3.1.边沿计数模式

使能边沿计数(对于配置为edge count的通道)

调用相应的api获得边沿计数的个数:

4.2.3.2.占空比、周期测量模式

在EB中配置为SIGNAL_MEASUREMENT模式后,代码中需要调用如下api开始测量

不管是使用DMA的模式还是中断的模式,都需要在代码的应用层用轮询的方式来获取,因为SIGNAL_MEASUREMENT模式没有提供回调函数,这个后期EB配置工具应该会优化。

Icu_DutyCycleType icuDutyResult;

icuDutyResult.ActiveTime = 0; icuDutyResult.PeriodTime = 0;

typedef struct { Icu_ValueType ActiveTime; /< @brief Low or High time value. */ Icu_ValueType PeriodTime; /< @brief Period time value. */ } Icu_DutyCycleType;

5.总结

这里面小细节很多,稍不注意就会出错,一定要一步一步的来。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #s32k输入捕获 #本文基于 #S32K3xx系列芯片S32 #design #Studio #for #S32