AURIX TC3xx TOM模块PWM输出与ADC触发DMA传输全链路配置实战
2026/9/19 19:02:48 网站建设 项目流程

1. 从定时器到数据链路:TOM模块的整体设计思路

第一次接触英飞凌AURIX系列TC3xx芯片的工程师,看到TOM这个词往往会愣一下——它不像STM32里的TIM那么直白。TOM全称是Timer Output Module,属于GTM(Generic Timer Module)这个大框架下的一个子模块。GTM本身是AURIX里最复杂的定时器集群,包含TOM、ATOM、TIM、MCS、DPLL等多个子单元,各自分工不同。TOM的定位很明确:它负责产生输出信号,也就是PWM波形的生成,同时它还能作为ADC转换的触发源,把定时器事件和模数采样这两件事串起来。

这个设计思路和传统MCU不太一样。以STM32为例,PWM输出靠TIM,ADC触发靠TIM的TRGO信号,DMA搬运ADC数据靠DMA控制器,三者是相对独立的模块,通过触发矩阵连接。AURIX的GTM则更像一个"定时器操作系统",TOM只是其中一个执行单元,它产生的信号要经过GTM内部的互联矩阵才能到达ADC或其它外设。理解这一层架构,是后面所有配置工作的前提。

为什么AURIX要搞这么复杂?核心原因在于电机控制和电力电子应用对时序精度的要求极高。一个三相电机FOC控制,需要三路互补PWM、死区时间、中心对齐模式、ADC在PWM特定相位触发采样,还要保证采样时刻和PWM占空比更新时刻严格同步。传统MCU用软件协调这些事件,抖动可能达到几百纳秒甚至微秒级;GTM用硬件互联矩阵,抖动可以压到几十纳秒以内。这就是TOM+ADC+DMA这套组合存在的意义。

我个人的经验是,如果你只是做个简单的LED调光或者蜂鸣器驱动,用TOM有点杀鸡用牛刀,STM32的TIM或者AURIX的GPT模块更省事。但一旦涉及电机控制、数字电源、超声波驱动这类对时序敏感的场景,TOM的价值就体现出来了。它的PWM分辨率可以做到时钟周期级别,配合GTM的DPLL还能实现频率动态调整,这是普通定时器做不到的。

从数据流的角度看,整个链路是这样的:TOM通道产生PWM波形,同时产生一个触发事件;这个触发事件通过GTM的ARU(Advanced Routing Unit)或者直接连接到ADC的触发输入;ADC收到触发后启动一次转换;转换完成后产生DMA请求;DMA控制器把结果搬运到内存缓冲区。整条链路是硬件自动完成的,CPU只需要在初始化时配置好,运行期间几乎不需要干预。这就是所谓的"从配置到DMA数据传输"的完整闭环。

2. TOM模块的核心机制与PWM输出配置

2.1 TOM的通道结构与时钟源选择

TOM模块内部由多个TOM子模块组成,TC3xx通常有TOM0到TOM5,每个TOM子模块包含16个通道。每个通道有独立的CN0计数器、比较寄存器CM0和CM1、周期寄存器SR0,以及控制寄存器。这种结构决定了TOM可以同时输出16路独立的PWM,而且每路的频率和占空比都可以不同。

时钟源方面,TOM的输入时钟来自GTM的CMU(Clock Management Unit)。CMU可以配置多个时钟分频器,比如CMU_CLK0到CMU_CLK7,每个分频器可以设置不同的分频系数。TOM通道可以选择其中一个作为自己的时钟源。这里有个关键点:TOM的计数器是向上计数的,从0计到SR0的值,然后归零重新开始。所以PWM频率的计算公式是:

PWM频率 = TOM时钟频率 / (SR0 + 1)

举个例子,如果CMU_CLK0配置为100MHz,SR0设为999,那么PWM频率就是100MHz / 1000 = 100kHz。这个计算看起来简单,但实际配置时容易踩坑的地方在于:CMU的分频系数是全局的,改了会影响所有使用该时钟的TOM通道。所以规划阶段就要想清楚,哪些通道需要同频,哪些需要不同频,然后合理分配CMU_CLK资源。

我见过不少项目因为CMU时钟分配不合理,导致后期想改某一路PWM频率时发现没有空闲的CMU_CLK可用,只能重新规划整个GTM配置。建议的做法是:先把所有需要的PWM频率列出来,找出最大公约数,用最少的CMU_CLK覆盖所有频率需求。比如需要100kHz、50kHz、25kHz三种频率,可以用一个100MHz的CMU_CLK,然后通过不同的SR0值实现,不需要占用三个CMU_CLK。

2.2 PWM模式选择与死区时间配置

TOM支持两种PWM模式:边沿对齐和中心对齐。边沿对齐模式下,计数器从0开始向上计数,在CM0处翻转输出,在CM1处再次翻转,周期结束时归零。中心对齐模式下,计数器先向上计数到SR0,再向下计数到0,输出在上下计数过程中对称翻转。中心对齐模式在电机控制中更常用,因为它产生的谐波频谱更优,而且ADC采样时刻可以安排在计数器过零点,避开开关噪声。

死区时间的配置是另一个重点。三相电机驱动中,上下桥臂不能同时导通,否则会烧管子。死区时间就是在这个切换过程中插入的一段"两边都关断"的时间。TOM模块本身不直接产生死区,需要配合ATOM或者使用TOM的互补输出功能。在TC3xx中,通常用ATOM的PWMH和PWML通道来产生互补对,或者用TOM配合外部逻辑。如果非要用TOM做互补输出,需要两个通道配合,一个输出高有效,一个输出低有效,然后在软件里保证两者的CM0和CM1值有足够的间隔。

死区时间的计算取决于MOSFET或IGBT的开关特性。以常见的IRF3205 MOSFET为例,开通延迟约10ns,关断延迟约30ns,上升时间约60ns,下降时间约40ns。保守估计,死区时间至少要覆盖关断延迟加下降时间,也就是70ns左右。实际工程中通常留2到3倍余量,取200ns到500ns。如果死区时间设得太小,会出现直通短路;设得太大,输出波形畸变严重,电机效率下降。这个参数需要根据实际使用的功率器件手册来定,不能拍脑袋。

2.3 触发ADC的时机选择与配置方法

TOM触发ADC的机制是通过比较匹配事件产生的。当计数器值等于CM0或CM1时,TOM会产生一个触发脉冲,这个脉冲可以路由到ADC的触发输入。关键问题是:应该在PWM周期的哪个时刻触发ADC?

对于电机电流采样,最佳时刻是PWM周期的中点,也就是中心对齐模式下计数器到达SR0的时刻。这时候三相下桥臂都处于导通状态(或者都处于关断状态,取决于PWM极性),电流在采样电阻上产生的电压最稳定,不受开关噪声干扰。如果是在边沿对齐模式下,通常选择在PWM周期开始时触发,这时候开关动作刚完成,需要等一段时间让振铃衰减。

配置方法上,需要设置TOM通道的触发使能位,然后通过GTM的ARU或者直接输出到ADC的触发矩阵。在AURIX的iLLD库中,通常用IfxGtm_Tom_Pwm_init函数初始化PWM,然后在配置结构体里指定触发点。具体的寄存器操作涉及TOM的CH[x].CTRL寄存器的TRIGOUT位,以及GTM的ADC_TRIG路由配置。这部分如果用手写寄存器的方式,需要仔细对照芯片手册的GTM章节,因为不同型号的TC3xx在触发路由上可能有细微差异。

3. ADC触发与DMA数据传输的完整链路

3.1 ADC触发源的配置与采样时间计算

ADC收到TOM的触发信号后,不会立即开始转换,而是要先经过一个采样阶段。采样时间的长短取决于信号源的内阻和ADC输入电容。AURIX的ADC输入电容典型值是2pF到5pF,如果信号源内阻是10kΩ,那么RC时间常数就是20ns到50ns。要保证采样精度达到12位,采样时间至少要7到10个RC时间常数,也就是140ns到500ns。

实际配置时,ADC的采样时间通过INPCR寄存器设置,单位是ADC时钟周期。假设ADC时钟是50MHz,一个周期20ns,那么采样时间设为25个周期就是500ns。这个值需要根据实际信号源来调整。如果采样时间太短,采样电容充不满,转换结果会偏小;如果太长,虽然精度有保障,但会限制最大采样率。

触发模式上,AURIX的ADC支持单次触发和连续触发。单次触发就是每来一个触发信号转换一次,适合PWM同步采样;连续触发是ADC自己连续转换,适合高速数据采集。在TOM+ADC+DMA这个场景下,通常用单次触发模式,由TOM在每个PWM周期触发一次,保证采样时刻和PWM严格同步。

这里有个容易忽略的细节:ADC的触发输入有多个通道,每个通道可以配置不同的触发源和触发沿。如果多个TOM通道同时触发同一个ADC组,需要配置优先级或者触发队列,否则会出现触发丢失。AURIX的ADC模块支持8个触发输入,每个可以独立配置,但同一时刻只能有一个触发被响应。如果两个触发同时到达,优先级高的先响应,优先级低的会被丢弃。所以在多路PWM同步采样的场景下,要合理安排触发顺序,或者使用ADC的扫描模式,一次触发转换多个通道。

3.2 DMA传输的配置与缓冲区管理

ADC转换完成后,会产生一个DMA请求。DMA控制器收到请求后,把ADC结果寄存器里的数据搬运到内存缓冲区。这个过程不需要CPU参与,所以效率很高。配置DMA时,需要设置源地址(ADC结果寄存器)、目标地址(内存缓冲区)、传输长度、传输宽度等参数。

AURIX的DMA控制器支持链表模式,可以配置多个传输描述符,实现复杂的缓冲区管理。比如双缓冲模式:DMA先填缓冲区A,填满后自动切换到缓冲区B,同时产生一个中断通知CPU处理缓冲区A的数据。CPU处理完后,DMA再切回缓冲区A。这种模式适合连续数据采集,CPU有充足的时间处理数据,不会因为DMA传输而丢数据。

缓冲区大小的选择需要权衡。缓冲区太小,DMA中断太频繁,CPU开销大;缓冲区太大,数据延迟高,实时性差。以100kHz的PWM频率为例,每个PWM周期采样一次,ADC采样率就是100kSPS。如果缓冲区设为100个样本,那么每1ms产生一次DMA中断。对于电机控制来说,1ms的控制周期是合理的,所以100个样本的缓冲区大小是合适的。如果PWM频率是10kHz,缓冲区可以设大一些,比如1000个样本,中断周期还是100ms,但数据量更大,适合做谐波分析。

DMA传输宽度方面,ADC结果是12位,通常用16位传输。如果ADC配置为8位分辨率,可以用8位传输,节省带宽。但AURIX的DMA控制器对传输宽度有对齐要求,源地址和目标地址的位宽要匹配,否则会出现数据错位。我遇到过因为源地址是16位对齐、目标地址是8位对齐,导致数据高低字节颠倒的问题,排查了很久才发现是DMA传输宽度配置错误。

3.3 中断处理与数据后处理

DMA传输完成后,会产生一个中断。在中断服务函数里,CPU需要做两件事:一是切换缓冲区,二是对数据进行后处理。后处理包括滤波、标定、单位转换等。比如ADC读到的原始值是0到4095,对应0到3.3V,需要转换成实际的电流值或电压值。

滤波是后处理的重点。ADC采样难免有噪声,特别是电机控制场景,开关噪声会耦合到采样信号上。常用的滤波方法有均值滤波、中值滤波、一阶低通滤波。均值滤波适合周期性噪声,中值滤波适合脉冲噪声,一阶低通滤波适合高频噪声。实际工程中通常组合使用,比如先中值滤波去掉脉冲,再一阶低通滤波平滑。

一阶低通滤波的公式是:y[n] = α * x[n] + (1-α) * y[n-1],其中α是滤波系数,取决于截止频率和采样率。截止频率fc和采样率fs的关系是:α = 2π * fc / fs(当fc远小于fs时)。比如采样率100kHz,想要1kHz的截止频率,α = 2π * 1000 / 100000 ≈ 0.0628。这个系数越小,滤波效果越强,但相位延迟也越大。在电流环控制中,相位延迟会影响控制带宽,所以α不能太小,通常取0.1到0.3之间。

4. 实操过程与关键环节实现

4.1 环境搭建与基础配置

我用的开发环境是AURIX Development Studio,配合iLLD库。首先需要初始化GTM模块,配置CMU时钟。这一步通常在IfxGtm_enableIfxGtm_Cmu_setClkFrequency函数中完成。CMU的时钟源来自SPB总线时钟,TC3xx的SPB通常跑100MHz,CMU可以分频到50MHz、25MHz等。

配置TOM通道时,我用的是IfxGtm_Tom_Pwm_Config结构体,里面需要指定TOM模块号、通道号、时钟源、周期、占空比、触发点等。初始化完成后,调用IfxGtm_Tom_Pwm_init应用配置,再调用IfxGtm_Tom_Pwm_start启动PWM输出。

ADC配置用IfxAdc_Config结构体,指定ADC模块号、通道号、采样时间、触发源、分辨率等。触发源选择对应的TOM通道触发信号。DMA配置用IfxDma_ChannelConfig结构体,指定源地址、目标地址、传输长度、传输宽度、中断使能等。

整个初始化流程大概需要200行代码,其中大部分是结构体赋值。我建议把配置参数单独放在一个头文件里,用宏定义或者常量数组,方便后期调整。比如PWM频率、死区时间、采样时间这些参数,经常需要根据实际硬件调整,如果散落在代码各处,改起来很麻烦。

4.2 参数计算与配置实例

假设我要做一个三相电机控制,PWM频率20kHz,死区时间500ns,ADC采样率20kSPS,DMA缓冲区100个样本。计算过程如下:

PWM周期 = 1 / 20kHz = 50μs。如果TOM时钟是100MHz,周期是10ns,那么SR0 = 50μs / 10ns - 1 = 4999。占空比50%时,CM0 = 2500,CM1 = 2500(中心对齐模式下,CM0和CM1对称)。

死区时间500ns对应50个时钟周期。在互补输出配置中,高侧通道的CM0设为2500,低侧通道的CM0设为2550,这样两者之间有50个周期的间隔,就是500ns死区。

ADC采样时间:假设信号源内阻5kΩ,ADC输入电容3pF,RC = 15ns。要保证12位精度,需要10个RC时间常数,即150ns。ADC时钟50MHz,周期20ns,采样时间设为8个周期就是160ns,满足要求。

DMA缓冲区:100个样本,每个样本16位,共200字节。DMA传输长度设为100,传输宽度16位。中断周期 = 100 / 20kSPS = 5ms。这个中断周期对于电机控制来说偏长,可以减小到50个样本,中断周期2.5ms,或者提高PWM频率到40kHz,中断周期还是2.5ms。

配置代码的关键部分如下:

// TOM PWM配置 IfxGtm_Tom_Pwm_Config tomConfig; IfxGtm_Tom_Pwm_initConfig(&tomConfig, &MODULE_GTM); tomConfig.tom = IfxGtm_Tom_0; tomConfig.tomChannel = IfxGtm_Tom_Ch_0; tomConfig.clock = IfxGtm_Tom_Ch_ClkSrc_cmuClock0; tomConfig.period = 4999; tomConfig.dutyCycle = 2500; tomConfig.trigger = IfxGtm_Tom_Ch_Trigger_0; IfxGtm_Tom_Pwm_init(&tomDriver, &tomConfig); IfxGtm_Tom_Pwm_start(&tomDriver, TRUE); // ADC配置 IfxAdc_Config adcConfig; IfxAdc_initConfig(&adcConfig, &MODULE_ADC0); adcConfig.channelId = IfxAdc_ChannelId_0; adcConfig.sampleTime = 8; adcConfig.resolution = IfxAdc_Resolution_12bit; adcConfig.triggerSource = IfxAdc_TriggerSource_0; IfxAdc_init(&adcDriver, &adcConfig); // DMA配置 IfxDma_ChannelConfig dmaConfig; IfxDma_initChannelConfig(&dmaConfig, &MODULE_DMA); dmaConfig.sourceAddress = (uint32)&ADC0_RESULT0; dmaConfig.destinationAddress = (uint32)adcBuffer; dmaConfig.transferLength = 100; dmaConfig.transferWidth = IfxDma_TransferWidth_16bit; dmaConfig.interruptEnabled = TRUE; IfxDma_initChannel(&dmaChannel, &dmaConfig);

这段代码看起来简单,但实际调试时可能会遇到各种问题。比如TOM的触发信号没有正确路由到ADC,或者DMA的源地址不对,导致搬运的数据全是0。这些问题需要结合寄存器手册和调试器一步步排查。

4.3 调试过程与验证方法

调试这套系统,我通常分三步走:先验证PWM输出,再验证ADC采样,最后验证DMA传输。

验证PWM输出最简单,用示波器直接量TOM通道的引脚。如果看不到波形,先检查引脚复用配置是否正确,再检查TOM通道是否使能,最后检查CMU时钟是否正常。我遇到过因为CMU时钟没使能,TOM计数器不工作,PWM输出一直是低电平的情况。排查了半天才发现是IfxGtm_Cmu_enableClocks函数没调用。

验证ADC采样,可以用调试器读取ADC结果寄存器,或者用DMA把数据搬到内存后查看。如果ADC结果一直是0或者满量程,先检查输入信号是否正常,再检查采样时间是否足够,最后检查触发信号是否到达。AURIX的ADC有个状态寄存器,可以查看转换是否完成、是否溢出,这些信息对排查很有帮助。

验证DMA传输,可以在DMA中断里翻转一个GPIO,用示波器看中断频率是否和预期一致。如果中断频率不对,检查DMA传输长度和ADC采样率是否匹配。如果DMA中断根本不触发,检查DMA通道是否使能、中断是否使能、传输完成标志是否清除。

我踩过的一个坑是:DMA传输完成后,中断标志没有清除,导致中断只触发一次。AURIX的DMA中断标志需要手动清除,通常在中断服务函数里调用IfxDma_clearChannelInterrupt。如果忘了这一步,第二次传输完成时中断不会再次触发,数据就停止更新了。这个bug很隐蔽,因为第一次中断是正常的,只有连续运行时才会暴露。

5. 常见问题与排查技巧实录

5.1 PWM输出异常排查

PWM输出异常通常表现为:无输出、频率不对、占空比不对、波形畸变。无输出先查引脚配置和时钟使能;频率不对查CMU分频和SR0值;占空比不对查CM0和CM1值;波形畸变查死区时间和负载情况。

有个特殊情况是PWM输出偶尔丢脉冲。这通常是因为CM0或CM1的值在运行时被修改,而修改时刻正好在计数器附近,导致比较匹配被跳过。解决方法是在修改占空比时,先停止PWM,改完再启动,或者使用TOM的影子寄存器,在周期结束时自动更新。AURIX的TOM支持影子寄存器,通过IfxGtm_Tom_Pwm_setDutyCycle函数修改占空比时,新值会在下一个周期生效,不会影响当前周期。

另一个常见问题是PWM输出和ADC触发不同步。表现为ADC采样值波动大,或者采样时刻偏移。这通常是因为触发路由配置错误,或者触发延迟没有补偿。AURIX的GTM有触发延迟补偿功能,可以在TOM_CH[x].CTRL寄存器里设置TRIGOUT的延迟周期数。如果ADC采样时刻需要精确对齐PWM中点,这个延迟补偿很重要。

5.2 ADC采样精度问题

ADC采样精度问题表现为:读数跳动大、非线性、温漂。跳动大通常是噪声耦合,解决方法包括:增加采样时间、加RC滤波、使用差分输入、远离开关噪声源。非线性通常是ADC本身的问题,AURIX的ADC线性度很好,如果出现非线性,先检查参考电压是否稳定。温漂通常是参考电压或信号源的问题,不是ADC本身的问题。

有个容易被忽略的点是ADC的输入阻抗。AURIX的ADC输入阻抗不是无穷大,在采样阶段会从信号源抽取电流。如果信号源内阻太大,采样电容充电不足,读数会偏小。解决方法是在信号源和ADC之间加电压跟随器,降低输出阻抗。我见过一个项目,用100kΩ的分压电阻直接接ADC,读数比实际值低了20%,加了运放跟随器后就准了。

5.3 DMA传输错误排查

DMA传输错误表现为:数据错位、数据丢失、传输停止。数据错位通常是传输宽度配置错误,比如源是16位、目标是8位,导致高低字节颠倒。数据丢失通常是DMA请求频率高于DMA响应速度,或者缓冲区溢出。传输停止通常是DMA中断标志没清除,或者DMA通道被禁用。

排查DMA问题,我通常用"二分法":先确认ADC是否正常产生DMA请求,再确认DMA是否正常响应请求,最后确认数据是否正确搬运到内存。确认ADC请求,可以看ADC的状态寄存器;确认DMA响应,可以看DMA的传输计数寄存器;确认数据搬运,可以对比源地址和目标地址的内容。

有个隐蔽的bug是DMA传输完成中断和ADC转换完成中断的优先级冲突。如果两个中断优先级相同,同时触发时可能丢失一个。AURIX的中断控制器支持优先级配置,建议把DMA中断优先级设得比ADC中断高,确保数据先搬运再处理。

5.4 常见问题速查表

问题现象可能原因排查方法解决方法
PWM无输出引脚未配置、时钟未使能、通道未启动查引脚复用、CMU使能、PWM启动状态配置引脚、使能CMU时钟、调用启动函数
PWM频率不对CMU分频错误、SR0值错误查CMU配置、计算SR0重新计算并配置
PWM占空比不对CM0/CM1值错误、影子寄存器未更新查比较寄存器值、更新时机修正比较值、使用影子寄存器
ADC读数跳动大噪声耦合、采样时间不足示波器看信号、增加采样时间加RC滤波、增加采样时间、差分输入
ADC读数偏小信号源内阻大、采样电容充电不足测量信号源内阻加电压跟随器、增加采样时间
DMA数据错位传输宽度不匹配查源和目标地址位宽统一传输宽度
DMA传输停止中断标志未清除、通道被禁用查中断标志、通道使能位清除中断标志、重新使能通道
ADC触发丢失触发优先级冲突、触发频率过高查触发配置、ADC状态调整优先级、降低触发频率

6. 性能优化与进阶技巧

6.1 降低CPU开销的方法

这套系统的CPU开销主要来自DMA中断处理。如果DMA中断太频繁,CPU大部分时间都在处理中断,主循环跑不动。降低中断频率的方法有两种:一是增大DMA缓冲区,二是使用DMA链表模式,让DMA自动切换多个缓冲区,CPU只在所有缓冲区都填满后才处理一次。

AURIX的DMA链表模式支持最多16个传输描述符,每个描述符可以指向不同的目标缓冲区。配置链表模式时,需要设置IfxDma_ChannelConfiglinkedList参数,指定下一个描述符的地址。链表模式适合大数据量采集,比如音频采样、振动分析等场景。

另一个降低CPU开销的方法是使用ADC的扫描模式,一次触发转换多个通道,DMA一次搬运多个通道的数据。这样触发频率不变,但每次搬运的数据量增加,中断频率不变,但数据吞吐量提高。扫描模式的配置需要在ADC的INPCR寄存器里设置扫描序列,DMA的传输长度要对应通道数乘以采样次数。

6.2 提高采样精度的技巧

提高采样精度,除了前面说的增加采样时间、加RC滤波、使用差分输入,还有一个技巧是使用ADC的过采样功能。过采样就是连续采样多次,然后求平均,可以提高有效分辨率。比如12位ADC过采样4次,有效分辨率可以提高到13位;过采样16次,可以提高到14位。AURIX的ADC支持硬件过采样,配置IfxAdc_Configoversampling参数即可。

过采样的代价是采样率降低。过采样4次,采样率降到原来的1/4。如果PWM频率是20kHz,过采样4次后ADC采样率还是20kSPS,但每个PWM周期只能采样一次,不能多次采样。如果需要在每个PWM周期采样多次,就要提高ADC时钟频率,或者减少过采样次数。

另一个技巧是使用ADC的自校准功能。AURIX的ADC支持自校准,可以消除偏移误差和增益误差。自校准通常在初始化时执行一次,配置IfxAdc_Configcalibration参数即可。自校准需要一定时间,通常在几毫秒到几十毫秒之间,初始化时等待校准完成即可。

6.3 系统扩展与多模块协同

这套系统可以扩展到多路PWM和多路ADC。比如三相电机控制需要6路PWM(三路高侧、三路低侧)和至少3路ADC(三相电流采样)。TOM0有16个通道,足够覆盖6路PWM;ADC0有8个通道,足够覆盖3路电流采样。DMA可以用一个通道搬运3路ADC数据,也可以用3个通道分别搬运。

多模块协同的关键是触发同步。三路PWM要严格同步,三路ADC要在同一时刻采样。AURIX的GTM支持全局触发,可以配置一个TOM通道作为主触发源,其他TOM通道和ADC都从主触发源同步。这样所有PWM和ADC都在同一时基下工作,不会出现相位偏差。

扩展时要注意资源冲突。CMU_CLK是全局资源,多个TOM通道共用同一个CMU_CLK时,频率必须一致。如果不同通道需要不同频率,就要分配不同的CMU_CLK。TC3xx的CMU有8个CLK,通常够用,但如果PWM频率种类太多,可能需要用DPLL或者外部时钟源。

我个人在实际操作中的体会是,这套系统最难的环节不是配置,而是调试。配置有手册可查,调试全靠经验和工具。我建议在调试时准备一个逻辑分析仪,可以同时抓PWM输出、ADC触发、DMA中断三个信号,一眼就能看出时序关系对不对。示波器只能看两路信号,逻辑分析仪可以看十几路,效率高很多。另外,AURIX的调试器支持实时查看寄存器,调试时把关键寄存器加到watch窗口,比打印日志快得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询