【MCAL】TC397+EB-tresos之PWM配置实战 - (占空比可调方波)

PWM首先在汽车传感器中有着广泛的应用,特别是在位置和速度传感器等方面,通过改变脉冲的宽度,输出能够反映位置与速度信息的模拟信号给对应的ECU。其次,PWM在电控单元上也有着广泛的应用。在MCU中,PWM可以用于控制驱动电机的速度和转矩,在BMS中则可以实现控制充放电电流,在其他的ECU中也可以实现更加精确的负载控制(诸如灯光亮度等)。

本篇文章首先从理论讲起,基于《MC-ISAR_TC3xx_UM_Pwm_17_GtmCcu6.pdf》介绍了Pwm_17_GtmCcu6这个PWM驱动模块的理论知识,然后介绍了在TC397平台使用EB-tresos对Pwm_17_GtmCcu6这一个驱动模块进行配置与调试的整个实战过程,帮助第一次接触这个模块的读者能够更快的上手来实现符合自己项目要求的开发工作,完成PWM的输出控制。文章分别介绍了使用基于GTM和CCU6两种硬件核心来实现PWM输出的过程,帮助读者更全面的了解PWM在英飞凌芯片上的实现。

目录

概述

依赖模块 

Port

SCU

GTM

CCU6

环境与目标 

EB tresos配置

Port

MCU 

McuClockSettingConfig

McuHardwareResourceAllocationConf

GtmAtomChannelConf 

PWM

General

PwmChannel

PWM驱动调试

测试代码

测试结果 


概述

脉冲宽度调制(PWM)驱动器负责提供与AUTOSAR指定的PWM信号生成相关的标准服务。PWM通道的底层定时器引擎是GTM(TOM或ATOM切片)或CCU6(T12或T13切片)定时器通道。PWM驱动器提供选项,以配置AUTOSAR规范中描述的驱动程序参数以及配置定时器引擎的额外参数。相关的GTM或CCU6定时器切片的配置在MCU驱动模块中有所描述。模块软硬件接口如下图所示。


依赖模块 

Port

输出信号通过port pads路由到GTM和CCU6。Port Pads通过PORT驱动程序配置和启用。Port Pads由PORT驱动程序配置。


SCU

PWM驱动程序依赖于SCU IP的时钟功能。驱动程序需要f_SPB、f_GTM和f_CCU6时钟信号才能正常工作。SCU IP为所有外设和单片机驱动提供时钟,并负责时钟树的配置。为了避免同时写入引起的冲突,需使用MCALLIB的APIs对所有受ENDINIT保护的寄存器进行更新。


GTM

PWM驱动器使用GTM的TOM/ATOM子模块,为配置的占空比和周期生成输出信号。PWM驱动程序使用TOM/ATOM子模块进行周期、占空比和极性更新。PWM驱动程序使用的关键GTM特性有:

  • 同步和异步更新占空比和信号周期。
  • 如果需要同步启动,则使用主机触发功能。
  • 信号控制机制:全局启用/禁用机制,输出启用机制。
  • 触发机制:主机MCU,内部触发信号(来自当前信道)。
  • 连续计数模式。
  • ATOM工作模式:信号输出模式PWM(SOMP)。
  • ATOM MCU控制更新。

GTM的TOM/ATOM通道可以由PWM、GPT、ADC、OCU、DSADC或WDG驱动器使用,当通道用作PWM使用时,应仅用于产生PWM信号。
MCU驱动程序初始化GTM时钟、配置定时器到端口引脚连接,并提供APIs以编程GTM SFRs。PWM驱动程序使用这些APIs写入GTM SFRS,此外,PWM驱动程序会运行时更新特定通道的SFRs,因此不允许其他驱动程序或用户软件访问特定通道的SFRs。MCU驱动程序负责将GTM的中断路由到PWM驱动程序。

PWM驱动程序使用来自GTM IP的TOM/ATOM子模块的以下硬件事件:

  • 计时器通道生成的周期匹配事件
  • 计时器通道生成的比较匹配事件

CCU6

CCU6(Capture Compare Unit 6),CCU6是一种高分辨率的16位捕获和比较单元,具有特定应用式,特别适合无刷直流电机控制的换相控制,能降低CPU负载。特殊的操作模式支持使用霍尔传感器或反电动势检测控制无刷直流电机。它还支持同时启动多个定时器的输入,这是具有多个CCU6内核的设备的一个重要功能。CCU6模块由两个相同的内核CCU60和CCU61组成。

CCU6由一个具有三个捕获/比较通道的定时器T12和一个具有一个比较通道的定时器T13组成。T12通道可以独立生成PWM信号或接受捕获触发,或者它们可以共同生成控制信号来驱动电机或逆变器。

T12的功能包括:

  • 三个捕获/比较通道,每个通道可以用作捕获或比较通道。
  • 支持产生三相PWM(六个输出,高侧和低侧开关具有单独信号)。
  • 16位分辨率,最大计数频率取决于SPB频率。
  • 每个通道独立的死区时间控制,避免功率级短路。
  • 并发更新T12寄存器。
  • 可以生成中心对齐和边缘对齐的PWM。
  • 支持单发模式。
  • Start可以由外部事件控制。
  • 计数外部事件的能力。

T13的功能包括:

  • 一个独立的有输出的比较通道。
  • 16位分辨率,最大计数频率取决于SPB频率。
  • 并发更新T13寄存器。
  • 可以同步到T12。
  • 在周期匹配和比较匹配时产生中断。
  • 支持单发模式。
  • Start可以由外部事件控制。
  • 计数外部事件的能力。

定时器T12可以操作在捕获和/或比较模式为它的三个通道。这些模式也可以组合(例如,一个通道以比较模式操作,而另一个通道以捕获模式操作)。定时器T13只能在比较模式下工作。多通道控制单元产生可由T12和/或T13调制的输出模式。调制源可以选择和组合用于信号调制。

定时器T12模块是产生三相PWM信号的主要单元。一个16位计数器通过比较器连接到3个通道寄存器,当计数器内容匹配其中一个通道寄存器内容时产生信号。多种控制功能便于T12结构适应不同的应用需求。
除了3相PWM产生,T12模块还提供了单独比较和捕获功能的选项,以及死区时间控制和类滞后比较模式。

下图显示了定时器T12的详细框图。定时器T12的功能由寄存器TCTR0、TCTR2和PISEL0中的位控制。
定时器T12通过可编程预分频器和可选的1/256分频器从模块时钟fcc6接收输入时钟(fT12),或者从输入信号T12HR接收。这些选项通过位域T12_CLK和T12_PRE来控制。T12可以根据选定的操作模式向上或向下计数。方向标志CDIR指示当前的计数方向。 

计数器的计数模式一共有两种:边缘对齐模式,中心对齐模式。模式都支持单发或者循环。

下面我们介绍以下边缘对齐模式。在边缘对齐模式下(CTM= 0),定时器T12总是向上计数(CDIR = 0),当达到周期寄存器给出的值(周期匹配T12_PM)时,T12的值被下一个计数步骤(锯齿形)清除。

在边沿对齐模式下,定时器周期为:T12周期 = <Period-Value> + 1

在中心对齐方式中(CTM = 1), 定时器T12向上或向下(三角形), 当达到周期寄存器(T12_PM)时所给出的值时(若CDIR = 0),计数方向控制位CDIR将被更改为向下(CDIR = 1)并继续下一个计数步骤。当向下计数达到0001H (T12_OM)时,计数方向控制位CDIR向上改变,进行下一个计数步骤。在中心对齐模式下,定时器周期为:T12周期= (<Period-Value> + 1) x 2。

在单发模式中,硬件回清除定时器运行位T12R。如果位T12_SSC=1,则当前定时器周期结束时,定时器T12将停止。
在边缘对齐模式下,当计时器在达到周期值后变为零时,T12R将被清除(见下图)。 

在中心对齐模式中,当计时器计数到零时,周期结束。

在比较模式(参见下图)中,三个独立的比较通道CC60、CC61和 CC62 可以生成三相PWM模式。 

每个比较通道通过各自的等于比较器连接到T12计数器寄存器,当计数器的内容与关联的比较寄存器的内容匹配时,生成匹配信号。每个通道由比较器和双寄存器结构组成-实际的比较存器CC6xR,用于比较器,以及关联的阴影寄存器CC6xSR,该寄存器由软件预加载,并在信号T12阴影传输T12 ST激活时传输到比较寄存器。为比较值以及与其他与PWM信号生成相关的值提供阴影寄存器,便于软件同时更新三相PWM的所有相关参数。

下图给出了从通道状态位到其输出引脚的最简单信号路径的概述。如图所示,用户可以根据状态位CC6xST的当前状态确定所需的输出信号切换行为。 

T12的三个信道中的每个信道还可用于响应外部信号CC6xIN捕获T12时间信息。
在捕获模式下,当在输入CC6xIN检测到上升沿时检测到中断事件CC6x_R,而当检测到下降沿时检测到中断事件CC6xF。捕获操作有多种不同的模式。在所有模式下,都会使用通道的两个寄存器。通过T12MSEL.MSEL6x位字段选择捕获模式,并且可以为每个通道单独选择。 

最后,还需要考虑到死区延时的问题(为了避免上下桥臂的IGBT同时导通导致短路,引入了死区时间,确保两者不会瞬间同时开启,否则就会出现短路的情况),下边是CCU6在上下桥臂引入死区延时控制的输出控制示意图。


环境与目标 

本文使用的为英飞凌提供的开发板KIT_A2G_TC397XA_TFT,使用X103上排针的P02.3和P02.4作为PWM输出。

涉及的软件如下:

涉及的参考资料如下:

序号参考资料内容
1《Infineon-AURIX_TC39x-UserManual-v02_00-EN》英飞凌TC39x用户手册
2《ApplicationKitManual-TC3X7-ADAS-V21.pdf》开发板KIT_A2G_TC397XA_TFT说明
3《MC-ISAR_TC3xx_UM_Pwm_17_GtmCcu6.pdf》英飞凌提供的TC3xx芯片PWM用户手册
4《Infineon-TC39x-DataSheet-v01_02-EN.pdf》英飞凌提供的TC39x芯片DataSheet

配置目标如下: 

  1. P02.3使用GTM输出占空比为50%的P波。
  2. P02.4使用CCU6输出占空比为25%的P波。

EB tresos配置

Port

根据TC39x芯片DataSheet,配置选择对应的复用功能为GTM输出。

下图为对应Port口的配置。

根据TC39x芯片DataSheet,配置选择对应的复用功能为T12 PWM Channel输出。 

下图为对应Port口配置。


MCU 

McuClockSettingConfig

配置GTM与CCU6的时钟来源,CCU6的时钟来源为Fspb总线时钟。

下图为对应的时钟配置截图, CCU6为100Mhz,GTM为200Mhz。

后续关于GTM的时钟配置可以参考《【MCAL】TC397+EB-tresos之GPT配置实战 - 定时器》 ​​​​​​,最终配置CMU的全局频率等于fCLS0(100Mhz)。


McuHardwareResourceAllocationConf

选择AtomChannel3用作PWM驱动使用。

然后选择CCU6的第一个Kernel CCU60用作PWM。


GtmAtomChannelConf 

此处选择使用Atom的PWM所关联的PortPin,CCU6配置为PWM的时候无需配置所关联PortPin。


PWM

General

配置截图如下。

下面我们对其中常用的配置项做一下解释:

  • PwmDeInitApi:去初始化API是否可用。
  • PwmGetOutputState:读取输入通道对应PWM输出的电平信号状态。

  • PwmSetDutyCycle:改变占空比API是否可用。
  • PwmSetOutputToIdle:将PWM设置为IDLE状态的API是否可用。
  • PwmSetPeriodAndDuty:更改周期与占空比的API是否可用。
  • PwmDutycycleUpdatedEndperiod:全局开关,使能在当前周期结束时更新占空比参数。
    • TRUE:更新占空比在当前生成的波形周期结束时完成(当前波形完成)。
    • FALSE:立即更新占空比(就在服务调用之后,当前波形更新为新的占空比值)。
  • PwmNotificationSupported:是否支持回调函数。
  • PwmPeriodUpdatedEndperiod:启用在当前周期结束时更新周期的全局开关。
    • TRUE:更新周期在当前生成的波形周期结束时完成(当前波形完成)。
    • FALSE:立即更新周期(就在服务调用之后,当前波形更新为新的周期)。
  • PwmHandleShiftByOffset:当PwmHandleShiftByOffset被启用时,移位的通道以偏移量开始,并将类似于固定周期通道。当不选择PwmHandleShiftByOffset时,从引用的固定周期通道触发移位通道。备注:此参数仅适用于GTM通道。
  • PwmDutyShiftInTicks:配置占空比的时候,传入的参数是千分比还是Tick数。
    • OFF:0为0占空比,0X8000为100%占空比。
    • ON:有效时的Tick数。
  • PwmEnable0Or100DutyNotification:通知函数的是否启用,如果设置为ON,则固定周期和可变周期通道支持0%和100%的通知。如果设置为OFF,则固定周期和可变周期通道的0%和100%不支持通知。注意:默认值设置为FALSE以最小化可执行代码大小。
  • PwmChannelCoherentSelection:切换是否在当前周期结束时启用更新占空比/周期的参数。
    • TRUE:在周期结束之后,更新周期/占空比。
    • FALSE:根据PwmDutycycleUpdatedEndPeriod和PwmPeriodUpdatedEndPeriod全局参数在周期结束或者立刻更新周期/占空比。

PwmChannel

下图为建立的两个PWM通道,分别使用ATOM0_3与CCU60_CC63。

 下图为ATOM0_3的General配置。

我们针对其中的参数做一下解释:

  • PwmAssignedHwUnit:选择CCU6还是GTM,注意区别ATOM为24bit的寄存器宽度,CCU6为16bit的寄存器宽度,配置占空比与周期值时需要注意TICKS的大小,特别是CCU6,不能超过65536个Ticks。
  • PwmDutycycleDefault:默认占空比值,此处为 200 000,因为后边我们选择GTM_CONFIGURABLE_CLOCK_0作为时钟,所以200 000个Tick为2ms。CCU6配置的为10 000,则为100us。
  • PwmIdleState:占空比为0时的电平。
  • PwmPeriodDefault:周期值,例如此处配置的400 000,为4ms,CCU6配置为40 000,则为400us。
  • PwmPolarity:PWM_HIGH表示按照高电平计算占空比。PWM_LOW按照低电平计算占空比。

下图为ATOM0_3与CCU60_CC63通道的PwmChannelClass配置。

这个配置一共有四种选项,分别的意义如下:

  • PWM_FIXED_PERIOD:PWM通道具有固定的周期。只能改变占空比。
  • PWM_FIXED_PERIOD_CENTER_ALIGNE:指此PWM参考一个PWM_FIXED_PERIOD通道,在中心点位置进行变化。
  • PWM_FIXED_PERIOD_SHIFTED::这类PWM通道指的是参考一个PWM_FIXED_PERIOD通道的周期和占空比。并按照要求的固定百分比移位。只能改变占空比。
  • PWM_VARIABLE_PERIOD:这类PWM通道具有可变周期和占空比。两者都可以在运行时更改。此通道不应被任何其他通道引用,也不引用任何通道。

下图为ATOM0_3通道的GtmTimerOutputModuleConfiguration配置,使用对应预留ATOM0_3与GTM_CONFIGURABLE_CLOCK_0时钟。

下图为CCU60_CC63通道的CCU6CC6Configuration配置截图。

  • CCU6TimerUsed:选择T12或T13定时器。注意:默认值是T12,因为它是核心中最低的可配置定时器。
  • Cc6xChannel:选择一个CC6x通道。注意:默认值选择为Cc60,因为它是cc6最低的通道。我们实验中使用的是Port02.4,所以选择CC62。
  • CCU6TimerClockSelect:没分频,直接来自Fspb的时钟。
  • CCU6TimerPrescalarEnabled:预分频使能。


PWM驱动调试

测试代码

测试代码如下。用户可以根据实际需要在调试过程中修改周期或者占空比参数,并通过PwmOutStateflag0与PwmOutStateflag0观察输出电平状态。

/*************************************PWM Demo**********************************************************/
uint32	Pwm_SetDutyNumber		= 20000;
uint32	Pwm_SetPeriodNumber		= 40000;
uint8   PwmDebugFlag			= 0;
uint8   PwmOutStateflag0			= 0;
uint8   PwmOutStateflag1			= 0;
void PWM_DemoFunction(void)
{
    /* Pwm Initialization */
    Pwm_17_GtmCcu6_Init(&Pwm_17_GtmCcu6_Config);

	while(1)
	{
		if(PwmDebugFlag==1)
		{
			Pwm_17_GtmCcu6_SetPeriodAndDuty(Pwm_17_GtmCcu6Conf_PwmChannel_PwmChannel_ATOM0_3,Pwm_SetPeriodNumber,Pwm_SetDutyNumber);
			Pwm_17_GtmCcu6_SetPeriodAndDuty(Pwm_17_GtmCcu6Conf_PwmChannel_PwmChannel_CCU60_CC62,Pwm_SetPeriodNumber,Pwm_SetDutyNumber);
		}
		else if(PwmDebugFlag==2)
		{
			Pwm_17_GtmCcu6_SetDutyCycle(Pwm_17_GtmCcu6Conf_PwmChannel_PwmChannel_ATOM0_3,Pwm_SetDutyNumber);
			Pwm_17_GtmCcu6_SetDutyCycle(Pwm_17_GtmCcu6Conf_PwmChannel_PwmChannel_CCU60_CC62,Pwm_SetDutyNumber);
		}
		else if(PwmDebugFlag==3)
		{
			Pwm_17_GtmCcu6_SetOutputToIdle(Pwm_17_GtmCcu6Conf_PwmChannel_PwmChannel_ATOM0_3);
			Pwm_17_GtmCcu6_SetOutputToIdle(Pwm_17_GtmCcu6Conf_PwmChannel_PwmChannel_CCU60_CC62);
		}

			PwmOutStateflag0 = Pwm_17_GtmCcu6_GetOutputState(Pwm_17_GtmCcu6Conf_PwmChannel_PwmChannel_ATOM0_3);
			PwmOutStateflag1 = Pwm_17_GtmCcu6_GetOutputState(Pwm_17_GtmCcu6Conf_PwmChannel_PwmChannel_CCU60_CC62);
	}
}

测试结果 

下图是P02.3的输出结果,可以看到周期和占空比跟我们设置ATOM0_3通道一致。

下图是P02.3的输出结果,可以可以看到周期和占空比跟我们设置CCU60_CC63通道一致。


十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

### MCU中MCAL PWM中断实现方法 在MCU开发过程中,PWM(脉宽调制)广泛应用于多种场景,包括但不限于模拟信号控制、节能和功率控制、通信和数据传输以及音频处理等方面[^1]。对于涉及PWM操作的应用来说,在MCAL层面上理解如何配置和管理PWM相关的中断至关重要。 #### 寄存器级编程基础 由于MCAL层主要负责底层硬件抽象,其核心在于直接操控微控制器内部的各种寄存器来完成特定的任务。针对EVADC这样的外设模块,了解并掌握重要寄存器的功能有助于加速问题解决过程,并提高程序效率[^2]。同样地,当涉及到PWM时,也需要熟悉相应的定时器/计数器寄存器及其位定义。 #### 中断服务例程设计 为了响应由PWM产生的事件(如周期结束),通常会设置一个或多个中断源并与之关联的ISR(Interrupt Service Routine)。下面是一个简单的C语言伪代码示例,展示了如何编写一个基本的PWM ISR: ```c void TIM_PWM_IRQHandler(void){ if(TIM_GetITStatus(TIMx, TIM_IT_Update) != RESET){ // 检查更新中断标志状态 /* 清除TIMx 更新中断待处理位 */ TIM_ClearITPendingBit(TIMx, TIM_IT_Update); // 执行具体的业务逻辑... } } ``` 此函数会在每次PWM波形的一个完整周期完成后被触发执行一次。需要注意的是实际项目中可能还需要考虑其他类型的中断条件,比如捕获比较匹配等。 #### 配置流程概述 - 初始化PWM使用的定时器资源; - 设置所需的频率及占空比参数; - 启用对应的中断通道并将上述编写的ISR链接到该通道上; - 开启全局中断使能开关以便允许CPU接收外部请求; 通过以上步骤即可构建起一套完整的基于MCAL框架下的PWM中断机制解决方案。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值