S32K3学习笔记—S32K3之PWM模块
1.前言
Pulse Width Modulation,脉冲宽度调制。PWM有非常广泛的应用,如直流电机的调速,开关电源、逆变器等。传统的PWM如果使用的通道过多,可能造成负载率过高,而S32K3的eMIOS模块有一个很大的改变,利用global counter buses 和 local counter buses 既能实现不同通道的PWM同步又能合理分配计数器资源。
2.原理
首先得说一下eMIOS(Enhanced Modular IO Subsystem ),增强型模块化IO子系统,相比于传统的PWM有很大的不一样。功能更强大,可以简单的理解一下。
eMIOS提供独立的通道UCs --Unified channels,用户可以配置这些通道来为不同芯片应用程序中的不同功能生成或测量时间事件。eMIOS将这些频道分布在许多 global counter buses 和 local counter buses (只有TypeX型UCs可以生成Counter Bus)。每个local counter bus专用于一组八个相邻的通道。每个global counter bus作用于所有通道。每个counter bus 都可以生成自己的时基,每个counter bus 总线都有其专用通道提供的时基。
每个UC包含以下内容:
那么什么是counter bus?
个人理解为就是一个计数器。并且这个计数器可以作为其他通道的内部计数器且支持多个通道共用一个计数器,当然如果多个通道共用一个counter bus,就可以实现多个通道的PWM同步,如果合理的分配 global counter buses 和 local counter buses 可以降低MCU负载率,提高整体的性能。
UCs具体分布如下图:
可以看出eMIOS时钟是由CORE_CLK提供。包括两个global counter buses :BUS_A(UC23 – Unified channels 23)和BUS_F(UC22 ),五个local counter buses :BUS_B(UC0)、BUS_C(UC8)、BUS_D(UC16)。
每个eMIOS通道有24个UCs。这些通道都是相互独立的但又是互相配合。因其在结构上有所差别,又分成了4种通道类型TypeX、TypeY、TypeG、TypeH。以下是每个通道的类型:
经过上面的理解,下图是一个总结:此图可以很详细的知道每个通道的类型、所能提供的counter bus及其适用的范围
这4种通道类型所支持的工作模式不同,以下X表示了该类型所支持的工作模式:
具体每种模式的区别参考芯片手册,很详细
3.EB配置
PWM模块依赖于Port、Mcu、Mcl、Pwm
3.1 Port模块
Port主要是配置IO模式,具体Port配置可参考之前文章 S32K3学习笔记—S32K3之Gpt、Dio、Platform
1.选择eMIOS_OUT模式
3.2 MCU模块
MCU主要是配置参考时钟,MCU详细配置请参考S32K3学习笔记—S32K3之MCU模块
1.此处选择的系统时钟160M,此参数用于最后的Master Bus频率
1.使能eMIOS模块时钟,此处勿忘
3.3 MCL模块
1.支持多核使能
2.需要用到eMIOS必须使能
1.使能支持调试状态
2.使能全局时基
3.时钟分频,此参数用于最后的Master Bus频率
4.资源映射到给哪个核
1.根据需求注册counter bus, 此处将eMIOS通道0的所有counter bus全部分配
1.选择eMIOS通道
2.此处选择向上计数模式 MCB_UP_COUNTER,可以根据需求选择方式
3.当 2 选择 MCB_XX模式时,计数器从1开始计数到周期值。此参数用于最后的Counter Bus频率
4.此偏移仅在通道启动时适用
5.Counter Bus分频系数,此参数用于最后的Counter Bus频率
6.是否支持DEBUG模式
7.使能该Master Bus只用于PWM
注: Master Bus频率 == CoreClock / ClockDividerValue / DefaultPeriod / MasterBusPrescaler 。
3.4 PWM模块
1.建立eMIOS通道
1.eMIOS通道号
2.PWM的模式,此处选择EMIOS_PWM_IP_MODE_OPWMB
3.生成标志的时间,此处选择Trailing_Edge
4.选择 global counter buses 或者 local counter buses
5.是否需要冻结通道寄存器值,方便调试
6.内部分频器系数,必须选择内部计数器才能使此设置生效。仅在OPWFMB和OPWMCB模式下有效。
7.选择用于此eMIOS通道的内部预分频器的时钟源。仅在OPWFMB和OPWMCB模式下有效。
8.PWM生成时对应的处理事件,此处选择EMIOS_PWM_IP_NOTIFICATION_DISABLED,也可以触发中断或者DMA
9.PWM输出的相移(以刻度为单位)。默认不偏移。相移参数只能在OPWMB或OPWMT模式下使用
10.配置此eMIOS通道的输入计数源延迟(刻度为单位)以生成触发事件。默认不延迟。此参数仅用于OPWMT模式
11.PWM输出转换期间的死区时间 。 此参数仅用于OPWMCB模式
1.选择具体的counter buses
1.PWM的硬件通道,选择之前配置的PwmEmios通道
2.PWM的通道类型,此处选择PWM_FIXED_PERIOD
3.选中此选项可配置以刻度为单位的默认周期单位,或取消选中此选项以配置以秒为单位的“默认周期”单位。
4.初始化时Pwm通道的默认周期值,单位根据 3 中的配置。此处的频率必须和MCL中的counter buses频率一致
5.初始化时Pwm通道占空比的默认值,
6.在初始化时定义Pwm通道的极性
7.当输出设置为空闲时,定义Pwm通道状态
8.用户回调通知功能,只有选中PwmGeneral/PwmNotificationSupported时,此选项才会激活
9.选择时钟源
1.将PWM映射到核0
至此,用eMIOS产生PWM的配置就完成。掌握原理配置还是比较简单。重点理解eMIOS和PWM的关系。当然S32K3 PWM也是支持传统的形式,用PWM内部的定时器去生成PWM波形。可以根据demo去配置和学习并实现,此处就不做记录。
4.代码调试
可以通过Mcl_Emios_SetCounterBusPeriod修改counter bus的频率,但共用此counter bus的通道的频率都会改变。通过Pwm_SetDutyCycle改变输出的PWM的占空比来实现我们的需要的频率和占空比。可以合理分配资源,实现调频调速
int main_c0(void)
{
uint8 num_blink = 0U;
/* Initialize the Mcu driver */
Mcu_Init(&Mcu_Config_VS_0);
/* Initialize the clock tree */
Mcu_InitClock(McuClockSettingConfig_0);
/* Apply a mode configuration */
Mcu_SetMode(McuModeSettingConf_0);
/* Initialize all pins using the Port driver */
Port_Init(&Port_Config_VS_0);
/* Initialize Mcl driver */
Mcl_Init(&Mcl_Config_VS_0);
/* Initialize Pwm driver , after that Led on*/
Pwm_Init(&Pwm_Config_VS_0);
/* Set new period for all channels used external counter bus */
Mcl_Emios_SetCounterBusPeriod(MCL_EMIOS_0_CH_22, 0x9000U, FALSE);
/* Setup new duty cycle to the pin*/
Pwm_SetDutyCycle(PwmChannel_0, 0x4000);
/* change duty cycle to the pin */
while(1)
{
Pwm_SetDutyCycle(PwmChannel_0, num_blink);
num_blink += 1000;
if(num_blink >= 65535)
{
num_blink= 0;
}
}
return 0U;
}
5.展望
对于UC modes,因其模式很多种,手册又比较详细,就没有自己整理一下,后续有时间整理一下这些模式,再加上。