开源硬件SDLogger:基于ATmega644P的离线数据记录器设计与实现
1. 项目概述一个开源硬件的“黑匣子”如果你玩过无人机、做过机器人或者捣鼓过任何需要长时间监测环境数据的项目那你一定遇到过数据记录的难题。用电脑连着串口看人不能一直守着。用无线模块发回来信号不稳定还费电。这时候一个独立、可靠、能长时间工作的离线数据记录器就成了刚需。SDLogger就是为解决这个问题而生的一个开源硬件项目。它本质上是一个围绕SD卡构建的微型数据采集与存储系统你可以把它理解为你项目的“黑匣子”默默地、忠实地把传感器数据以文件形式记录在SD卡里等你需要分析时再拔卡读取。这个项目的核心魅力在于“开源”和“模块化”。硬件设计文件如原理图、PCB布局和固件源代码全部公开这意味着你不仅可以直接使用它更能深入理解其每一处设计考量甚至根据自己的需求进行二次开发。它没有采用时下热门的ESP32或STM32而是选择了一颗经典的ATmega644P单片机作为大脑。这背后有非常务实的考量对于纯粹的数据记录任务稳定、低功耗、接口简单、抗干扰能力强往往比强大的计算性能更重要。ATmega644P拥有足够的I/O口、UART、SPI接口以及充足的Flash和RAM来管理文件系统同时其成熟的生态和极低的待机功耗使其成为此类应用的理想选择。SDLogger适合谁它非常适合电子爱好者、学生、科研人员以及从事物联网设备原型开发的工程师。无论你是想记录花园的温湿度变化、监测自制小车的行驶轨迹、采集太阳能电池板的输出功率还是为某个实验装置配备可靠的数据备份单元SDLogger都能提供一个经过验证的硬件基础和清晰的软件框架让你免于从零开始设计数据存储电路的繁琐与风险。2. 核心硬件设计与选型解析2.1 主控芯片为何是ATmega644P在ARM Cortex-M内核大行其道的今天选择一个8位的AVR单片机似乎有些“复古”。但为SDLogger选择ATmega644P是经过深思熟虑的平衡之选。首先核心任务是数据记录。这个任务对CPU主频和计算能力的要求并不苛刻其核心瓶颈通常在于存储介质的写入速度和对文件系统的操作效率。ATmega644P在20MHz主频下通过优化SPI通信和FAT文件系统库完全能够满足以秒甚至毫秒为单位的常规数据记录需求。其次功耗与稳定性是关键。许多数据记录场景需要电池供电长期运行。ATmega644P拥有非常灵活和低功耗的睡眠模式在记录间隔期间单片机可以进入深度休眠仅由定时器或外部中断唤醒从而极大延长续航。其工业级的稳定性和抗干扰能力也经过了长期验证这对于在复杂电磁环境或户外条件下可靠工作至关重要。再者资源与成本恰到好处。它拥有64KB的Flash足够存放FatFs文件系统库、数据采集逻辑和通信协议和4KB的SRAM用于文件操作缓冲区、数据临时缓存。同时它具备硬件SPI接口这是高速读写SD卡所必需的以及多个UART可以方便地连接GPS模块、串口传感器或进行调试。在保证功能完整的前提下其成本通常低于功能类似的ARM芯片且周边电路如时钟、复位更简单。注意选择ATmega644P也意味着开发环境相对传统如AVR-GCC AVRDUDE但对于熟悉Arduino的开发者可以通过定义板卡文件的方式利用Arduino IDE的丰富库如SD库、SPI库进行快速原型开发这大大降低了入门门槛。2.2 存储核心SD卡接口电路设计要点SDLogger的性能和可靠性一半取决于SD卡接口电路的设计。这里不仅仅是连接几根线那么简单。1. 电平转换与兼容性大多数SD卡包括microSD卡的工作电压是3.3V。而ATmega644P如果工作在5V其I/O口输出高电平为5V直接连接会损坏SD卡。因此必须进行电平转换。一种经典的做法是使用74LVC125A这类3.3V供电的缓冲器其输入端兼容5V电平输出端为3.3V完美充当“翻译官”。另一种更简洁的方案是让单片机也工作在3.3V这样可以直接连接但需要注意此时单片机的时钟频率和供电要满足要求。2. SPI模式与引脚连接SD卡支持SDIO和SPI两种模式。SPI模式虽然速度不如SDIO但接口简单几乎所有单片机都支持且软件驱动成熟。因此SDLogger采用SPI模式。关键连接如下DI (Data In)- 单片机MOSI (Master Out Slave In)DO (Data Out)- 单片机MISO (Master In Slave Out)SCLK (Clock)- 单片机SCK (SPI Clock)CS (Chip Select)- 单片机任意一个GPIO口用于选择SD卡3. 电源管理与滤波SD卡在写入瞬间电流可能达到100mA以上因此电源路径必须足够“粗壮”。在PCB布局时SD卡座的VCC和GND引脚应就近放置一个大容量如10uF的钽电容和一个100nF的陶瓷电容以提供瞬时电流并滤除高频噪声。糟糕的电源设计是导致SD卡初始化失败或写入错误的常见元凶。4. 卡座选择与ESD防护推荐使用自带弹射机构的microSD卡座便于插拔。在SD卡的数据线和电源线上可以添加ESD静电放电保护二极管如USBLC6-2SC6特别是在产品用于户外或易接触场景时能有效防止静电击穿。2.3 辅助电路电源、时钟与扩展接口一个完整的数据记录器还需要考虑其他支撑电路。电源电路为了适应多种供电场景如USB 5V、电池3.7V-12VSDLogger通常会设计一个宽电压输入的LDO低压差线性稳压器或DC-DC降压电路为系统提供稳定的3.3V或5V核心电压。如果考虑低功耗还可以加入MOSFET开关电路实现对SD卡、传感器等外围模块的独立电源控制在不记录时彻底断电。时钟电路ATmega644P可以使用内部RC振荡器或外部晶振。对于需要精确时间戳的数据记录如记录每小时温度外部晶振是必须的。一个16MHz或20MHz的无源晶振配合两个22pF的负载电容能提供稳定准确的时钟基准。固件中需要实现RTC实时时钟功能通常可以利用定时器溢出中断来软件模拟或者外接一颗专门的RTC芯片如DS3231后者精度更高且自带电池备份。扩展接口SDLogger的价值在于其通用性。因此板上除了核心的SPI、UART接口被引出外还应将单片机的其他空闲I/O口、ADC输入口、I2C接口以排针或排母的形式引出。这样用户就可以轻松连接温湿度传感器如DHT22、SHT30、光照传感器、气压计BMP280、GPS模块NEO-6M等极大地扩展了应用场景。3. 固件架构与核心功能实现3.1 底层驱动SD卡与文件系统移植固件的基石是让单片机能够正确地与SD卡对话并管理文件。这个过程分为两层SD卡底层驱动和文件系统。SD卡底层驱动SPI通信你需要编写或移植SPI的读写函数。关键在于严格遵守SD卡物理层规范SD Physical Layer Simplified Specification。初始化流程CMD0, CMD8, ACMD41等必须按顺序进行并正确处理卡返回的响应R1, R3, R7。特别是CMD8检查电压范围和ACMD41初始化卡并进入工作状态是初始化成功的关键。在实现时SPI的时钟频率在初始化阶段不能太高通常400kHz初始化完成后可以提升到更高的频率如8-16MHz以提高读写速度。文件系统层FatFsFatFs是一个为嵌入式系统设计的通用FAT文件系统模块它独立于底层存储介质和硬件平台。你需要为FatFs实现几个必要的“磁盘I/O接口”函数disk_initialize初始化SD卡调用你的底层驱动初始化函数。disk_status获取磁盘状态。disk_read读取扇区。disk_write写入扇区。disk_ioctl控制命令如获取扇区数量、扇区大小等。将FatFs成功移植后你就可以使用熟悉的f_open,f_write,f_close,f_read等API来操作SD卡上的文件就像在电脑上编程一样。实操心得在移植FatFs时务必正确配置ffconf.h文件。关键选项包括_FS_READONLY是否只读、_USE_STRFUNC是否使用字符串功能、_USE_LFN是否支持长文件名以及_CODE_PAGE代码页用于中文文件名通常设置为936即GBK。对于数据记录通常不需要长文件名和中文关闭这些功能可以节省宝贵的RAM和Flash空间。3.2 数据记录逻辑与文件管理策略数据如何被组织并写入文件直接影响后续数据处理的便利性。文件命名策略一个简单的策略是使用“数据序号”的方式如LOG00001.TXT、LOG00002.TXT。更实用的策略是集成RTC时间信息生成如20240515_143025.CSV年月日_时分秒的文件名这样一眼就能看出文件的创建时间。在FatFs中可以使用sprintf函数将时间数据格式化为字符串作为文件名。数据格式设计强烈推荐使用CSV逗号分隔值格式。它结构简单通用性强可以直接用Excel、WPS表格或任何文本编辑器打开也方便被Pythonpandas、MATLAB等数据分析工具导入。每一行代表一条记录不同列代表不同的传感器数据。例如2024-05-15 14:30:25, 25.6, 54.2, 1013.25, 12.345, -45.678分别对应时间戳、温度(°C)、湿度(%)、气压(hPa)、经度、纬度。写入策略与缓冲区频繁调用f_write直接写SD卡效率低且耗电。最佳实践是在RAM中开辟一个缓冲区如512字节或1KB将格式化的数据先存入缓冲区。当缓冲区满或者到达一个固定的时间间隔如每10秒时再将整个缓冲区的内容一次性写入文件。这大大减少了文件系统的操作次数提高了写入效率和SD卡寿命。同时每次写入后应调用f_sync函数确保数据从单片机的缓存真正写入SD卡的物理扇区避免掉电丢失数据。文件循环与存储管理对于需要长时间无人值守的记录必须考虑SD卡容量会满。可以设计一个简单的循环记录逻辑当剩余存储空间低于某个阈值时自动删除最早的文件或者停止记录并点亮报警LED。更复杂的策略可以包括将数据文件通过无线模块上传到服务器后删除本地文件。3.3 外围设备集成与数据采集SDLogger的强大通过其扩展接口体现。集成不同传感器需要不同的通信协议。模拟传感器ADC如测量电池电压、光照强度通过光敏电阻。连接传感器到单片机的ADC输入引脚。在固件中需要初始化ADC设置参考电压如AVCC然后进行采样和转换。为了减少噪声通常需要进行多次采样取平均。转换后的数字值需要根据传感器特性如分压电阻比例、灵敏度换算成实际的物理量如电压值、勒克斯值。数字传感器I2C/SPI/UARTI2C设备如温湿度传感器SHT30、气压计BMP280。需要实现I2C的起始、停止、发送、接收函数。通常传感器厂商会提供寄存器映射的驱动代码你需要将其与自己的I2C底层函数对接。注意I2C总线上拉电阻通常4.7kΩ是必须的。SPI设备除了SD卡可能还有高精度ADC模块等。注意每个SPI从设备都需要独立的片选CS引脚。UART设备如GPS模块。只需连接RX/TX线在固件中初始化UART设置好波特率、数据位、停止位然后在中断服务程序或主循环中解析接收到的NMEA-0183语句如$GPRMC即可提取经纬度、时间、速度信息。多任务调度一个典型的数据记录器需要同时处理定时采集、数据格式化、缓冲区写入、状态指示LED等任务。在无RTOS的裸机环境下通常采用基于定时器中断的“前后台”架构。主循环后台负责低优先级任务如检查按钮、管理LED。一个高精度的定时器如Timer1被设置为固定间隔如1秒产生中断在中断服务程序前台中设置采集标志位。主循环检测到标志位后执行一轮传感器数据读取、格式化、存入缓冲区的操作。这种架构简单有效能保证采集的定时精度。4. 从设计到制作PCB设计与打样实战4.1 原理图设计要点与检查清单在进入PCB布局之前一份正确、清晰的原理图是成功的基石。使用KiCad、Eagle或Altium Designer等工具绘制原理图时请对照以下清单逐一核对电源树检查所有芯片的供电电压是否正确ATmega644P是5V还是3.3VSD卡是3.3V。LDO或DC-DC的输入输出电容是否齐全通常输入一个大电容滤低频一个小电容滤高频输出同理。在电源入口处是否放置了反接保护二极管或保险丝去耦电容每个IC的电源引脚附近是否都放置了一个100nF0.1uF的陶瓷去耦电容对于单片机、SD卡座这种数字IC这是必须的用于提供瞬间电流并抑制噪声。电容应尽可能靠近芯片的VCC和GND引脚。信号上拉/下拉I2C的SDA和SCL线是否接了上拉电阻通常4.7kΩ单片机未使用的GPIO口特别是配置为输入且悬空时最好设置为内部上拉或外部下拉防止因浮空产生随机功耗和误触发。接口保护所有对外连接的接口如UART、I2C、ADC输入是否考虑了ESD保护简单的TVS二极管或专用的ESD保护芯片能极大提升板子的 robustness。晶振电路如果使用外部晶振负载电容两个22pF是否连接正确晶振外壳是否接地走线是否尽可能短且远离高频信号线SD卡座SD卡座的引脚定义是否与封装一致特别是卡检测CD和写保护WP引脚如果不用是否做了正确处理上拉或接地4.2 PCB布局布线核心准则PCB布局布线直接决定了电路的性能和抗干扰能力对于SDLogger这样混合了数字和模拟信号ADC的板子尤其重要。布局原则模块化布局将电路按功能分区电源区域、单片机及时钟区域、SD卡存储区域、传感器接口区域。各区域之间留有清晰界限。电源先行先放置电源转换芯片、输入输出插座然后规划主要电源路径。确保大电流路径如LDO到SD卡走线足够宽。以核心器件为中心将ATmega644P放在板子中央或靠近主要接口的位置使其到SD卡、晶振、串口等关键器件的走线最短。接口位置将需要频繁插拔的接口如USB口、SD卡座放在板子边缘方便操作。布线准则电源线加粗主电源走线宽度至少20-30mil0.5-0.76mm。可以使用铺铜Pour的方式为电源网络如3.3V、5V和地GND创建大面积铜皮以降低阻抗和改善散热。信号线等长与间距对于SD卡的SPI总线MISO, MOSI, SCK, CS尽量保持走线长度相近并与其他高速或敏感信号线如晶振线保持至少3倍线宽的间距以减少串扰。晶振走线晶振电路晶振、负载电容到单片机的走线必须尽可能短、粗且包地处理即走线两侧和下方有地平面包围。千万不要在晶振走线下方或附近走其他信号线。地平面至关重要务必保证一个完整、连续的地平面Ground Plane。它不仅是电流的回流路径更是重要的屏蔽层。避免在地平面上切割出过长的缝隙这会导致回流路径变长增加电磁干扰EMI。过孔使用在芯片的电源引脚和去耦电容之间使用过孔直接连接到电源/地平面而不是通过细线绕远。这能提供最低阻抗的路径。4.3 打样、焊接与调试避坑指南设计文件Gerber发给板厂打样后就进入动手环节。焊接顺序建议按照“先低后高先里后外”的顺序焊接。先焊接贴片阻容、二极管等小元件然后是芯片座如果使用、LDO、单片机最后是接插件排针、USB口、卡座。使用热风枪焊接QFP封装的ATmega644P时温度不要过高建议350°C左右风速适中均匀加热芯片四周看到焊锡融化后芯片会自动归位“自对齐”效应。上电前检查焊接完成后切勿直接上电务必进行以下检查目视检查用放大镜检查有无虚焊、连锡、元件焊反特别是二极管、电解电容、芯片方向。短路测试用万用表蜂鸣档测量电源3.3V/5V与地GND之间的电阻。正常情况下应该有几百欧姆以上的阻值如果接近0欧姆说明存在严重短路必须排查。静态电流测试在电源路径中串联万用表电流档或使用可调电源的电流显示首次上电时先将电压调至略低于额定值如3V观察电流是否异常正常应在几毫安到几十毫安。若无异常再调至额定电压。分模块调试电源模块上电后首先测量LDO或DC-DC的输出电压是否准确稳定3.3V或5V。单片机最小系统连接编程器如USBasp尝试给单片机烧录一个最简单的LED闪烁程序。如果成功说明单片机、晶振、复位电路基本正常。SD卡模块这是调试的重点和难点。编写一个简单的测试程序仅初始化SPI和SD卡。通过串口打印初始化过程中的每一步状态CMD0响应、CMD8响应等。最常见的失败原因是电平不匹配单片机是5V输出而SD卡是3.3V。SPI模式不对SD卡初始化阶段需要工作在SPI模式0或3时钟相位和极性要设置正确。电源不稳SD卡座旁的滤波电容缺失或太小导致写入时电压跌落。上拉电阻SD卡的DOMISO线通常需要一颗10kΩ左右的上拉电阻以确保空闲时为高电平。传感器模块最后逐个添加和调试传感器。使用逻辑分析仪或示波器查看I2C、SPI、UART的波形是排查通信问题最有效的手段。5. 典型应用场景与功能扩展思路5.1 场景一环境监测站这是SDLogger最经典的应用。你可以将它连接上温湿度传感器如SHT30、大气压力传感器BMP280、光照传感器BH1750和土壤湿度传感器封装在一个防风雨的盒子里配上太阳能板和锂电池部署在田野、温室或楼顶。系统搭建供电采用18650锂电池搭配TP4056充电管理模块和一个小型太阳能板5V/1W。单片机通过检测电池电压通过ADC分压采样来判断电量并在电压过低时进入休眠或通过蜂鸣器报警。数据采集设置定时器每5分钟唤醒一次系统依次读取所有传感器数据连同从软件RTC或GPS模块获取的时间戳格式化为一行CSV数据存入缓冲区。积累一定数据或到达固定时间后一次性写入SD卡。数据获取定期如每周前往现场更换SD卡或者设计一个简单的蓝牙/Wi-Fi模块如HC-05或ESP-01在近距离内无线读取数据文件。扩展思考可以增加一个蜂鸣器或LED在传感器数据超过阈值如温度过高时进行本地声光报警。也可以增加一个简单的LCD屏幕用于现场查看实时数据。5.2 场景二车辆行驶数据记录简易“黑匣子”将SDLogger与GPS模块和MPU6050六轴陀螺仪加速度计结合可以制作一个简易的行车记录仪或模型车/无人机数据记录器。系统搭建数据融合GPS提供时间、位置、速度信息MPU6050提供三轴加速度和角速度信息可用于分析急加速、急刹车、转弯等驾驶行为或飞行姿态。高频率记录车辆动态变化快需要更高的记录频率如10Hz。这对SDLogger的写入速度和缓冲区管理提出了更高要求。需要优化写入策略可能需要在RAM中开辟更大的环形缓冲区并采用更高效的文件系统操作如减少f_sync的调用频率改为定时同步。文件分割每次车辆点火启动时自动创建一个以启动时间命名的新文件便于按行程管理数据。扩展思考加入一个三轴磁力计如HMC5883L可以构成完整的9轴姿态传感器IMU用于更精确的姿态解算。加入一个OBD-II接口读取器可以直接获取汽车的发动机转速、油耗、故障码等CAN总线数据让记录更加专业。5.3 场景三工业设备状态监测与预测性维护在工业现场可以用SDLogger来监测关键设备的振动、温度、电流等状态参数用于预测性维护。系统搭建传感器选型使用工业级的振动传感器压电式或MEMS式、PT100温度传感器需配变送器、电流互感器CT等。注意工业现场信号噪声大传感器信号可能需要经过滤波放大电路后再送入单片机的ADC。抗干扰设计这是工业应用的核心。PCB设计需更加注重屏蔽和滤波。所有对外接口采用隔离方案如光耦隔离数字信号隔离运放隔离模拟信号。电源输入使用隔离DC-DC模块。外壳采用金属壳体并良好接地。可靠存储工业数据价值高需确保不丢失。可采用双SD卡热备份机制同时写入两份数据。或者在每次写入文件后计算该文件的CRC校验码并单独存储读取时进行校验。扩展思考在设备端集成简单的边缘计算算法。例如实时计算振动信号的RMS均方根值或FFT快速傅里叶变换频谱当特征值超过阈值时不仅记录原始数据还在文件中标记“异常事件”并触发一个继电器输出报警信号直接连接到工厂的PLC或报警系统。6. 常见问题排查与性能优化技巧6.1 SD卡初始化失败与写入错误这是开发过程中最常见的问题其根源多种多样。问题现象调用f_mount或disk_initialize失败返回FR_NOT_READY、FR_DISK_ERR等错误。排查步骤检查硬件连接这是第一步也是最容易出错的一步。用万用表蜂鸣档仔细检查SD卡座的每个引脚CLK, CMD, DAT0-DAT3, VCC, GND是否与单片机对应引脚连通且没有与其他信号短路。特别注意电平转换芯片是否焊接正确。检查电源在SD卡座VCC引脚处测量电压在单片机启动和进行SPI通信时电压是否稳定在3.3V是否有大幅跌落超过0.2V用示波器观察更直观。确保电源去耦电容特别是那个10uF的钽电容已正确焊接。降低SPI速度在初始化阶段将SPI时钟分频系数调到最大即速度最慢例如设置为主频的128分频。初始化成功后再提高速度。有些质量较差的SD卡或长导线连接时高速时钟会导致通信失败。检查上拉电阻SD卡的DAT线SPI模式下主要是MISO内部是开漏输出必须外接上拉电阻通常10kΩ-100kΩ到3.3V否则无法正确输出高电平。时序与延时在发送命令和等待响应之间确保有足够的延时。SD卡规范要求某些操作后有至少1ms的等待时间。在底层驱动代码中适当增加delay_ms(1)之类的延时。卡兼容性尝试换一张不同品牌、不同容量建议先用4GB或8GB的普通卡避免使用超大容量或高速UHS卡的SD卡进行测试。有些山寨卡或损坏的卡无法正常初始化。写入错误数据损坏或文件丢失症状文件能创建但写入的数据乱码或文件突然消失。原因与解决未调用f_sync或f_close写入操作后数据可能还在单片机的缓存里。必须在每次写入会话后调用f_sync()或在文件操作结束时调用f_close()才能保证数据物理写入卡中。在突然断电前这一点至关重要。电源中断在写入扇区时断电可能导致文件系统结构损坏。解决方法是在软件上实现“原子写入”或者使用具有掉电保护功能的文件系统如LittleFS但FatFs本身不提供此功能。硬件上可以增加大电容或备用电池提供掉电后完成最后一次写操作的能量。多任务访问冲突如果中断服务程序中也操作了文件系统可能会与主循环中的文件操作冲突。必须确保对文件系统的访问是互斥的可以通过关闭全局中断或使用信号量来实现。6.2 数据记录时间戳不准与丢失问题记录的数据点时间间隔不均匀或者某些时间段的数据完全丢失。排查与优化检查定时器中断确保用于触发采集的定时器中断优先级最高且中断服务程序ISR执行时间尽可能短。ISR里只做置标志位、读硬件寄存器等最必要的操作耗时的数据处理如浮点计算、格式化字符串应放到主循环中。过长的ISR会阻塞其他中断导致系统“丢帧”。优化主循环逻辑在主循环中处理完一次数据采集和存储后应立即回到等待标志位的状态。避免在循环中执行不必要的延时如delay(1000)这种阻塞式延时会严重破坏定时精度。应使用状态机和非阻塞的时间判断如比较millis()函数返回值。缓冲区管理如果数据写入SD卡的时间f_write长于数据采集间隔就会导致数据丢失。必须确保缓冲区足够大使得“填充缓冲区的时间”远长于“清空缓冲区写入卡的时间”。例如每1秒采集一次每次数据100字节那么512字节的缓冲区只能存5次数据。如果写入这512字节需要超过5秒就会溢出。需要增大缓冲区或优化写入速度。RTC精度如果使用软件RTC其精度取决于单片机主晶振的精度。32.768kHz的RTC专用晶振精度远高于普通的MHz晶振。对于需要长期精确计时的应用建议外接硬件RTC芯片如DS3231其精度可达每月2分钟以内且自带电池备份断电后依然走时。6.3 功耗过高与续航优化对于电池供电的应用功耗是生命线。测量功耗使用万用表电流档串联在电池和板子之间分别测量系统在不同状态全速运行、空闲、深度睡眠下的电流。这是优化的基础。优化策略睡眠模式ATmega644P的“省电模式”Power-save或“掉电模式”Power-down可以将电流降至微安级别。在采集间隔期间让单片机进入最深的睡眠模式仅通过看门狗定时器WDT或外部中断如RTC的1Hz输出唤醒。外设电源管理通过MOSFET或负载开关如TPS22965控制SD卡、传感器、GPS模块的电源。仅在需要采集数据的瞬间才为其供电采集完毕后立即断电。一个GPS模块全功率工作可能消耗50mA而断电后则为0。降低工作频率在满足性能要求的前提下降低单片机的主频可以线性降低动态功耗。例如从20MHz降至8MHz。关闭未用模块在固件中关闭未使用的功能模块如ADC、模拟比较器、BOD掉电检测等。优化软件逻辑让CPU尽可能多地处于空闲或睡眠状态。避免忙等待Busy Loop所有延时和等待都应以中断唤醒的方式实现。一个典型的低功耗循环主循环开始 1. 打开传感器电源通过MOSFET。 2. 短暂延时等待传感器稳定如20ms。 3. 读取传感器数据。 4. 关闭传感器电源。 5. 将数据格式化并存入RAM缓冲区。 6. 如果缓冲区满或到达定时则唤醒SD卡电源写入数据然后关闭SD卡电源。 7. 配置定时器或WDT在设定的间隔后产生中断。 8. 设置睡眠使能位进入深度睡眠模式。 9. CPU休眠功耗极低 10. 定时器/WDT中断发生CPU唤醒跳转到中断向量。 11. 在中断服务程序中清除标志然后返回主循环起点。通过以上综合优化一个设计良好的SDLogger系统在每分钟记录一次数据的工况下平均电流可以做到1mA以下使用一颗2000mAh的18650电池理论续航可达数月之久。