基于Kinetis L与LC传感器的超低功耗旋转编码器设计

📅 2026/6/30 13:07:50
基于Kinetis L与LC传感器的超低功耗旋转编码器设计
1. 项目概述与核心价值在电池供电的嵌入式传感领域功耗是决定产品寿命和可靠性的生死线。无论是水表、燃气表还是工业现场的旋转监测设备我们常常面临一个矛盾系统需要持续感知外部物理量的变化但又必须将平均电流控制在微安级别以确保一颗电池能工作数年甚至十年。传统的解决方案比如让MCU周期性唤醒进行采样虽然简单但每次唤醒-采样-休眠的循环本身就会带来可观的功耗开销尤其是在需要较高采样率以捕捉快速变化时。几年前我在设计一款用于农业灌溉的电池供电流量计时就遇到了这个经典难题。我需要一个能够精确测量低速桨轮旋转低至每秒几转的编码器同时整机平均电流必须低于20微安。机械式编码器有磨损和接触问题光电式编码器在浑浊水质中容易失效而霍尔传感器则需要磁铁且功耗不易做得很低。最终我选择了一条相对“复古”但极其有效的技术路径基于LC电感-电容谐振传感器的非接触式检测方案并搭配飞思卡尔现恩智浦Kinetis L系列MCU来实现。这个方案的核心魅力在于其“静默的智能”。MCU的CPU绝大部分时间处于深度睡眠状态VLPS模式而系统的“眼睛”和“耳朵”——由定时器、比较器和DMA直接内存访问组成的外设“自治联盟”——却在有条不紊地工作。它们自主完成对LC传感器振荡信号的激发、采样和判决并将结果存入内存只在积累足够数据后才轻轻唤醒CPU进行简单的数据处理。这种架构将动态功耗几乎全部转移给了本身功耗极低的外设实现了“鱼与熊掌兼得”高精度的连续监测与极低的平均功耗。本文将详细拆解这个基于Kinetis L MCU与LC传感器的低功耗旋转编码器设计。我会从LC传感器的物理原理讲起逐步深入到硬件电路设计、MCU外设的“无CPU干预”协同配置、软件状态机流程最后分享实测的功耗数据与调试中踩过的坑。无论你是正在开发低功耗传感节点的工程师还是对MCU外设高级应用感兴趣的学习者相信这个完整的案例都能给你带来切实的启发和可直接复用的经验。2. LC传感器测速原理与正交编码器构建2.1 涡流效应与LC振荡阻尼检测LC传感器的物理基础是涡流效应。当我们用一个电感和一个电容组成并联谐振电路LC谐振腔并给予一个瞬时激励时电路会以其谐振频率开始自由振荡。这个振荡的幅度会随时间衰减衰减的速度主要由回路中的等效串联电阻决定这被称为阻尼。关键点来了如果在这个振荡的线圈电感L附近放置一块导电材料如铝片根据法拉第电磁感应定律变化的磁场会在导体中感应出涡流。这个涡流会产生一个与原始磁场方向相反的磁场其效果相当于在LC回路中引入了一个额外的电阻。这会显著增加振荡的阻尼使振荡幅度衰减得更快。因此我们可以通过检测LC振荡衰减的快慢来判断导体是否靠近传感器。这就是非接触式检测的基石。在实际设计中我们通常不直接分析复杂的衰减波形而是采用一种更工程化的方法在激励脉冲结束后一个固定的、很短的时间点例如30微秒后去测量LC回路上的电压。如果此时电压高于某个阈值说明振荡衰减慢导体远离如果电压低于阈值说明衰减快导体靠近。这个阈值电压通常由MCU内部的比较器DAC数模转换器产生。2.2 从单点检测到正交旋转编码单个LC传感器只能检测“有”或“无”即导体是否经过其正前方。要测量旋转包括速度和方向我们需要至少两个传感器并让它们以特定的空间关系排列。最经典的方法是构建一个正交编码器。具体做法如下将一个圆盘附着在旋转轴上的一半覆盖上导电材料如铝箔另一半保持绝缘。将两个完全相同的LC传感器线圈L1和L2并排放置在圆盘边缘附近两者中心线相距90度即1/4个圆周。圆盘旋转时导电部分会依次扫过两个传感器。这样两个传感器输出的信号将是两路存在90度相位差的方波理想情况下。这两路信号被称为正交信号。通过分析这两路信号的跳变顺序A相领先B相还是B相领先A相我们可以判断旋转方向顺时针或逆时针。通过统计信号跳变的次数我们可以计算旋转的角度和速度。注意线圈的几何形状、与导体的距离、导体的厚度和电导率都会影响检测的灵敏度和一致性。在实际制作时需要反复调整这些参数并通过实验确定一个稳定的检测阈值。通常线圈直径略大于导体覆盖的扇区宽度能获得较好的信噪比。2.3 采样率与转速的数学关系由于LC传感器需要周期性激励和采样这是一个离散采样系统。为了保证不丢失旋转信息采样率必须满足奈奎斯特采样定理。对于正交编码最坏的情况是当导电边缘恰好停在两个传感器中间时任何一个传感器的状态变化都发生在一个采样周期内。因此最小安全采样频率f_sample与最大待测旋转速度N_max转/秒以及传感器数量n_sensors本例中为2满足以下关系f_sample 4 * n_sensors * N_max例如如果流量计桨轮的最大转速为40转/秒那么最小采样率应为4 * 2 * 40 320 Hz。这意味着系统需要每秒对每个传感器进行至少320次采样。在实际项目中我通常会留出50%以上的余量将采样率设置为500Hz以应对转速波动和机械抖动。3. 硬件系统设计与关键电路剖析3.1 核心控制器Kinetis L系列MCU的选型考量我选择的是Kinetis KL46Z256它是Kinetis L系列中一款具有代表性的超低功耗ARM Cortex-M0内核MCU。其在此项目中的核心优势在于超低功耗模式支持VLPSVery Low Power Stop模式在此模式下CPU和大部分时钟停止但部分外设如LPUART、LPTimer、DMA可由32kHz低速时钟驱动继续工作功耗仅约2.8μA。丰富的外设具备多个低功耗定时器TPM、模拟比较器CMP带可编程DAC、以及灵活的DMA控制器。这些外设是构建“自治”传感系统的硬件基础。内存与封装256KB Flash和32KB RAM对于本应用绰绰有余QFN封装节省空间适合小型化设计。3.2 LC传感器驱动与信号调理电路单路LC传感器的完整电路如图4所示它是整个系统的“前线哨所”。我们来分解其工作流程谐振与激励单元核心是电感L1例如470μH和电容C2例如68pF组成的并联谐振电路。其谐振频率f_res 1 / (2π√(L1*C2))计算下来约150kHz。这个频率需要仔细选择太高则辐射干扰大且对寄生参数敏感太低则衰减时间过长影响采样速率。150kHz是一个折中的选择在30us的测量窗口内大约有5个振荡周期足以分辨阻尼差异。受控激励开关NMOS晶体管Q1如BSS123作为电子开关控制VDD是否对LC谐振腔充电。其栅极由三输入与门74HC11控制。与门的三个输入分别是传感器使能信号TPM1_CH0来自定时器1用于在多传感器系统中选通当前待测传感器关闭其他传感器以省电。激励脉冲信号TPM0_CH1来自定时器0产生一个固定宽度的逻辑高电平脉冲例如基于32kHz时钟的30us。RC短脉冲信号由R2和C1组成的RC电路产生。当TPM0_CH1上升沿到来时通过R2给C1充电与门输出立即变高打开Q1LC电路开始充电。当C1电压充电至约VDD/2时与门输出变低关闭Q1。这个RC时间常数τ R2 * C1例如6us决定了实际施加到LC回路上的激励脉冲宽度。这个时间远小于TPM0_CH1的30us目的是用更短的时间对LC回路注入能量进一步降低功耗。包络检波电路由二极管D1、电阻R3和电容C3组成。LC回路自由振荡的高频信号经过此电路后被转换为缓慢变化的直流电压即包络线。C3的容值如0.047μF决定了包络线的平滑程度和时间常数需要与采样时间窗口匹配。3.3 低功耗电源管理技巧在原理图中有几个细节体现了极致的低功耗设计思想传感器电源独立控制J6LC传感器线圈的供电VDD_COIL可以通过跳线J6完全断开。在不需要测量或传感器故障时彻底切断其电源消除静态漏电。逻辑电路脉冲供电J8给电压分压器和与门74HC11供电的VDD_TPM可以通过J8选择来自主3.3V或来自TPM0_CH2引脚。选择后者时可以利用TPM0_CH2输出一个与测量同步的脉冲信号仅在测量的极短时间内给这部分逻辑电路供电其他时间使其断电这能节省可观的静态电流74HC11的静态电流在微安级。实操心得在PCB布局时必须将模拟的LC传感器部分与数字的MCU部分进行良好的隔离。我的做法是使用独立的电源层或分割地平面传感器电路的地通过单点连接到MCU的模拟地AGND。同时为LC谐振回路提供干净、低噪声的电源必要时可增加一个LC或RC滤波。否则数字电路的开关噪声极易耦合到敏感的模拟检测信号中导致比较器误触发。4. 基于外设自治的低功耗传感系统配置这是本设计的精髓所在如何让MCU在沉睡VLPS模式时外设们能自动完成所有传感工作。4.1 系统状态机与DMA的巧妙运用整个自动采样过程由一个由定时器触发、DMA执行的硬件状态机完成CPU完全不参与。其时序如图5和图6所示我们分解为三个步骤对应三个DMA通道步骤1启动测量与传感器选通DMA通道0触发源定时器TPM0的通道1比较匹配事件TPM0_CH1。该事件会同时产生一个30us的高电平脉冲到传感器电路。DMA动作DMA通道0被触发执行一次2字节的传输。第一字节从内存传输到比较器DAC数据寄存器CMP0_DACDAT。这个操作完成了两件事a) 使能CMP内部DACb) 设置DAC的输出电压即后续比较的阈值电压。第二字节从内存传输到比较器多路选择寄存器CMP0_MUXCR。这个操作将比较器的正输入端CMP连接到当前要测量的传感器如Sensor 0的包络输出引脚CMP0_IN1负输入端CMP-连接到内部DAC的输出。效果硬件自动完成了“选择传感器A” - “设置比较阈值” - “启动比较器”这一系列操作。同时TPM0_CH1的引脚输出高电平通过前述的与门和RC电路给LC传感器一个短暂的激励脉冲。步骤2采样判决与数据存储DMA通道1触发源定时器TPM0溢出事件TPM0_OVF。这个事件发生在TPM0_CH1脉冲结束之后预设的采样时间点例如激励开始后30us。DMA动作DMA通道1被触发执行一次1字节的传输。将比较器输出状态寄存器CMP0_SCR中的一个特定状态位如COUT读取出来并传输到预先定义好的RAM数组中的下一个位置。效果在LC振荡衰减到稳定时刻硬件自动读取比较结果1表示包络电压高于阈值导体远0表示低于阈值导体近并存入内存。这个结果是离散的0或1。步骤3关闭比较器以省电DMA通道2触发源DMA通道1传输完成事件。这是一个DMA链式触发。DMA动作DMA通道2被触发执行一次2字节的传输。第一字节传输一个特定值到CMP0_DACDAT寄存器关闭内部DAC。第二字节传输一个特定值到CMP0_MUXCR寄存器将比较器的正负输入端连接到同一个无效的引脚例如都连接到CMP0_IN0。根据Kinetis L的设计这样操作会自动关闭比较器模块。效果在一次测量完成后立即关闭耗电的模拟模块DAC和比较器将动态功耗降到最低。直到下一个测量周期开始再由DMA通道0重新开启。传感器切换另一个定时器TPM1的两个通道CH0和CH1被配置为输出相位相反、周期为两倍采样周期的PWM波。它们分别控制两个传感器前级与门的“使能”端。这样DMA通道0每次设置的CMP_MUX通道和TPM1的输出同步就能实现两个传感器的交替测量。4.2 关键外设初始化代码要点以下是用C语言进行外设初始化的核心片段基于Kinetis SDK或寄存器直接操作。这里着重说明配置逻辑// 1. 时钟配置切换到32.768kHz低功耗晶振LPO作为总线时钟源 // 目的是在VLPS模式下为TPM、DMA等外设提供运行时钟同时功耗最低。 SIM-SOPT1 ~SIM_SOPT1_OSC32KSEL_MASK; SIM-SOPT1 | SIM_SOPT1_OSC32KSEL(2); // 选择LPO 32kHz // ... 其他时钟树配置确保MCG进入BLPI模式核心时钟停用总线时钟使用LPO // 2. 定时器TPM0/TPM1配置 // TPM0用于产生采样周期和激励脉冲 TPM0-MOD 32768 / SAMPLING_RATE; // 设置模值决定采样频率 TPM0-CONTROLS[1].CnSC TPM_CnSC_MSB_MASK | TPM_CnSC_ELSB_MASK; // CH1 输出比较高电平有效 TPM0-CONTROLS[1].CnV 1; // 比较值决定脉冲宽度以32kHz时钟周期计 TPM0-SC TPM_SC_CMOD(1) | TPM_SC_PS(0); // 分频器为1启动TPM时钟源为总线时钟 // TPM1用于交替使能两个传感器 TPM1-MOD (32768 / SAMPLING_RATE) * 2; // 周期是TPM0的两倍 TPM1-CONTROLS[0].CnSC TPM_CnSC_MSB_MASK | TPM_CnSC_ELSB_MASK; TPM1-CONTROLS[0].CnV (32768 / SAMPLING_RATE) / 2; // 50%占空比 TPM1-CONTROLS[1].CnSC TPM_CnMSB_MASK | TPM_CnSC_ELSA_MASK; // CH1 输出比较低电平有效 TPM1-CONTROLS[1].CnV (32768 / SAMPLING_RATE) / 2; TPM1-SC TPM_SC_CMOD(1) | TPM_SC_PS(0); // 3. 比较器CMP配置主要靠DMA动态配置此处仅作基础初始化 CMP0-CR0 CMP_CR0_FILTER_CNT(1); // 设置少量滤波以抗噪 // DAC和MUX将在DMA传输中动态设置此处不写死。 // 4. DMA配置核心 // DMA通道0TPM0_CH1触发从内存传输2字节到CMP0_DACDAT和CMP0_MUXCR DMA0-TCD[0].SADDR (uint32_t)dac_mux_data[0]; // 源地址存储DAC和MUX值的数组 DMA0-TCD[0].SOFF 2; // 每次传输后源地址2指向下一组配置用于双传感器交替 DMA0-TCD[0].ATTR DMA_ATTR_SSIZE(1) | DMA_ATTR_DSIZE(1); // 源和目标数据宽度均为16位 DMA0-TCD[0].NBYTES_MLNO 2; // 每次触发传输2字节 DMA0-TCD[0].SLAST -4; // 一轮两个传感器传输后源地址复位 DMA0-TCD[0].DADDR (uint32_t)CMP0-DACDAT; // 目标地址CMP DAC寄存器 DMA0-TCD[0].DOFF 0; // 目标地址固定 DMA0-TCD[0].CITER_ELINKNO BUFFER_SIZE; // 总共传输次数决定唤醒CPU前采样多少次 DMA0-TCD[0].DLASTSGA 0; DMA0-TCD[0].CSR DMA_CSR_INTMAJOR_MASK; // 开启主循环完成中断 DMA0-TCD[0].BITER_ELINKNO BUFFER_SIZE; // 配置触发源为TPM0_CH1 SIM-SOPT7 | SIM_SOPT7_DMA0_SEL(4); // 选择TPM0_CH1作为DMA通道0请求源 DMA0-ERQ | DMA_ERQ_ERQ0_MASK; // 使能通道0请求 // DMA通道1TPM0_OVF触发从CMP0_SCR读取1字节到RAM DMA0-TCD[1].SADDR (uint32_t)CMP0-SCR; DMA0-TCD[1].SOFF 0; DMA0-TCD[1].ATTR DMA_ATTR_SSIZE(0) | DMA_ATTR_DSIZE(0); DMA0-TCD[1].NBYTES_MLNO 1; DMA0-TCD[1].SLAST 0; DMA0-TCD[1].DADDR (uint32_t)sensor_result_buffer[0]; DMA0-TCD[1].DOFF 1; // 目标地址RAM每次1 DMA0-TCD[1].CITER_ELINKNO BUFFER_SIZE; DMA0-TCD[1].DLASTSGA -BUFFER_SIZE; // 传输完成后目标地址复位到数组开头 DMA0-TCD[1].CSR 0; // 配置触发源为TPM0_OVF SIM-SOPT7 | SIM_SOPT7_DMA1_SEL(5); DMA0-ERQ | DMA_ERQ_ERQ1_MASK; // DMA通道2由DMA通道1完成触发从内存传输2字节关闭CMP DMA0-TCD[2].SADDR (uint32_t)disable_cmp_data[0]; DMA0-TCD[2].SOFF 0; DMA0-TCD[2].ATTR DMA_ATTR_SSIZE(1) | DMA_ATTR_DSIZE(1); DMA0-TCD[2].NBYTES_MLNO 2; DMA0-TCD[2].SLAST 0; DMA0-TCD[2].DADDR (uint32_t)CMP0-DACDAT; DMA0-TCD[2].DOFF 0; DMA0-TCD[2].CITER_ELINKNO BUFFER_SIZE; DMA0-TCD[2].DLASTSGA 0; DMA0-TCD[2].CSR 0; // 配置为链式触发源是DMA通道1 DMA0-TCD[2].CSR | DMA_CSR_D_REQ_MASK; // 禁止硬件请求 DMA0-TCD[1].CSR | DMA_CSR_MAJORELINK_MASK; // 通道1完成后链接到通道2 DMA0-TCD[1].CSR | (2 DMA_CSR_MAJORLINKCH_SHIFT); // 链接到通道2 // 5. 进入VLPS模式 SMC-PMPROT SMC_PMPROT_AVLP_MASK; // 允许VLPS模式 SMC-PMCTRL SMC_PMCTRL_STOPM(0x2); // 设置停止模式为VLPS __WFI(); // 等待中断进入低功耗模式4.3 软件主循环与数据处理当DMA通道0完成了预设次数BUFFER_SIZE的传输后会触发DMA中断唤醒CPU。void DMA0_IRQHandler(void) { if (DMA0-INT DMA_INT_INT0_MASK) { DMA0-INT DMA_INT_INT0_MASK; // 清除中断标志 // 1. 停止DMA和定时器可选也可在中断内重新配置后继续 DMA0-ERQ ~(DMA_ERQ_ERQ0_MASK | DMA_ERQ_ERQ1_MASK); TPM0-SC ~TPM_SC_CMOD_MASK; TPM1-SC ~TPM_SC_CMOD_MASK; // 2. 处理RAM中的传感器数据 process_sensor_data(sensor_result_buffer, BUFFER_SIZE); // 3. 更新转速、方向、累计流量等变量 update_flow_calculations(); // 4. 刷新显示如有LCD refresh_display(); // 5. 重置DMA传输计数器重新使能外设准备下一轮采集 DMA0-TCD[0].CITER_ELINKNO BUFFER_SIZE; DMA0-TCD[1].CITER_ELINKNO BUFFER_SIZE; DMA0-TCD[2].CITER_ELINKNO BUFFER_SIZE; DMA0-TCD[0].BITER_ELINKNO BUFFER_SIZE; DMA0-TCD[1].BITER_ELINKNO BUFFER_SIZE; DMA0-TCD[2].BITER_ELINKNO BUFFER_SIZE; // 重置源/目标地址指针... DMA0-ERQ | (DMA_ERQ_ERQ0_MASK | DMA_ERQ_ERQ1_MASK); TPM0-SC | TPM_SC_CMOD(1); TPM1-SC | TPM_SC_CMOD(1); // 6. 再次进入VLPS模式 enter_vlps_mode(); } }数据处理函数process_sensor_data的核心是正交解码。它遍历sensor_result_buffer数组其中数据按[S1, S2, S1, S2...]交错存储通过检测两路信号的边沿和相位关系判断是正转还是反转并累加计数值。为了防止抖动通常会加入简单的软件去抖逻辑比如连续两次采样状态一致才确认一次跳变。5. 实测功耗分析与优化策略根据应用笔记和我的实测数据系统的功耗可以清晰地分为静态和动态两部分部件/模式电流消耗 (μA)说明静态部分 (与采样率无关)CPU (VLPS模式)2.8Cortex-M0内核停止保持RAM和寄存器定时器 TPM00.3运行在32kHz下产生采样时钟定时器 TPM10.3运行在32kHz下控制传感器切换实时时钟 RTC0.1用于维持日历或定时唤醒本例中未用可关闭LCD 显示屏0.5段码LCD功耗极低静态小计4.0这是系统的待机基线功耗动态部分 (依赖采样率)DMA CMP DAC 100 Hz4.0每次测量时比较器和DAC工作的平均电流DMA CMP DAC 200 Hz7.0DMA CMP DAC 300 Hz11.0DMA CMP DAC 400 Hz15.0总计 100 Hz8.0 μA总计 400 Hz19.0 μA功耗优化实战经验采样率是功耗的杠杆功耗与采样率近似成正比。在满足应用需求最大转速、抗抖动的前提下尽可能降低采样率。对于低速流量计如家用净水器20-50Hz可能就足够了功耗可以更低。外设时钟门控在初始化时只打开用到的外设时钟SIM_SCGCx寄存器。对于完全用不到的外设如ADC、DAC的其他通道、USB等务必关闭其时钟这是很多初学者容易忽略的省电步骤。未用引脚处理将所有未使用的GPIO引脚设置为禁止上下拉电阻的输出模式并输出低电平或高电平固定。悬空的输入引脚会因感应电压导致内部MOS管部分导通增加漏电流。电源域隔离如果PCB空间允许可以为传感器模拟电路部分使用独立的LDO供电并在MCU端使用模拟开关进行切换实现更彻底的关断。软件层面的间歇工作如果应用允许可以采用“爆发采样长期睡眠”的策略。例如每10秒唤醒一次以400Hz高速采样2秒然后深度睡眠8秒。这样平均功耗会更低。6. 常见问题排查与调试技巧在实现这个系统的过程中我遇到了不少坑这里总结一下最常见的几个问题及其解决方法问题1传感器输出不稳定比较器结果乱跳。可能原因A电源噪声。LC谐振电路对电源噪声非常敏感。确保传感器部分的电源有足够的去耦电容例如在VDD_COIL和GND之间并联一个10μF的钽电容和一个100nF的陶瓷电容。可能原因B阈值电压设置不当。使用MCU内部的DAC来设置阈值非常方便但初始值需要校准。我的方法是在无金属靠近时用ADC读取包络检波后的电压V_high在有金属紧贴时读取电压V_low。然后将阈值设置为(V_high V_low) / 2 * 0.8留20%的余量。可以在代码中存储这个校准值。可能原因C机械振动或间隙变化。确保传感器线圈和旋转金属盘之间的间隙固定。使用非金属支架并考虑使用弹簧或海绵垫来缓冲振动。问题2DMA传输未能正确触发RAM中无数据。排查步骤检查时钟确认MCU已成功切换到VLPS模式并且32kHz晶振正常工作可通过RTC验证。检查TPM配置用示波器测量TPM0_CH1和TPM1_CH0/CH1引脚确认有正确的脉冲波形输出。检查DMA请求源映射Kinetis L的DMA触发源需要通过SIM_SOPT7等寄存器进行映射务必确认映射关系正确TPM0_CH1映射到DMA通道0请求。检查DMA通道使能在启动DMA前确保DMA0-ERQ寄存器中对应通道位已置位。检查CMP寄存器地址DMA传输的目标地址是外设寄存器地址务必使用芯片头文件中定义的宏如CMP0-DACDAT避免手动计算错误。问题3测量结果出现方向误判或计数丢失。可能原因传感器安装角度偏差。理论上两个传感器应精确相差90度。如果角度偏差过大会导致两路信号的相位差严重偏离90度在低速或临界状态时容易误判方向。使用高精度夹具安装或通过软件校准进行补偿在初始化时缓慢旋转一周记录两路信号跳变点的时间差来反推实际相位差。软件去抖算法原始的边沿检测在信号有毛刺时会误计数。一个简单有效的软件去抖方法是记录当前状态S1_now,S2_now和上一次状态S1_prev,S2_prev。仅当(S1_now ! S1_prev) (S2_now S2_prev)时才认为S1发生了有效跳变再根据S2的状态判断方向。同理处理S2的跳变。这相当于一个简单的状态机能滤除大部分因振动或电气噪声引起的毛刺。问题4整体功耗高于预期。使用电流表串联测量将万用表打到微安档串联在电池和板子之间。分别测量CPU运行、进入VLPS、以及开启传感器测量时的电流。逐级排查哪个环节电流异常。检查PCB漏电尤其是传感器接口部分如果有焊锡残留或助焊剂污染在潮湿环境下可能导致微小的漏电流。彻底清洗PCB。检查软件流程确保在进入VLPS前所有不需要的外设包括其时钟都已关闭。确认中断配置正确没有意外的中断频繁唤醒CPU。这个基于Kinetis L和LC传感器的低功耗编码器方案将MCU外设的自主协同能力发挥到了一个新的高度。它不仅仅是一个具体的技术实现更展示了一种面向超低功耗传感系统的设计哲学让合适的硬件模块在正确的时间做正确的事而让CPU尽可能长时间地休息。掌握这种设计思路对于开发各类物联网终端、便携式医疗设备、远程环境监测传感器等产品都具有极高的参考价值。