6、英飞凌-AURIX-TC3XX: PWM实验之使用 GTM -ATOM 实现
1、ATOM 简介
ATOM 即与ARU 单元相连接的定时器输出模块,是GTM 模块中重要的输出子模块。因为ATOM 可以通过ARU 连接到其他模块,所以该输出模块可以生成复杂的输出信号而无须CPU 干扰。应用:通过ARU 将ATOM 连接到GTM 中MCS、DPLL或PSM 子模块。以产生具有复杂的PWM ,在燃油喷射系统中应用广泛。每个ATOM 子模块包含8个输出通道,它们可以在几种配置的操作模式下相互独立运行。
2、ATOM子模块的框架
框架图如下:
ATOM 与TOM 模块相似,但也存在一些区别:
①、ATOM 模块所需的工作时钟从CMU 模块中生成的8个配置时钟CMU_CLK0-7 中选择,如果使用到时间戳,则可以选择TBU 模块中生成的3路TBU_TS0-2 中的一个。
②、每个ATOM 子模块包含8个输出通道,而TOM 模块有多达16个输出的通道。
③、ATOM 中的通道选择和控制用一个AGC 单元控制,AGC 控制器的功能和TOM 通道的TGC 控制器功能相似。
3、ATOM 通道的五种操作模式:
①、ATOM 信号立即输出模式(SOMI ):ATOM 通道根据通过ACBI 位字段接收到的ARU 数据,在收到ARU 数据后立即生成输出信号。由于ARU 目的端的运行按照轮询方式进行,在这种模式下,考虑ARU 往返时间的不确定性,输出信号可能会发生抖动。
②、ATOM 信号比较输出模式(SOMC ):ATOM 通道输出的信号代表ATOM 操作寄存器中的时间戳,并可以将这些时间戳与TBU 生成的时间戳进行比较。ATOM 能够通过CPU 或 通过 ARU 接收到新的时间戳,新的时间戳被直接加载到通道操作寄存器中。当通道操作寄存器的比较匹配发生时,影子寄存器可以在后台加载CPU 和ARU 传输的数据。
③、ATOM 信号输出PWM 模式(SOMP ):通过将其操作寄存器与子模块内部计数器进行比较,ATOM 通道可以将像TOM 子模块一样生成简单的PWM 信号。不同的是:当ATOM 通道运行操作寄存器时,影子寄存器可以在后台加载CPU 和ARU 传输的数据。
④、ATOM 信号串行输出模式(SOMS ):ATOM 通道输出移位寄存器生成串行输出位流。移位的位数和移位方向是可配置的,移位频频由CMU_CLKx 时钟信号之一确定。
⑤、ATOM 信号缓冲输出模式比较(SOMB ):ATOM 通道输出信号代表位于ATOM 操作寄存器中的时间戳。通过ARU 接收到的新比较值首先存储在影子寄存器中,并且只有在发生先前的比较匹配事件时,才使用影子寄存器的内容来更新操作寄存器。
4、ATOM通道结构
ATOM 通道与TOM 通道的架构相似,区别:
①、ATOM 模块中操作寄存器CN0、CM0、CM1 和影子寄存器SR0、SR1 等计数器都是24位,提高了计数器的精度;
②、ATOM 通道主要由4个子单元构成,包括CCU0、CCU1、SOU和ACI ;
③、ARU 通道接口单元负责ATOM 模块与ARU 之间的数据交换,通过影子寄存器SR0 和SR1 以及ATOM[i]_CH[x]STAT 寄存的ACBI 和ACBO 位字段实现。
5、ARU通信接口
ATOM 信道具有一个ARU 通信接口(ACI )子单元。该子单元负责从ARU 之间和与ARU 之间的数据交换。这是通过两个已实现的寄存器SR0、SR1以及ACBI和ACBO 位字段来完成的,它们是ATOM[i]_CH[x]_STAT 寄存器字段的一部分。
如果在ATOM[i]_CH[x]_CTRL 寄存器内设置ARU_EN 位,则通过在ATOM[i]_AGC_ENDIS_STAT 寄存器内设置启用位来启用ATOM 通道,并且CPU 没有写入CM0、CM1、SR0、SR1 寄存器的零,ATOM 通道将在SOMP、SOMS、SOMC和SOMB 模式下首先向ARU 请求数据。
传入的ARU 数据(53位宽信号ARU_CHx_IN )被ACI 分成三部分,并通信到ATOM 信道寄存器。在SOMI、SOMP、SOMS和SOMB 模式中,传入的ARU 数据ARU_CHx_IN 的分割方式是,ARU 数据的低24位(23至0)存储在SR0 寄存器中,高24位(47至24)存储在SR1 寄存器中。从52位到48位(CTRL_BITS )以SOMI、SOMP和SOMS 模式存储在寄存器ATOM[i]_CH[x]_STAT 的ACBI 位字段中,在内部ACB_SR 寄存器中以SOMB 模式存储。
6、具体实验操作
6.1、实验要求
通过GTM ATOM 产生一个PWM 信号。
6.2、ATOM配置流程
6.2.1、通过调用初始化函数initGtmAtomPwm()来完成 ATOM 初始化配置
其中包含以下步骤:
①、通过调用函数IfxGtm_enable() 来启用GTM ;
②、使用IfxGtm_Cmu_SetClkFrequency() 功能设置CMU 时钟0频率为1 MHz。
③、通过调用函数IfxGtm_Cmu_enableClocks() 来启用CMU 时钟0。
函数IfxGtm_Atom_Pwm_initConfig() 用其默认值初始化结构IfxGtm_Atom_Pwm_Config 的一个实例。
IfxGtm_Atom_Pwm_Config 结构允许设置以下参数来初始化模块:
atom -正在计数的atom的选择;
atomChannel -选择驱动GPIO 的通道;
period -将PWM 信号的周期设置为期望的值;
pin.outputPin -选择GPIO 口作为输出引脚;
synchronousUpdateEnable -启用同步更新的计时器。
6.2.2、设置占空比
占空比的设置是通过调用函数集duty() 来完成的,其中包含以下步骤:
①、设置配置结构实例的对数循环参数,将PWM 信号的占空比设置为所需值;
②、调用函数IfxGtm_Atom_Pwm_init() 以使用新配置重新初始化和重新激活ATOM 。
6.2.3、PWM计算
6.3、具体实现
6.3.1、Cpu0_Main.c
#include "Ifx_Types.h"
#include "IfxCpu.h"
#include "IfxScuWdt.h"
#include "Bsp.h"
#include "GTM_ATOM_PWM.h"
#define WAIT_TIME 10
IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;
void core0_main(void)
{
IfxCpu_enableInterrupts();
IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());
IfxScuWdt_disableSafetyWatchdog(IfxScuWdt_getSafetyWatchdogPassword());
IfxCpu_emitEvent(&g_cpuSyncEvent);
IfxCpu_waitEvent(&g_cpuSyncEvent, 1);
Ifx_TickTime ticksFor10ms = IfxStm_getTicksFromMilliseconds(BSP_DEFAULT_TIMER, WAIT_TIME);
initGtmATomPwm();
while(1)
{
PWM_Duty();
waitTime(ticksFor10ms);
}
}
6.3.2、GTM_ATOM_PWM.c
#include "GTM_ATOM_PWM.h"
#include "Ifx_Types.h"
#include "IfxGtm_Atom_Pwm.h"
#define PWM IfxGtm_ATOM0_2N_TOUT5_P02_5_OUT
#define CLK_FREQ 1000000.0f
#define PWM_PERIOD 50000
IfxGtm_Atom_Pwm_Config g_atomConfig;
IfxGtm_Atom_Pwm_Driver g_atomDriver;
uint32 g_fadeValue = 25000;
void setDutyCycle(uint32 dutyCycle);
void initGtmATomPwm(void)
{
IfxGtm_enable(&MODULE_GTM);
IfxGtm_Cmu_setClkFrequency(&MODULE_GTM, IfxGtm_Cmu_Clk_0, CLK_FREQ);
IfxGtm_Cmu_enableClocks(&MODULE_GTM, IFXGTM_CMU_CLKEN_CLK0);
IfxGtm_Atom_Pwm_initConfig(&g_atomConfig, &MODULE_GTM);
g_atomConfig.atom = PWM.atom;
g_atomConfig.atomChannel = PWM.channel;
g_atomConfig.period = PWM_PERIOD;
g_atomConfig.pin.outputPin = &PWM;
g_atomConfig.synchronousUpdateEnabled = TRUE;
IfxGtm_Atom_Pwm_init(&g_atomDriver, &g_atomConfig);
IfxGtm_Atom_Pwm_start(&g_atomDriver, TRUE);
}
void PWM_Duty(void)
{
setDutyCycle(g_fadeValue);
}
void setDutyCycle(uint32 dutyCycle)
{
g_atomConfig.dutyCycle = dutyCycle;
IfxGtm_Atom_Pwm_init(&g_atomDriver, &g_atomConfig);
}
6.3.3、GTM_ATOM_PWM.h
#ifndef GTM_ATOM_PWM_H_
#define GTM_ATOM_PWM_H_
void initGtmATomPwm(void);
void PWM_Duty(void);
#endif
6.3.4、实验结果
Welcome to follow my weixingongzhonghao "Kevin的学习站"
|