AUTOSAR MCAL for SemiDrive E3 功能模块使用介绍:PWM&ICU

一、    概述

本文主要介绍如何使用芯驰提供的 AUTOSAR MCAL 软件包,开发 SemiDrive E3 的 PWM&ICU 模块,产生 PWM 波和测量输入脉冲的参数。

硬件使用 E3640 GATEWAY 开发板,软件包为 Semidrive_AutoSAR_MCAL_package_v2.0。 

二、    模块简介

1、 每个 EPWM 模块,有 2 个计数器 cnt_g0/g1 和 4 个比较器 dti_a/b/c/d,每个比较器有 2 个输出 cmp_[x]0/1。

2、 EPWM 产生的 PWM 波,可以通过 xTRG 模块从 IO 口输出,或者输入 ETIMER 模块。 

3、 ETIMER 模块支持捕获和比较功能,可以设置测量模式,抓取占空比,计数脉冲等。 

三、    示例说明

1、 实现一个 PWM 输出到 GPIO 口。 

2、 实现一个内部 PWM 输出,经过 xTRG 用 ETIMER 内部 ICU 采集。 

3、 实现一个 PWM 输出到 GPIO 口,让 ETIMER 通过另外的 GPIO 口采集。 

四、    示例一 PWM 输出

1、 使用 EB 软件打开 Semidrive_AutoSAR_MCAL_package_v2.0 软件包。 

2、 在 MCU 模块中打开需要使用的 EPWM1 模块和 XTRG 模块,使能时钟。

3、 在 PWM 模块中的 PwmController 栏,添加 PwmController0。

PwmHwModule: 选择使用的 EPWM1 模块;

PwmPeriodDefault: 配置计数器 G0/G1 的计数周期,单位 ns,影响产生的 PWM 波周期。下图中配置 EPWM1 的 G0 计数周期为 2ms,G1 计数周期为 1ms。

 

4、 在 PwmCmpChannel 栏中,配置 PWM 参数。 


PwmCmpChannelId: 比较器的选择,0 对应 a 比较器,1 对应 b 比较器,以此类推;

PwmSubCmpChannel_1_EN: 使能比较器 1 的输出,如比较器 a1,b1 等;

CnSel:计数器的选择,影响 PWM 的周期;

PwmSubCmpChannel_[x]:每个比较器的两个输出,如 PwmSubCmpChannel_0 为比较器 a0,b0 等,PwmCmpChannel_1 为比较器 a1,b1 等;

DutycycleDefault:设置脉宽比,32768(0x8000) 为最大值,如 19660(0x4CCC) 即占空比为 60% 或 40% (由 Polarity 和 IdleState 的极性配置决定)。

 

5、 在 PwmChannel 中选择配置的 EPWM 输出。 PwmUsedChannel 选择对应的配置。

根据前面的配置,PwmController_0 为 EPWM1,PwmCmpChannel_0 为比较器 cmp_a[x],PwmSubCmpChannel0 为比较器 cmp_a0。

 

6、 本示例使用 GPIO_M0 作为 PWM1 的输出,在 Port 模块中,配置对应的 GPIO 口为 xTRG 的复用功能。 

7、 在 xTRG 模块的 IOOutConfig 栏,添加 IOOutConfig_0,输入设为 EPWM1_CMP0,即 EPWM1 的 a0 输出,将其输出至 IO_o_6 引脚,即 GPIO_M0。

8、 完成配置后,检查错误并生成代码。在 output\src\*_Cfg.c 文件中,可以观察到参数配置的对应代码。如下 Port_Cfg.c 文件中,设置的 GPIO_M0 的复用功能 xTRG.IO6 及其余参数。

9、 使用 IAR 打开 MCAL_release\iar\iar_v850\E3_ref_gateway\E3_ref_gateway.eww 项目,编译并运行 test_suite\example\pwm_example\pwm_test.c 的示例程序。 

将示波器连接到 GPIO_M0 引脚,在串口软件中先输入 runcase 701 ,再输入 runcase 701。

runcase 701:执行的 TC_PWM_SP0_CORE() 函数,初始化 PWM。

runcase 700:执行的 TC_PWM_SF_CORE() 函数,使能 PWM 波输出。

 

观察示波器上显示的 PWM 波形,周期为 2ms,占空比为 60%。

 

五、    示例二 ICU 采集

1、 在 Mcu 模块中,打开需要使用的 ETIME1 模块。

  

2、 在 ICU 模块中添加 IcuChannel。

3、 IcuChannel 参数配置。

IcuMultiCapture: FALSE,不使用多通道采样;

IcuDefaultStartEdge: 设置边沿检测方式;

IcuMeasuremenMode: ICU_MODE_SIGNAL_MEASUREMENT,单次采样;

IcuHardwareModule: 选择需要使用的 ETIMER 模块,如此示例使用的 ETIMER1;

IcuHardwareChannel: 选择 ICU_HW_CPT_A;

IcuSignalMeasurementProperty:选择 ICU_DUTY_CYCLE,设置测量属性,示例选择的为占空比。

 

4、 在 xTRG 模块中,修改 SmuxConfig_3 的输入选择为 EPWM1_CMP0,输出选择 ETIMER1_CPT_A0,则 EPWM1 的 A0 输出会输入到 ETIMER1 的 A0 中。

 

5、 修改 icu_example.c 的示例程序内各函数的参数。

sdrv_xtrg_smux_config()为绑定配置;

Icu_StartSignalMeasurement()为开始单次采样;

Icu_GetDutyCycleValues()为获取占空比数据;

While 循环打印采样的 PWM 数据,输出高电平时间和周期。

 

6、 使用串口软件,先发送 PWM 产生的命令 runcase 701 和runcase 700。

然后发送使用 ICU 检测的命令 runcase 1601 和 runcase 1600。

runcase 1601,执行 icu_test_multi_cpt_signal_measurement () 函数,初始化 ICU 模块 。

runcase 1600,执行 icu_test_signal_measurement () 函数,使能 ICU检测。

串口会打印出检测到的 PWM 波数据。

如图打印的参数,占空比为 299988/499996≈60%。

 

六、    示例三 GPIO 输出,GPIO 输入

1、 PWM 输出使用之前定义的 GPIO_M0(xTRG.IO6),输入的 GPIO 使用 GPIO_M6。

在 Port 模块中,将 GPIO_M6 配置为 xTRG_IO12。

  

2、 在 xTRG 模块中,将 SmuxConfig_3 的输入改为 IO_i_12。

在开发板上使用杜邦线将 GPIO_M0 和 GPIO_M6 短接。

 

3、 发送 PWM 产生的命令 runcase 701 和runcase 700。然后发送使用 ICU 检测的命令 runcase 1601 和 runcase 1600,则会打印出 PWM 波的占空比和周期。

 

七、    参考文档

  • 《E3400_E3600_MCU_Technical_Reference_Manual》
  • 《E3400_E3600_MCU_Datasheet》
  • 《Semidrive_Icu_for_E3_User_Manual》
  • 《Semidrive_Pwm_User_Manual》
欢迎在博文下方留言评论,我们会及时回复您的问题。如有更多需求,欢迎联系大联大世平集团 ATU 部门:atu.sh@wpi-group.com

作者:Eason Wang / 王寅森

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论