IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 6、英飞凌-AURIX-TC3XX: PWM实验之使用 GTM -ATOM 实现 -> 正文阅读

[游戏开发]6、英飞凌-AURIX-TC3XX: PWM实验之使用 GTM -ATOM 实现

6、英飞凌-AURIX-TC3XX: PWM实验之使用 GTM -ATOM 实现

1、ATOM 简介

ATOM即与ARU单元相连接的定时器输出模块,是GTM模块中重要的输出子模块。因为ATOM可以通过ARU连接到其他模块,所以该输出模块可以生成复杂的输出信号而无须CPU干扰。应用:通过ARUATOM连接到GTMMCS、DPLL或PSM子模块。以产生具有复杂的PWM,在燃油喷射系统中应用广泛。每个ATOM子模块包含8个输出通道,它们可以在几种配置的操作模式下相互独立运行。

2、ATOM子模块的框架

框架图如下:

在这里插入图片描述

ATOMTOM模块相似,但也存在一些区别:

①、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接收到新的时间戳,新的时间戳被直接加载到通道操作寄存器中。当通道操作寄存器的比较匹配发生时,影子寄存器可以在后台加载CPUARU传输的数据。

③、ATOM 信号输出PWM模式(SOMP):通过将其操作寄存器与子模块内部计数器进行比较,ATOM通道可以将像TOM子模块一样生成简单的PWM信号。不同的是:当ATOM通道运行操作寄存器时,影子寄存器可以在后台加载CPUARU传输的数据。

④、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之间的数据交换,通过影子寄存器SR0SR1以及ATOM[i]_CH[x]STAT寄存的ACBIACBO位字段实现。

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]_STATACBI位字段中,在内部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              /* Number of milliseconds to wait between each duty cycle change */

IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;

void core0_main(void)
{
    IfxCpu_enableInterrupts();
    
    /* !!WATCHDOG0 AND SAFETY WATCHDOG ARE DISABLED HERE!!
     * Enable the watchdogs and service them periodically if it is required
     */
    IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());
    IfxScuWdt_disableSafetyWatchdog(IfxScuWdt_getSafetyWatchdogPassword());
    
    /* Wait for CPU sync event */
    IfxCpu_emitEvent(&g_cpuSyncEvent);
    IfxCpu_waitEvent(&g_cpuSyncEvent, 1);
    

    /* Initialize a time variable */
    Ifx_TickTime ticksFor10ms = IfxStm_getTicksFromMilliseconds(BSP_DEFAULT_TIMER, WAIT_TIME);

    initGtmATomPwm();

    while(1)
    {
        PWM_Duty();
        waitTime(ticksFor10ms);
    }
}
6.3.2、GTM_ATOM_PWM.c
/*
 * GTM_ATOM_PWM.c
 *
 *  Created on: 2022年12月16日
 *      Author: kevin
 */
#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                                /* PWM period for the ATOM, in ticks                */

IfxGtm_Atom_Pwm_Config g_atomConfig;                            /* Timer configuration structure                    */
IfxGtm_Atom_Pwm_Driver g_atomDriver;                            /* Timer Driver structure                           */
uint32 g_fadeValue = 25000;



void setDutyCycle(uint32 dutyCycle);


void initGtmATomPwm(void)
{
    // 1.初始哈GTM
    IfxGtm_enable(&MODULE_GTM);

    //2.设置CMU时钟频率
    IfxGtm_Cmu_setClkFrequency(&MODULE_GTM, IfxGtm_Cmu_Clk_0, CLK_FREQ);    /* Set the CMU clock 0 frequency        */
    IfxGtm_Cmu_enableClocks(&MODULE_GTM, IFXGTM_CMU_CLKEN_CLK0);            /* Enable the CMU clock 0               */

    //3.启动CMU时钟x
    IfxGtm_Atom_Pwm_initConfig(&g_atomConfig, &MODULE_GTM);

     g_atomConfig.atom = PWM.atom;                                       /* Select the ATOM depending on the LED     */
     g_atomConfig.atomChannel = PWM.channel;                             /* Select the channel depending on the LED  */
     g_atomConfig.period = PWM_PERIOD;                                   /* Set timer period                         */
     g_atomConfig.pin.outputPin = &PWM;                                  /* Set LED as output                        */
     g_atomConfig.synchronousUpdateEnabled = TRUE;                       /* Enable synchronous update                */

     IfxGtm_Atom_Pwm_init(&g_atomDriver, &g_atomConfig);                 /* Initialize the PWM         */
     IfxGtm_Atom_Pwm_start(&g_atomDriver, TRUE);                         /* Start the PWM              */

}


void PWM_Duty(void)
{
    /* Set the calculated duty cycle */
    setDutyCycle(g_fadeValue);
}


/* This function sets the duty cycle of the PWM */
void setDutyCycle(uint32 dutyCycle)
{
    g_atomConfig.dutyCycle = dutyCycle;                 /* Set duty cycle                                           */
    IfxGtm_Atom_Pwm_init(&g_atomDriver, &g_atomConfig); /* Re-initialize the PWM                                    */
}

6.3.3、GTM_ATOM_PWM.h
/*
 * GTM_ATOM_PWM.h
 *
 *  Created on: 2022年12月16日
 *      Author: kevin
 */

#ifndef GTM_ATOM_PWM_H_
#define GTM_ATOM_PWM_H_


void initGtmATomPwm(void);
void PWM_Duty(void);

#endif /* GTM_ATOM_PWM_H_ */

6.3.4、实验结果

在这里插入图片描述

Welcome to follow my weixingongzhonghao "Kevin的学习站"

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章           查看所有文章
加:2022-12-25 11:39:00  更:2022-12-25 11:42:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/22 19:04:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码