ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MCU定时器输入捕获:硬件时间戳实现高精度频率与PWM测量

MCU定时器输入捕获:硬件时间戳实现高精度频率与PWM测量 1. 输入捕获到底解决了什么问题比中断数边沿高明在哪1.1 从一次测不准的测速开始先讲一个我实际遇到的场景。客户那边有个电机测试台需要测风扇电机的转速传感器输出是一路霍尔脉冲转速范围大概在几百到几千转每分钟对应的脉冲频率大约是几十赫兹到十几千赫兹。刚开始我们用的是最朴素的办法外部中断每次上升沿进一次中断在中断里给一个计数器加一然后定时器每秒读一次这个计数器用每秒多少个脉冲来算转速。这个方案听起来没什么问题但真正跑起来就露馅了。电机不是匀速转的尤其在启动和负载变化的时候脉冲间隔是抖动的。一秒读一次数只能拿到平均频率拿不到当前这一刻的瞬时频率更拿不到每个脉冲的时间间隔。而且CPU不是只干这一件事它还要跑通信、要刷屏幕、要处理按键中断响应一旦被其他高优先级任务抢占上升沿对应的实际时间点就会发生偏移。更麻烦的是低频段比如信号只有1Hz你想测准至少得等1秒等完一个周期还不够得等两三个周期才算稳定这在现场调试里很难接受。后来我把思路换成了Renesas定时器的输入捕获功能。这一换问题基本消失。输入捕获不是软件去数边沿而是硬件在信号边沿到来的一瞬间自动把定时器当前的计数值锁存到一个捕获寄存器里同时产生一个中断通知CPU。CPU要做的只是去读这个锁存值两次捕获值之差就是信号间隔对应的定时器tick数。频率低的时候间隔长tick数大反而测得更准和中断计数法的思路正好互补。1.2 输入捕获的核心机制硬件帮CPU记时间戳很多人第一次接触输入捕获觉得它不过是一个可以读取当前计数器值的中断这个理解不够。它的精髓在于时间戳是由硬件在边沿发生的同一时刻打上的而不是由CPU在中断响应时再读取计数值。可以拿短跑计时打个比方。让一个人站在终点线看到运动员冲线时按秒表这个人从看到到按下是有反应延迟的而且每次延迟还不一样。输入捕获相当于在终点线上装了一台高速摄影机运动员冲线的瞬间摄影机自动记录帧号比赛结束后你想怎么回放就怎么回放。CPU不需要在边沿那一刻赶去读计数器只需要在方便的时候去摄影机里取帧号取到的时间戳依然是准确的。这个特性带来两个直接好处。第一测量精度不再受中断响应延迟影响只要定时器的时钟源稳定时间戳精度可以达到单个定时器tick的级别。第二CPU的负载大幅下降不需要为每一个边沿都做精确计时操作只是被通知事件发生了你去取数据。输入捕获适合的场景我从实际项目里总结下来主要有这么几类脉冲频率测量、周期测量、PWM信号的脉宽和占空比解码、红外遥控信号解析、电机测速、流量计脉冲计量甚至可以用来测量两个外部事件之间的相位差。这些场景都有一个共同特点外部信号表达了时间信息需要精确捕获。1.3 Renesas各家定时器在捕获上的差异Renesas的MCU产品线很多不同系列能用于输入捕获的定时器外设名称不一样但思路是一致的。以我常用的几类为例RA系列通用PWM定时器缩写是GPTGeneral PWM Timer还有低功耗的AGTAsynchronous General Purpose Timer。GPT是主力通道多、位数可选16/32位支持输入捕获也支持正交编码器计数。RL78系列用定时器阵列单元TAUTimer Array Unit每个单元里有多个通道可以灵活配置成输入捕获、输出比较、PWM输出等不同工作模式。RX系列主要有MTU和TPU功能更复杂支持相位计数和多种触发源。不要被这些缩写吓到它们的核心逻辑都是一样的定时器有一个自由运行的计数器外部信号边沿触发捕获锁存CPU读捕获寄存器做差值计算。换系列只是换一套寄存器名和配置工具而已。我后续章节会以RA系列GPT为主来展开因为这个系列现在用得多FSP图形化配置工具也比较成熟配置过程容易复现。但我会在关键地方把通用原理讲透你拿到RL78或者RX上一样能套用。2. RA系列GPT定时器的捕获通道与触发边沿配置2.1 先认清GPT的时基与计数器结构在配置输入捕获之前我建议你先分清楚两件事谁是跑表谁负责按表。GPT定时器里的计数器就是跑表它在时钟源驱动下持续走数可能从0加到周期值然后清零也可能在周期值附近来回递减计数。输入捕获逻辑负责按表它在检测到外部边沿时把当前计数值锁存到捕获寄存器。这里有一个很容易忽略的点输入捕获本身不产生时间基准时间基准来自计数时钟。计数时钟 定时器输入时钟PCLK ÷ 分频系数。比如PCLK是60MHz分频系数设为8那么计数器每走一格的时间就是8/60MHz大约133ns。这就是整个测量的时间分辨率。分辨率越高算出来的时间间隔越精确但代价是计数器走得更快溢出得更频繁。假如你选择了32位计数模式计数器最大值是0xFFFFFFFF以133ns每tick计算需要大约572秒才溢出一次绝大多数测量场景根本不用担心溢出。但如果选择了16位模式最大值只有65535大约8.7ms就翻转一次高频信号没问题低频信号就必须要处理溢出计数。我做项目的时候一般会先根据待测信号范围预估一下再用下面这个表格来决定位数和分频计数时钟频率分辨率16位最大可测间隔32位最大可测间隔60 MHz16.7 ns1.09 ms71.5 s7.5 MHz133 ns8.73 ms572 s1 MHz1 μs65.5 ms4295 s100 kHz10 μs655 ms12.1 h简单说测量1kHz左右的信号用32位、分频8能直接拿到非常干净的结果如果只要测几十kHz的高速PWM16位就够用关键是处理好溢出。先把这个基础打好配置捕获才不会一头雾水。2.2 边沿选择、捕获寄存器与FSP配置的对应关系在e2 studio里新建一个RA项目之后配置输入捕获的入口在FSP的Stacks页面。添加一个Timer驱动一般是General PWM Timerr_gpt然后在属性里做关键设置。我常用的配置项如下Mode选择Input CaptureInput source选择GTIOC0A或GTIOC0B引脚Capture control选择上升沿、下降沿或者双沿捕获Match/Capture Register选择GTCCR[0]或GTCCR[1]Interrupts打开Capture Interrupt这里的GTCCR[0]和GTCCR[1]就是前面说的捕获寄存器。有些应用里两个寄存器可以配合使用比如一个捕获上升沿、一个捕获下降沿这样就能在同一个定时器上同时拿到周期和高电平时间。但注意FSP不同版本对双寄存器捕获界面不太一样有的版本直接支持同一个输入源的两类边沿分别捕获有的版本需要你另想办法。我后面会在PWM解码那一节展开两种可落地的方案。配置完FSP后记得在Pin Configuration里把对应的GTIOC0A或GTIOC0B引脚分配到实际的物理引脚上。这一步经常被忽略因为FSP里驱动配置和引脚分配是两套界面驱动配好了但引脚没分配代码生成的初始化里就不会把这个引脚切换成定时器复用功能信号根本进不了定时器。2.3 引脚映射与中断请求配置时容易漏掉的一环引脚映射出问题表现很隐蔽。表面上看程序初始化没有报错调用定时器的Open和Start也都返回正常但示波器上明明有波形输入捕获中断就是一次都不触发。我在刚接触RA的时候在这个问题上栽过跟头后来养成一个习惯每次配置完驱动先去生成的pin_data.c里确认一下引脚复用寄存器有没有被设置或者直接在FSP的Pins页面搜索GTIOC0A看到它被分配到一个具体的Pxxx引脚且标成了定时器复用功能才算真正完事。中断这一环同样重要。FSP会把捕获中断回调函数绑定到你配置的事件上回调函数里判断事件类型然后读取捕获值。我建议在中断处理里只做三件事读取捕获寄存器、更新软件保存的上一次捕获值、设置一个标志位告诉主循环有新数据了。不要在回调里做除法算频率更不要直接调用打印函数或者去操作屏幕。原因很简单中断上下文里做事越少越不容易出现高优先级中断嵌套和资源竞争的问题。读取捕获值的具体方式可以在回调里直接读取GPT的寄存器也可以通过FSP提供的状态查询接口拿数据。这里我多说一句如果你在回调里读完捕获值之后还要重新读取当前计数器一定要清楚两个值不是同一个时刻的快照一个是边沿发生时的锁存值一个是你读到它那一刻的实时值用途完全不同。3. 用频率测量实战从一千行中断代码到一行API3.1 先把目标和误差预算定下来不要一上来就配定时器先想清楚你的指标。我那次做电机测速客户要求频率范围1Hz到50kHz误差控制在0.1%以内响应时间最好在100ms级别。这个指标如果沿用每秒计数法1Hz附近几乎不可能达标因为等一个脉冲就要1秒而且单个计数的量化误差在低频时会被放大。但输入捕获的周期法在低频段反而有优势信号越慢单个周期内包含的tick数越多量化误差越小。量化误差的来源是两个捕获值做差而这个差值可能恰好差了一个tick。假设计数时钟7.5MHz待测信号1kHz一个周期对应7500个tick一个tick的误差折算成频率误差大约是0.013%远好于0.1%的目标。如果是50kHz一个周期只有150个tick单tick误差大约0.66%超了。这时候需要换个思路不再测单个周期而是测多个周期的累计时间比如连续捕获100个周期时间戳差值对应100个周期等效误差缩小到原来的1/10050kHz时也能降到0.0066%以内。这个多周期累测法是输入捕获在高频段保持高精度的常用手段。除了量化误差还要考虑时钟源本身的精度。Renesas MCU内部高速振荡器的精度通常在1%~2%量级如果客户要求0.1%的测量准确度建议外部接晶振或者至少用FSP里校准过的PLL输出。时钟源是基准的基准基准偏了后面测什么都是偏的。3.2 e2 studio FSP配置过程周期捕获模式具体到配置步骤我习惯这样操作在e2 studio中新建RA工程选择对应型号的MCU。打开FSP配置界面在Stacks里添加Timer驱动选择r_gpt。把GPT模块的Mode设为Input Capture输入源选GTIOC0ACapture control选Rising Edge捕获寄存器选GTCCR[0]打开Capture Interrupt。到Pins页面找到GTIOC0A分配到一个实际引脚并确认复用功能为GPT。点击Generate Project Content生成代码。生成完代码主函数里调用定时器的Open和Start接口。这个启动过程比我最早用寄存器操作时简洁太多了最早在RL78上我都是直接操作TMR、TSR这些寄存器现在FSP把这些包好了配置一次就能复用。配置完成后先在信号发生器上验证。我一般会接一个精准的方波信号比如1kHz然后在回调函数里把捕获差值打印出来。如果读到7500个tick说明计数时钟确实是7.5MHz整个链路从引脚到寄存器都通了。这一步验证别省它能帮你把配置问题和算法问题隔离开。3.3 回调函数里如何处理溢出计数避免测出来只有几kHz这里必须要讲溢出计数因为这是输入捕获项目里最容易翻车的细节。假设你配置的是16位计数模式最大计数值65535一个低频信号周期内计数器翻转了好几次。如果你只取两次捕获值直接做差结果会是一个很小的数算出来的频率可能虚高好几倍。比如实际信号是100Hz计数时钟7.5MHz一个周期是75000个tick已经超过16位上限计数器翻转了一次。如果直接算差值可能只有9465个tick算出来频率大约是792Hz完全不对。解决方法是让定时器在溢出时也产生中断软件里维护一个溢出计数器。两次捕获之间真实经过的tick数等于当前捕获值与上次捕获值之差再加上溢出次数乘以定时器的计数周期。伪代码大概是这样的volatile uint32_t g_capture_value; volatile uint32_t g_last_value; volatile uint32_t g_overflow_count; volatile uint32_t g_delta_ticks; volatile bool g_data_ready; void gpt_capture_callback(timer_callback_args_t * p_args) { if (TIMER_EVENT_CAPTURE p_args-event) { uint32_t current 读取当前捕获寄存器的值; g_delta_ticks (current - g_last_value) (g_overflow_count * (定时器周期值 1)); g_last_value current; g_overflow_count 0; g_data_ready true; } else if (TIMER_EVENT_CYCLE_END p_args-event) { g_overflow_count; } }这段代码示意了核心思路具体的事件宏和结构体名称不同FSP版本可能不同你以当前生成代码为准。有一点必须注意溢出计数器清零必须在读取完当前捕获值之后进行。如果先清溢出计数再读捕获值中间一旦发生溢出就丢了一个周期计算出的时间会明显偏短。另外还有一个顺序问题如果捕获中断和溢出中断同时挂起最好把捕获中断优先级设得比溢出中断高或者在捕获事件处理时先检查溢出标志。因为捕获值是边沿瞬间的锁存值而溢出计数只是一个辅助变量丢了辅助变量最多算错一次但丢了捕获值就完全没法补。3.4 频率换算公式和一组实测数据有了delta_ticks之后频率换算公式非常简单周期秒 delta_ticks ÷ 计数时钟频率Hz频率Hz 1 ÷ 周期 计数时钟频率 ÷ delta_ticks我曾经在信号发生器上做过一组实测配置是PCLK60MHz、分频8、计数时钟7.5MHz32位计数模式结果如下信号发生器设定捕获delta_ticks实测频率误差100 Hz75000100.000 Hz0.01%1 kHz75001.000 kHz0.01%10 kHz75010.000 kHz约0.01%50 kHz15050.248 kHz约0.5%50kHz那档误差偏大原因就是单周期tick数只有150单个tick的量化误差占比被放大了。如果在这个频率范围做多周期累测或者把计数时钟提高误差还能压下去。实测结果也验证了一个核心观点输入捕获测低频是天然优势测高频需要靠多周期技术或更高频时钟来补偿。不要只看绝对误差还要关注误差是不是稳定如果每次测量结果忽大忽小那通常是噪声引起的误捕获而不是量化误差。量化误差的方向是固定的、可预测的误捕获则是随机的。4. 进阶脉宽、占空比与PWM信号的完整解码4.1 单通道时间戳如何还原完整波形只用上升沿捕获能测周期但拿不到高电平时间。要还原一个PWM波形必须把上升沿和下降沿都当成有意义的时间戳记下来。假设你捕获到了一串事件t1上升沿、t2下降沿、t3上升沿、t4下降沿……那么高电平时间 t2 - t1周期 t3 - t1占空比 (t2 - t1) ÷ (t3 - t1)关键不在于单次计算而在于维护一个边沿事件流。每次捕获中断到来你在软件里记下这个事件的边沿类型和对应的计数值然后放入环形缓冲。主循环不断消费这个缓冲计算当前周期和高电平时间。这种设计把实时性要求较高的捕获和实时性要求不高的解析分开了代码结构也更清晰。我见过不少新手把所有逻辑都塞进中断里中断里读捕获值、判断边沿、算脉宽、更新全局变量。短期跑起来没问题一旦信号频率变高或主程序加入其他操作中断执行时间过长就会覆盖捕获寄存器。正确的做法是中断只做记录把时间戳和边沿类型写进环形缓冲解析交给主循环。4.2 双通道同时抓上升沿和下降沿的两种方案在RA的GPT上要同时捕获上升沿和下降沿我有两种做法。第一种做法如果FSP版本和MCU型号允许同一个GPT的两个捕获寄存器分别配置为上升沿和下降沿就用GTCCR[0]捕获上升沿、GTCCR[1]捕获下降沿。这样每个边沿事件来了之后你只需要看哪个寄存器产生了捕获触发就知道当前是上升沿还是下降沿非常直观。第二种做法如果型号不支持上述配置或者你不想和FSP版本较劲那就用两个定时器通道或者干脆用两个GPT一个配置成上升沿捕获一个配置成下降沿捕获然后把两路输入引脚在外部短接到同一个测试点。这种方法看起来有点笨但逻辑非常清晰两个通道各自产生各自的中断互不干扰。我早期在RL78上就经常这样干因为TAU的每个通道配置非常灵活多开一个通道的成本很低。不管用哪种方案都要注意时间戳的同一坐标系问题。两路通道必须使用同一个时钟源和同一个分频系数否则上升沿和下降沿的tick标准不一致算出来的脉宽毫无意义。简单说两路定时器的时基必须对表。4.3 应用实例读取遥控器PWM信号PWM解码是我觉得最适合作为输入捕获入门练习的场景因为信号周期是毫秒级别调试时用示波器很容易验证。常见的遥控器PWM信号周期约20ms高电平脉宽在0.5ms到2.5ms之间不同脉宽对应不同通道值或按键值。用输入捕获实现时我这样安排配置定时器为输入捕获模式捕获上升沿和下降沿。捕获中断里记录当前事件边沿类型捕获值写入环形缓冲。主循环从缓冲区取数据判断若当前事件是下降沿、上一事件是上升沿则高电平 当前tick - 上一tick。若当前事件是上升沿再往前找上一个上升沿周期 当前tick - 上一个上升沿tick。算出高电平时间后对照协议判断脉宽落在哪个区间完成解码。实际操作中要注意一个细节遥控器信号不是一直存在的可能只在按下按键时出现几个脉冲。如果程序在信号消失后还拿着最后一次的周期和脉宽去控制输出就会出现手已经松了电机还在转的问题。解决办法是做一个超时判断如果在超过一个周期加冗余量比如25ms的时间内没有收到新的上升沿就认为信号丢失输出回落到安全状态。4.4 抖动、毛刺与软件滤波的取舍PWM信号在长线传输或靠近功率器件时边沿处很容易叠加毛刺。毛刺一旦被输入捕获识别成有效边沿计算结果会异常离谱。我处理这个问题时通常从硬件和软件两个层面一起解决。硬件上最简单有效的是在输入引脚串联一个小电阻再接一个对地电容构成RC低通滤波器。RC的截止频率要远高于信号最高频率但又要低于毛刺的频率。比如电机测速信号最高2kHz毛刺在几十MHz量级那么截止频率取几十kHz是合理的。我当时用的是330Ω串联电阻加10nF对地电容截止频率大约48kHz对2kHz信号几乎没有影响但能有效吸收高频毛刺。这个电阻和电容取值要根据实际信号调整不能无脑抄。软件上不要对单个边沿的绝对值过分信任。可以做一个状态机只有当信号连续多个周期都满足合理范围周期接近20ms、高电平在0.5ms到2.5ms之间才认为PWM信号有效。这个思路类似一个N次确认机制牺牲几十毫秒的响应时间来换取可靠性在很多项目里是可接受的。还有一点RC滤波会稍微改变边沿位置让上升沿和下降沿都延后一点。如果只测周期影响基本可以忽略但如果要测非常精确的相位差或脉宽就必须考虑这个延迟最好在软件里做补偿或者选用截止频率更高的滤波参数把延迟压到不影响精度的程度。5. 我在实际项目中踩过的几个坑溢出、噪声与引脚冲突5.1 捕获寄存器被覆盖导致数据不连续有一段时间我测低频信号一切正常但把信号源调到20kHz以上之后偶尔会出现一次频率跳变跳变的幅度很大比如从20kHz一下变成40kHz。这种问题最折磨人因为偶尔复现不太好抓。后来用逻辑分析仪对比中断触发时序才明白20kHz信号间隔是50μs而我的捕获中断里做了太多事情包括读取寄存器、做差值、更新全局变量、还往环形缓冲里写数据整个中断处理时间超过50μs导致下一次捕获事件到来时捕获寄存器已经被新值覆盖旧值根本没来得及被CPU取走。解决思路有两个方向。第一个方向是压缩中断处理时间中断里只做最小操作把复杂的解析全部挪到主循环。第二个方向是降低捕获事件频率如果不需要测量每一个脉冲可以配置成每N个脉冲触发一次捕获或者用分频后的低频信号去测量。第三个方向是更高阶的玩法利用Renesas的DTC数据传输控制器或DMA把捕获寄存器里的值自动搬运到内存缓冲区完全不需要CPU在中断里去读寄存器。这种方式在高速输入捕获场景里非常有用但配置起来比普通中断复杂一些需要仔细看外设手册。建议做项目前先算一笔账待测最高频率对应当前捕获寄存器最快多久被覆盖一次然后估算中断处理时间是否来得及。如果来不及优先用DTC。5.2 外部干扰导致误捕获如何用硬件和软件双重抗扰环境干扰导致的误捕获我在电机调速项目里遇到过最典型的例子。电机驱动器一启动输入捕获的中断频率突然暴增测出来的频率变成几十甚至是几百兆赫一看就知道是假数据。干扰的来源很直接电机驱动线上的大电流跳变通过空间耦合到了霍尔传感器的长线上在脉冲边沿附近叠加了很多振铃和毛刺。输入捕获电路对边沿非常敏感每一个超过阈值的毛刺都像是一个合法边沿硬件根本分不清真假。硬件上我给传感器输出线加了RC滤波又把线换成屏蔽线屏蔽层单端接地情况改善了很多。软件上我写了一个保护逻辑每个采集周期里如果发现高频异常比如频率超过设定上限的1.5倍就把这组数据丢弃并启动连续确认机制只有连续N个周期都在合理范围内才更新输出。这两层防护叠加之后干扰问题才算彻底压住。我个人的体会是硬件抗干扰永远比软件抗干扰更靠前。软件能做的是识别并丢弃坏数据但如果毛刺密度太高好数据也会被淹没这时候再好的软件滤波也无法挽回。先让进入引脚的信号尽量干净再用软件做最后一道防线才是可靠的做法。5.3 时钟源与分频系数选错测出来整体偏移还有一种特别容易被忽略的问题测出来的频率整体偏移比如信号发生器输出精确1kHz程序显示1.049kHz。这个偏差不多不少很难一眼定位但恰好说明不是随机干扰而是系统性的比例误差。我把整个链路排查了一遍最后发现问题出在定时器时钟源上。项目里之前有人改了FSP里的PLL配置把外设时钟PCLK从60MHz改成了其他频率但GPT的分频系数还是按原来的配导致实际计数时钟和我在代码里用于换算的数值不一致。计时用的时基本身不准后面所有测量自然全偏。排查这类问题时千万不要盯着捕获代码死磕先用调试器确认外设时钟的实际频率。我的习惯是程序里不写死换算用的时钟频率而是定义成一个宏并且在一开始用一个已知的信号源做一次校准反推出来实际的计数时钟频率再填进去。这样即使FSP配置被别人改过只要校准一次也能快速发现问题。如果你手里的MCU支持从某个引脚输出时钟信号也可以用示波器直接测定时器时钟这个办法最直观能直接看到分频之后实际是多少MHz。6. 输入捕获和输出比较是怎么配合的以及我的一些心得6.1 用GPT同时做捕获与输出实现简单的频率跟踪闭环输入捕获负责读外部事件的时刻输出比较负责在软件设定的时刻翻转引脚。一个是记录时间一个是安排时间两者放到同一个定时器上就能形成一种闭环能力。我举个实际例子。如果你想让MCU产生一个和外部输入频率同步的PWM传统做法是外部信号进中断CPU算好周期再去改PWM的周期寄存器。这个链路里存在中断延迟和计算延迟同步精度受限。但如果把输入捕获放在一个定时器通道上把PWM输出放在另一个通道上两个通道共用同一个时基那么捕获事件得到的周期变化可以直接用于刷新输出通道的周期设置硬件关系更紧密同步效果也更稳定。RA系列的GPT通道数量较多很适合这种一个捕获通道一个输出通道的组合。不过要注意不同MCU的GPT内部通道之间是不是完全独立还是要共用一个周期寄存器需要翻一下具体型号的手册。我见过有人默认所有通道都独立结果配置完后发现改一个通道的周期把另一个通道也带偏了这种坑属于手册没读透型。6.2 选型建议和下一步可以试的方向如果你要新做一块板子选定时器时可以参考我这几个经验只做低频PWM解码或红外遥控16位定时器够用不必追求32位。需要长时间测量低频信号或者希望分频系数不用那么激进优先选32位计数模式。低功耗场景RA系列的AGT可以在深度睡眠模式下工作用AGT做输入捕获能让MCU大部分时间休眠只在有信号边沿时唤醒。如果信号频率很高一定要确认MCU的输入捕获事件能否触发DTC把捕获值自动搬进内存这种能力在高速场景下比单纯提高中断优先级靠谱得多。下一步想进阶的话我建议试试用输入捕获做两路信号的相位差测量。思路是在两个输入通道上分别捕获周期信号然后比较两个通道捕获值的相位偏差再换算成角度。这个能力在电机控制、并网逆变器这类项目里很实用。另外RA系列部分GPT还支持正交编码器计数模式它和输入捕获本质上是同一个硬件外设的两种姿势理解了边沿捕获编码器计数也就通了。最后说点实在的。做了这么多次定时器输入捕获我最大的感受是不要上来就死磕寄存器先问自己三个问题——待测信号的范围是多少需要的误差是多少中断和DTC之间怎么选想明白这三个问题配置自然就顺了。输入捕获说到底是给外部信号的状态变化打硬件时间戳你只需要把时间戳处理得够快、够稳、够连续剩下的测量和解析都是算术题。我至今还保留着当初在评估板上验证输入捕获时的测试程序每次换一个新系列芯片第一件事就是把跑表跑起来用信号发生器测一个1kHz方波。这就像一个冒烟测试能把引脚配置、时钟配置、中断链路、寄存器读取这些小问题一次性暴露出来比任何复杂的调试手段都高效。
返回列表