TC275 配置ICU进行PWM采集

本文详细介绍了STM32中TIM模块的配置过程,包括配置Port为GPIO输入、查找TIN号、选择TIM通道、设置TIM时钟源以及ICU的配置。时钟源频率计算涉及CMU_CLK的分频,最终得到6.25MHz的时钟。在ICU配置中,重点讲述了选择边沿和测量模式,并关联TIM通道。代码示例展示了如何在循环中处理各个ICU通道的状态,进行信号测量和处理。

1. 配置对应的Port

将硬件对应Port 配置成GPIO输入即可
在这里插入图片描述

2. 根据PORT找到对应的TIN号

这里是TIN109
在这里插入图片描述

3. 根据TIN号选择TIM 通道

在手册TIM模块中,找到对应的TIN通道号,确定允许映射的TIM通道,注意在手册中包含多种封装的映射表,请首先确认映射表的封装是否正确
在这里插入图片描述

4. TIM时钟源配置

TIM的时钟源来自于CMU_CLK,同时通过CLK_SEL进行分频。
在这里插入图片描述
一共有8种分频选择
在这里插入图片描述

4.1 TIM时钟源频率计算

TIM属于GTM模块,整个GTM模块的时钟是有CMU分配,同时GTM模块的时钟源一共有两个来源

  1. GTM
  2. SPB
    在这里插入图片描述
    GTM 与SPB的时钟定义在MCU模块
    在这里插入图片描述
    在这里插入图片描述
    根据配置可知,GTM SPB的时钟频率都是100M

在查看CMU的配置,CMU选择了CMU_CLOCK_0作为时钟,因此CMU_CLK的时钟频率为100M/(15+1)

在这里插入图片描述

TIM对应通道的时钟分频是CLOCK_0,因此最终的时钟频率是6.25M
在这里插入图片描述

5. ICU配置

ICU配置,只需要选择对应的边沿以及测量模式,同时关联对应的TIM通道
在这里插入图片描述
在这里插入图片描述

6. 实现代码

截取部分代码如下

void IoHwAb_Icu_MainFcuntion(void)
{
    Icu_ChannelType eChannel = {0,0};
    Icu_17_GtmCcu6_InputStateType eInputState = ICU_IDLE;
    IoHwAb_Icu_SampleParamType ChannelSampleParam = {0,0};
	Icu_17_GtmCcu6_DutyCycleType  DutyCycle = {0x0};
    uint8 *pChannelState =0;
    uint8 *pIdleCnt = 0;
    QueueStructType *pQueuePtr = NULL_PTR;
    Icu_Queue_EleType *pChannelSampleParam = NULL_PTR;
    for (uint8 uiChCnt =0; uiChCnt<IoHwAb_Icu_Channel_MAX; uiChCnt++)
    {
        pChannelState = &g_FsmStateGroup[uiChCnt]; /* 获取通道的工作状态 */
        eChannel = g_IcuChannelTbl[uiChCnt];       /*  获取ICU通道号 */
        pIdleCnt = &Icu_ChannelIdleCnt[uiChCnt];
        pQueuePtr = &Icu_ChannelFilterQueue[uiChCnt];
        pChannelSampleParam = &g_ChannelSampleParam[uiChCnt];
        switch (*pChannelState)
        {
            case 0: /* IDLE */
				Icu_17_GtmCcu6_StartSignalMeasurement(eChannel.Icu_Channel);
				*pChannelState = 1;
				break;
            case 1: /* 开始采集 */
				eInputState =  Icu_17_GtmCcu6_GetInputState(eChannel.Icu_Channel);
				if(eInputState == ICU_ACTIVE)
				{
					*pChannelState = 2;   /* 激活状态,获取采集结果*/
					(*pIdleCnt) = 0;
				}
				else
				{
					(*pIdleCnt)++;
					if(*pIdleCnt >= ICU_IDLE_MAX)
					{
						*pIdleCnt = ICU_IDLE_MAX;
						ChannelSampleParam.uiDuty  = (uint16)Dio_ReadChannel(eChannel.Dio_Channel)*1000;
						ChannelSampleParam.uiFreq = 0;
						Icu_Queue_Push(pQueuePtr,ChannelSampleParam);
						*pChannelSampleParam = IoHwAb_Icu_GetQueueFilterResult(pQueuePtr);
					}
				}
				break;
            case 2: /* 检测采集是否完成 */
				Icu_17_GtmCcu6_GetDutyCycleValues(eChannel.Icu_Channel, &DutyCycle);
				if(DutyCycle.PeriodTime !=0)
				{
					ChannelSampleParam.uiFreq = ICU_CLOCK_FREQ/DutyCycle.PeriodTime;
					ChannelSampleParam.uiDuty  = ((float)(DutyCycle.ActiveTime))/((float)(DutyCycle.PeriodTime))*1000;
					Icu_Queue_Push(pQueuePtr,ChannelSampleParam);
				}
				*pChannelState = 3;
            	break;
            case 3:
            	Icu_17_GtmCcu6_StopSignalMeasurement(eChannel.Icu_Channel);
            	*pChannelSampleParam = IoHwAb_Icu_GetQueueFilterResult(pQueuePtr);
				*pChannelState = 0;
            	break;
            default:
				*pChannelState = 0;
				break;

        }
    }    
}
<think>嗯,用户想配置TC275的十二路互补输出PWM,我得先理清这个问题。首先,TC275是英飞凌的Aurix系列微控制器,互补PWM通常用于电机控制或者逆变器,需要两个相位相反的PWM信号。用户需要十二路,也就是六对互补输出,对吧? 根据引用里的信息,PWM模块在英飞凌芯片里可能涉及到GTM(通用定时器模块)或者其他的定时器模块。比如引用3提到GTM的初始化,所以可能TC275PWM配置与GTM有关。互补输出需要配置成互补模式,可能涉及死区时间设置,避免上下桥臂同时导通。 用户需要十二路互补,那得确认TC275是否有足够的硬件通道支持。每个互补对需要两个通道,所以六对的话需要十二个通道。查看引用2,里面提到PWM硬件通道,可能每个通道可以配置为互补输出的一部分。但需要确认TC275PWM模块是否支持这么多。 接下来是配置步骤。引用2和3提到MCAL配置,可能需要使用EB Tresos或者类似的工具进行模块配置。步骤大概包括初始化MCU、Port、GTM和PWM模块。比如在MCAL中配置PWM通道的参数,如周期、占空比、对齐方式,然后设置互补对。 另外,信号源选择和引脚映射也很重要。引用1提到TOUTSEL的选择,需要将PWM输出映射到正确的引脚,比如P34.3这样的引脚。每个互补对需要两个引脚,所以用户需要查看数据手册确定哪些引脚支持互补输出,并进行PORT模块的配置,设置复用功能为PWM输出。 死区时间的设置是关键,防止短路。引用2提到互补输出常用于全桥驱动,所以配置时可能需要启用死区插入功能,并设置合适的时间参数。 代码方面,可能需要调用Pwm_17_TimerIp_Init这样的API来初始化PWM,然后使用Pwm_SetPeriodAndDuty来设置周期和占空比。测试时,需要初始化各个模块,然后检查输出是否正确。 用户可能需要参考TC275的具体文档,比如用户手册或应用笔记,确保寄存器配置正确。同时,如果现有的教程不够,可能需要结合多个引用中的信息,比如英飞凌的MCAL配置指南,来逐步配置每个通道。 最后,验证部分需要示波器检查波形,确保互补信号相位正确,死区时间合适,频率和占空比符合预期。如果遇到问题,可能需要检查引脚配置、时钟源选择或中断配置是否正确。</think>### TC275配置十二路互补输出PWM的方法 #### 1. **硬件资源确认** - TC275PWM模块基于GTM(通用定时器模块)和TOM(定时器输出模块)实现互补输出。需确认芯片是否支持12路互补输出: - 每个互补对需要两个PWM通道(如TOM1_CH0和TOM1_CH1为一对互补通道)[^3] - 需检查TOM模块通道数量是否满足需求(例如TOM1模块最多支持16个通道) #### 2. **配置步骤** ```c // 示例代码框架 Pwm_17_TimerIp_ChannelConfigType pwmConfig[12] = {0}; for(int i=0; i<12; i++){ pwmConfig[i].Period = 10000; // PWM周期 pwmConfig[i].DutyCycle = 3000; // 初始占空比 pwmConfig[i].Polarity = PWM_HIGH; // 极性配置 pwmConfig[i].ComplementaryChannel = i^1; // 配对互补通道 pwmConfig[i].DeadTime = 100; // 死区时间(纳秒) } Pwm_17_TimerIp_Init(&pwmConfig); // 初始化PWM模块[^3] ``` #### 3. **关键配置项** 1. **GTM模块初始化** - 配置时钟分频:`Gtm_Init()`中设置GTM全局时钟源 - 选择TOM子模块作为PWM生成单元[^1] 2. **互补输出配置** ```c // 设置通道互补属性和死区 Pwm_17_TimerIp_SetOutputState(PWM_CH0, PWM_COMPLEMENTARY); Pwm_17_TimerIp_SetDeadTime(PWM_CH0, 100, 100); // 上升/下降沿死区 ``` 3. **引脚映射** - 通过PORT模块配置PWM输出引脚: ```c Port_SetPinMode(P34_3, PORT_PIN_MODE_ALT6); // 设为PWM输出[^1] ``` - 互补通道需成对配置(如P34.3和P34.4为一组互补输出) #### 4. **验证方法** 1. 使用示波器检查互补波形相位差 2. 通过`Pwm_SetDutyCycle()`动态修改占空比验证控制 3. 测试死区时间是否符合设计需求(建议100-500ns) #### 5. **注意事项** - 时钟配置需保证PWM频率精度,建议使用fGTM=100MHz - 互补通道需严格同步,建议使用`Pwm_17_TimerIp_Synchronize()`API - 高边/低边驱动需分开供电时注意电平匹配
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值