【回眸】AURIX TC397实现4PWM时间同步的开发
【回眸】InfineonTC397Aurix实现4PWM时间同步的开发
根据频率区间更改IfxGtm_Tom_Ch_ClkSrc_cmuFxclk
前言
最近有一些开发任务,正在努力完成中,分了几个小阶段,空闲的时候写篇博文复盘一下。
确定PWM方波输出引脚
如果想实现时间同步SYNC输出,第一步应该确定GPIO,以P34.1、P34.2、P34.3、P34.4为例,完成时间同步的开发任务。
在PinMap文件里找出GPIO对应的GTM_Tom脚
通过原来Tom_PWM.c文件里的&IfxGtm_TOM0_10_TOUT41_P23_0_OUT引脚来搜索所需的4个GPIO是否有配置的引脚。
经过查找,可以发现一共有4中,分别为Tom0,Tom1,Tom2,Tom3,经过比较,最终选择了P34.1、P34.2、P34.3、P34.4都有的TOM1。将原本的默认&IfxGtm_TOM0_10_TOUT41_P23_0_OUT后接为
static const IfxGtm_Tom_ToutMap * tom_output_pin[] =
{
&IfxGtm_TOM0_10_TOUT41_P23_0_OUT,//保留,但实际代码中没有用到这个
&IfxGtm_TOM1_13_TOUT146_P34_1_OUT,
&IfxGtm_TOM1_14_TOUT147_P34_2_OUT,
&IfxGtm_TOM1_15_TOUT148_P34_3_OUT,
&IfxGtm_TOM1_6N_TOUT149_P34_4_OUT
};
将原本默认的&EMC_ETH_GPIO_OUT1后接
static const IfxPort_Pin * tom_gpio_pin[] =
{
&EMC_ETH_GPIO_OUT1,//原本默认的GPIO,在实际代码中没有使用
&SYNC1_AURIX_GPIO_1,
&SYNC2_AURIX_GPIO_2,
&SYNC3_AURIX_GPIO_3,
&SYNC4_AURIX_GPIO_4
};
注意在配置上述GPIO之前首先要定义SYNC1_AURIX_GPIO_1234
在tom_pwm.c里面配置以下宏定义
#define SYNC1_AURIX_GPIO_1 IfxPort_P34_1 #define SYNC2_AURIX_GPIO_2 IfxPort_P34_2 #define SYNC3_AURIX_GPIO_3 IfxPort_P34_3 #define SYNC4_AURIX_GPIO_4 IfxPort_P34_4
这边需要注意的是SYNC1_AURIX_GPIO_1234名字是自己取的,注意两边的名称要一致,而IfxPort_P34_1234是原本已经配置好的。
按要求更改频率和占空比
我接到的任务要求是频率30HZ,占空比25%,需要更改以下两部分内容
static const uint32 tom_pwm_freq[ ] =
{
30
};
static const uint32 tom_pwm_duty[ ] =
{
25
};
根据频率区间更改IfxGtm_Tom_Ch_ClkSrc_cmuFxclk
上一篇关于PWM开发的文章里面包含这个clock的配置
配置clock时 IfxGtm_Tom_Ch_ClkSrc_cmuFxclk1 注意这里的数字 1代表1kHZ到40KHZ的频率, 这里是根据示波器调试出来在此分频域内不会失真的一个范围, 具体可能要通过测试开发板获得正确的数据。 // 3 -- < 50Hz // 2 -- < 2000Hz // 1 -- < 40000Hz
可以发现本次任务要求的30HZ处于clock3,所以将原本的IfxGtm_Tom_Ch_ClkSrc_cmuFxclk1替换成IfxGtm_Tom_Ch_ClkSrc_cmuFxclk3。
更改Bringup函数内容以实现4PWM时间同步测试
更改Bringup函数且在主函数内调用,在Bringup函数内增加以下内容
pwm_para.pwm_duty = 25;
pwm_para.pwm_freqency = 30;
IfxGtm_enable(&MODULE_GTM);
pwm_para.pwm_gpio_index = 4;
tom_pwm_init(pwm_para.pwm_gpio_index);
pwm_para.pwm_gpio_index = 3;
tom_pwm_init(pwm_para.pwm_gpio_index);
pwm_para.pwm_gpio_index = 2;
tom_pwm_init(pwm_para.pwm_gpio_index);
pwm_para.pwm_gpio_index = 1;
tom_pwm_init(pwm_para.pwm_gpio_index);
tom_pwm_start(1);
tom_pwm_start(2);
tom_pwm_start(3);
tom_pwm_start(4);
以上添加的代码时经过1.5天的尝试得到的,踩的一个坑是没有同时Start,这样就导致了其中有1个PIN脚和其他PIN脚的PWM肉眼可见的无法同步。将4个PIN脚同时Start时,发现四者差不多同时发出方波,此时使用示波器点这4个PIN脚,保存示波器图,此外还需要保存其上升沿及下降沿的图以精确四者细微的时间差,发现四者时间差约为6ns。
后记
PWM的开发告一段落,写本文的目的一方面是提醒未来的自己别忘了当初做了什么动作,另一个方面也是希望能给刚入汽车电子的萌新一些参考,欢迎大家在评论区交流点赞。
看到这里的读者朋友们可以点击专栏查看同系列的其他文章,希望能帮到屏幕前的每一位应届生往届生,该博文最初发表在CSDN上。
#第一次找实习,我建议__##2025秋招体验点评##你听到的“最没用”的秋招建议##从mentor身上学到了__##秋招暂停,我将对以下公司做出处罚__#本专栏助应届生从物联网小白成长为企业争抢的技术人才,聚焦三大核心技术:传感器应用(环境监测)、嵌入式开发(STM32/Arduino)、通信协议(LoRa/NB-IoT/MQTT),配合10+实战项目(如智能温湿度监控系统)积累项目经验。覆盖智能硬件、工业物联网、智能家居领域岗位需求,解析企业招聘技术重点与面试题,帮电子、计算机、自动化等专业学生构建知识体系,提前锁定名企Offer!
查看11道真题和解析