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

本文基于 S32K3xx系列芯片、S32 Design Studio for S32 Platform开发平台以及EB tresos 28.0.0、 MCAL层,介绍pwm输出输入捕获
对本文的补充介绍请参考:S32k3 eMios输入捕获(SAIC模式)测量信号周期、频率、占空比

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.总结

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

在这里插入图片描述

  • 6
    点赞
  • 36
    收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

Neo_HeFeiyang

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值