1. 电压比较器:嵌入式系统的“模拟哨兵”
在嵌入式系统,尤其是那些对功耗和成本极其敏感的领域,电压比较器扮演着一个至关重要的角色。它不像ADC那样提供精确的量化数值,而是像一个反应迅速的“哨兵”,时刻监视着模拟世界的电压变化,一旦越过预设的“警戒线”,便立即发出数字化的警报。这种“非黑即白”的判决能力,使其成为电池供电设备、传感器接口和简单控制逻辑中的核心元件。我曾在多个基于MC68HC05系列MCU的项目中,利用其内置的比较器实现了电池电压监控、触摸按键检测和电机过流保护,深刻体会到理解其内部工作机制对于稳定性和功耗优化的重要性。本文将结合官方文档和实际踩坑经验,为你拆解比较器的速度、功耗、采样机制,并深入剖析与之紧密相关的模拟信号多路复用器(Analog MUX)和采样保持电路的设计要点。
2. 核心模块深度解析与设计权衡
2.1 速度特性:启动延迟与稳定时间
比较器的“速度”通常指其从输入变化到输出响应的延迟。在MC68HC05这类微控制器中,比较器本身响应很快,文档指出其能在2微秒内上电或响应输入变化。然而,这里存在一个极易被忽视的“冷启动”陷阱:当比较器及其偏置电流源都从未激活状态首次上电时,模拟偏置源的稳定需要额外时间。
如果软件在使能比较器后立即读取其输出标志位,可能会读到不稳定或错误的状态。因此,文档明确建议:在软件使能比较器后,至少延迟10微秒,待其完全稳定后再进行读取或标志位复位操作。
实操心得:这个10微秒的延迟不是可选项,而是必须遵守的“静默期”。在4.2MHz的系统时钟下,一个NOP指令耗时约1微秒。最稳妥的做法是在使能比较器(设置CPxEN位)后,插入一个包含10条NOP指令的小循环。我曾在一个烟雾报警器项目中忽略了这一点,导致上电初期偶尔误触发报警,排查许久才发现是比较器输出未稳定所致。
2.2 功耗构成:静态电流的精细账本
在电池供电设计中,每一微安都至关重要。MC68HC05内置比较器的功耗构成非常清晰,需要我们像会计一样精细计算:
- 单个比较器核心电流:约100 µA(由CP1EN或CP2EN位控制)。
- 共享模拟偏置源电流:约65 µA(只要任意一个比较器使能,该源即上电)。
因此,功耗计算如下:
- 使能一个比较器:100 µA + 65 µA =165 µA
- 使能两个比较器:(100 µA × 2) + 65 µA =265 µA
注意事项:这个偏置源是共享的。这意味着即使你只使用一个比较器,只要它使能了,65 µA的“基础电费”就必须支付。在深度休眠唤醒仅靠比较器触发的应用中,需要权衡:是保持一个比较器常开以监听事件(消耗165µA),还是完全关闭,定期唤醒MCU进行轮询(功耗可能更低,但响应有延迟)。
2.3 输出采样:静态标志与动态输出的抉择
如何知道比较器状态发生了变化?系统提供了两种机制,适用于不同场景:
1. 静态标志位(CPF1, CPF2)
- 工作原理:这是一个锁存器(Latch)。当对应比较器的输出产生上升沿(从低到高跳变)时,该标志位被自动置1。
- 特点:一旦置位,它将保持为1,直到软件向特定的清除位(CPFR1, CPFR2)写入1,或发生系统复位。
- 核心价值:异步事件捕获。即使CPU正在忙于执行其他任务(例如处理显示、通信),比较器的跳变事件也不会丢失,它被“冻结”在标志位中。这非常适合用于不频繁但需要可靠捕获的事件,如按键按下、阈值超限。标志位还可配置为触发模拟中断。
2. 动态输出位(CMP1, CMP2)
- 工作原理:这是比较器输出的实时“镜像”,直接反映其当前的电平状态。
- 特点:无锁存,无同步。CPU读取时得到的就是读取瞬间比较器的输出值。
- 核心价值:实时状态查询与测试。常用于初始化后验证比较器工作是否正常,或者在需要连续监控输入关系的场景中。
关键陷阱与避坑指南:
- 切换延迟:文档特别警告,在改变比较器输入极性(INV位)后,必须忽略CPF1/CPF2标志位的状态,直到先手动将它们清除。因为极性切换可能瞬间产生一个虚假的边沿,导致标志位置位。
- 动态采样的风险:由于CMPx位没有同步锁存,如果输入信号的变化频率高于软件读取ASR(模拟状态寄存器)的速率,就可能发生采样错误(亚稳态或错过变化)。例如,软件每100us读取一次,但输入是50kHz的方波,那你读到的值几乎是随机的。
- 中断与轮询的抉择:
- 中断方式:响应事件,但开销大。从中断发生到进入服务例程,最坏情况(执行MUL指令时发生中断)需要21个时钟周期,加上清除标志和返回,至少46个周期。不适合检测间隔小于约60个CPU周期的高速脉冲。
- 轮询方式:通过循环检测CPFx标志,开销小(检测+清除约11个周期),能处理间隔更短的脉冲(约30个周期),但会占用CPU时间。
我的经验:在电机调速项目中,我用比较器检测过零信号。一开始使用中断,发现在高转速下会丢失事件。后来改为在定时器中断里高频轮询CPF标志(每10us一次),问题得以解决。记住:对速度有极致要求,用轮询;对CPU占用率敏感且事件稀疏,用中断。
3. 模拟信号多路复用器:灵活的模拟信号路由器
MC68HC05的模拟前端不仅仅是一个比较器,更是一个配备了灵活路由网络的模拟信号系统。理解这个多路复用器(MUX)是进行复杂模拟测量的关键。
3.1 通道选择总线与比较器输入总线
系统包含两条主要的内部模拟总线:
- 通道选择总线:由AMUX寄存器的MUX1-MUX4位控制,可以将PB1-PB4中的任意一个或多个引脚(甚至内部VDD/VSS)连接到这条总线上。关键特性是允许并行连接多个通道。
- 比较器输入总线:一端固定连接至比较器2的负输入端(带有一个约10pF的采样电容),另一端可通过HOLD/DHOLD位选择连接到:通道选择总线(直连或经分压)、内部温度二极管,或者悬空以保持采样电容上的电压。
3.2 阻抗特性:不可忽视的模拟路径电阻
内部的模拟开关(MOS管)并非理想开关,其导通阻抗(Ron)会随电源电压、开关两端压差和温度变化。典型值在VDD=5V时为800-1500Ω,VDD=3V时为1200-2900Ω。这个阻抗在大多数情况下(当比较器作为高阻抗输入时)影响微乎其微,仅在两种情况下需要重点考虑:
- 使用分压输入模式时:系统为了保持分压比(0.5)的准确,会在分压器底部自动接入一个“补偿用”的 dummy MUX,以抵消顶部通道MUX的阻抗。但是,这个补偿只针对单个通道有效。如果同时使能了MUX1和MUX2(即两个通道并联接入),则顶部的等效阻抗减半,而底部的补偿阻抗未变,会导致实际分压比略微偏离0.5。
- 进行电流求和或信号路由时:当信号电流流经MUX时,会在其阻抗上产生压降。
3.3 高级应用:电流求和与灵活激励
多路复用器并行连接的能力开启了高级应用的大门。
应用一:电流求和如图15所示,可以将两个电流源分别接在PB1和PB2,使能MUX1和MUX2,让它们的电流在通道选择总线上相加。然后,使能MUX3,让总电流流经一个连接到PB3的外部电阻R,在R上产生电压V = (I1+I2) * R。更巧妙的用法是:再使能MUX4并将PB4接地,然后分别测量只有MUX3导通和只有MUX4导通时总线上的电压。两者电压之差,正好等于电流在外接电阻R上的压降,从而抵消了MUX阻抗带来的误差。
应用二:多量程传感器激励如图16所示,可以利用不同的上拉电阻(R1, R2, R3)连接到PB1-PB3,为同一个外部热敏电阻提供不同大小的激励电流。通过轮流使能不同的MUX,可以改变热敏电阻上的偏置条件,从而扩展其有效测量范围或进行自校准。
设计要点:
- 切换顺序:MUX没有“先断后通”的硬件互锁。严禁在一个写AMUX寄存器的周期内,同时改变多个MUX位,否则可能瞬间短路两个通道。安全做法是:每次只改变一个位。
- 电压限制:绝对避免让输入引脚电压低于VSS-0.3V或高于VDD+0.3V,否则保护二极管导通,可能注入大电流损坏芯片或干扰模拟地。
- 阻抗估算:当多个通道并联时,总阻抗可近似为单个MUX阻抗除以通道数。
4. 采样保持电路:精度与噪声的博弈
采样保持功能是利用比较器2输入端的10pF内部电容实现的。通过配置HOLD/DHOLD位,可以断开电容与输入源的连接,将其电压“冻结”住,供比较器进行后续测量(如单斜率ADC)。
4.1 采样时序:给电容足够的充电时间
这是最容易出错的地方。电容充电到目标电压的99.9%需要约7个RC时间常数。
- 直连模式(HOLD):RC时间常数很小(~104ns),软件操作间隔(~2us)远大于7RC,充电充分。
- 分压模式(DHOLD):串联了60kΩ电阻,RC时间常数最大可达832ns。此时2us仅约2.4个RC常数,充电至约85%。这会导致显著的测量误差!
解决方案:在设置DHOLD位和后续操作(如启动比较)之间,必须插入足够的延迟。文档建议至少6us。在4.2MHz时钟下,插入4条NOP指令(增加约4us),加上原有的操作时间,即可满足要求。我曾用示波器观察采样电容电压,发现不插入延迟时,测量值随输入信号频率变化,插入延迟后则稳定可靠。
4.2 电压保持:与泄漏和噪声的斗争
电容上的电荷会通过各种路径泄漏:
- 温度:泄漏电流随温度指数上升。室温下电荷可保持数分钟,85°C时可能仅能保持不到一秒。设计时需按0.2 V/s的衰减率估算保持时间。
- 噪声注入:这是采样保持模式最大的敌人,主要来源有两个:
- 地弹噪声:当MCU的I/O引脚驱动大电流负载突然切换时,会在VSS走线上产生毛刺。这个噪声可能耦合到模拟地,导致与采样电容相连的模拟开关瞬间误开启,破坏存储的电压。
- 衬底电流注入:当输入引脚电压超出电源轨(VSS-0.3V ~ VDD+0.3V)时,保护二极管导通,电流注入芯片衬底,干扰模拟部分。
4.3 抗噪声设计实践
根据文档建议和我的项目经验,总结出以下抗噪声守则:
- 采样期间保持“静默”:在采样电容处于保持状态(HOLD/DHOLD位已清零)到完成测量的时间段内,应避免切换任何大电流的I/O负载(如LED、继电器、电机驱动)。
- 优化PCB布局:模拟部分(比较器输入引脚、参考电压)的VSS走线应尽可能短、粗,并采用星型接地或单点接地,与数字部分的大电流地路径分离。
- 明智的通道连接:采样结束后,在保持阶段,将通道选择总线切换到内部VDD,并关闭所有输入通道MUX。这样可以让模拟开关的一端接到一个干净、稳定的电源,减少地弹噪声的影响。连接到VSS或低电压则抗噪性最差。
- 避免极端操作:不要用PB0的放电功能频繁对大电容(>2µF)放电,瞬间大电流(>25mA)会产生严重的地弹。在需要高精度采样的系统中,考虑使用外部RC电路或MOS管进行放电。
- 正确的操作序列:改变MUX连接时,遵循“先断开,后连接”的软件互锁原则。即,先清除HOLD/DHOLD位(断开采样电容),再改变通道选择MUX位,最后重新设置HOLD/DHOLD位进行新的采样。
5. 电流源与放电器件:构建单斜率ADC的基石
PB0引脚集成了一个恒流源和一个强下拉放电管,这是实现低成本、单斜率模数转换(ADC)的核心。
5.1 工作模式与控制
通过ACR寄存器的ISEN和CHG位控制,有三种模式:
| ISEN | CHG | 电流源 | 放电管 | PB0引脚行为 |
|---|---|---|---|---|
| 0 | X | 关闭 | 关闭 | 标准I/O端口 |
| 1 | 0 | 关闭 | 开启 | 灌电流(Sink),至少1mA |
| 1 | 1 | 开启 | 关闭 | 拉电流(Source),标称100µA |
5.2 电流源精度与补偿
标称100µA的电流源,在实际中受多种因素影响:
- 电源电压:VDD变化±15%,电流变化约±1.5%。
- 温度:从25°C到-40°C,每下降10°C,电流减小约1%;从25°C到85°C,变化很小(每10°C约0.01%)。
- PB0引脚电压:在共模范围(VSS 到 VDD-1.5V)内,变化<1%;当PB0电压接近VDD时,输出电流会下降(见图10)。
- 器件差异:不同芯片间约有±1%的偏差。
对于需要较高精度的应用(如用时间测量电压),必须进行校准。一个简单的方法是在已知温度下,测量对一个已知电容充电到固定电压所需的时间,反向推算出实际电流值。
5.3 放电器件与单斜率ADC实现
放电管可视为一个非线性电阻,在VDD=5V时等效电阻约190Ω,3V时约250Ω。其强大的灌电流能力(>1mA)能快速将外部电容电压拉低。
单斜率ADC工作流程:
- 复位阶段:设置ISEN=1, CHG=0,开启放电管,将外部电容电压快速放电至0V。
- 充电阶段:设置ISEN=1, CHG=1,开启100µA电流源,电容开始线性充电。电压 V_cap = (I_source / C) * t。
- 比较阶段:同时,将待测电压通过模拟MUX连接到比较器2的正端或负端(取决于配置)。电容电压连接到另一端。
- 计时:从充电开始瞬间启动定时器,当比较器输出翻转时停止定时器。翻转时间 T_compare 与输入电压 V_in 成正比:V_in = (I_source / C) * T_compare。
- 循环:测量完成后,再次开启放电,为下一次转换做准备。
避坑指南:
- 电流源延迟:电流源内部有偏置电路。为了防止在充放电模式切换时电流源建立缓慢影响定时精度,即使工作在放电模式(CHG=0),只要ISEN=1,电流源电路本身仍消耗约220µA的电流。这在计算系统总功耗时需计入。
- 放电尖峰:放电大电容时,瞬间电流尖峰可能扰乱内部模拟地。务必遵循文档建议:使用电容小于2µF,并确保峰值放电电流小于25mA。可以在PB0引脚串联一个小的限流电阻(如10-100Ω)来抑制尖峰。
- 自动切换:ACR中的ATD1和ATD2模式位可以与定时器配合,实现充放电模式的自动切换,简化单斜率ADC的软件控制流程。
6. 常见问题排查与实战技巧
在实际项目中,与比较器相关的问题往往隐蔽且棘手。以下是我总结的常见问题清单和排查思路。
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 比较器输出不稳定,随机翻转 | 1. 输入电压在比较阈值附近有噪声。 2. 电源纹波过大。 3. 未正确配置迟滞(如果支持)。 4. 软件读取速度过快,捕捉到亚稳态。 | 1. 用示波器观察输入引脚信号,添加RC低通滤波。 2. 检查电源稳压电路,在VDD和VSS间就近放置104-1uF的去耦电容。 3. 检查ACR寄存器,确认迟滞功能是否被意外禁用或使能。 4. 在读取CMP动态输出位时,增加短暂延时或多次读取取多数值。 |
| 采样保持值误差大,且不重复 | 1. 采样电容充电时间不足(尤其DHOLD模式)。 2. 保持阶段存在地弹或开关噪声干扰。 3. 采样电容泄漏过快(高温环境)。 4. INV或VOFF位在保持阶段被更改。 | 1.确保在设置DHOLD位后、启动比较前,有至少6us的软件延迟(如8个NOP)。 2. 检查PCB布局,强化模拟地;在采样期间禁止大电流I/O操作。 3. 高温环境下,缩短采样到比较的间隔时间,或放弃采样保持模式,采用持续连接测量。 4. 在采样保持期间,锁定相关配置寄存器。 |
| 单斜率ADC线性度差 | 1. 电流源精度受温度/电压影响。 2. 外部电容容值不准或漏电。 3. 放电不彻底,电容有残余电压。 4. 比较器响应延迟不一致。 | 1. 在已知温度下进行两点校准(如测量0V和Vref/2对应的充电时间)。 2. 使用C0G/NP0材质、低漏电的电容,并确保PCB清洁。 3. 确保放电时间足够长,或测量放电结束后的电容电压确认归零。 4. 确保输入电压在比较器共模范围内,且远离电源轨。 |
| 多路复用器切换时,通道间串扰 | 1. 违反操作顺序,同时切换多个MUX位导致瞬间短路。 2. 通道间存在较大压差,通过寄生电容耦合。 3. 输入信号源阻抗过高,切换时被干扰。 | 1.严格遵守软件互锁:先关HOLD/DHOLD -> 改通道MUX -> 开HOLD/DHOLD。 2. 在切换通道前,将所有模拟输入置于相近电压(如通过MUX连接到VDD/2)。 3. 在前级信号源后增加电压跟随器(运放)以降低输出阻抗。 |
| 功耗高于预期 | 1. 不使用的比较器未禁用。 2. 电流源(ISEN)长期使能。 3. 模拟偏置源因任一比较器使能而持续工作。 | 1. 在低功耗模式前,检查ACR寄存器,确保CP1EN和CP2EN位已清零。 2. 单斜率ADC不工作时,立即将ISEN位清零。 3. 如果系统完全不需要模拟功能,考虑将所有模拟相关模块完全下电(如果MCU支持)。 |
最后一点个人体会:模拟电路的设计,五分在原理,五分在细节。MC68HC05这类老牌MCU的模拟外设手册,字里行间都是工程经验的结晶。那些关于延迟时间、操作序列、噪声规避的“注意事项”,往往不是最优性能的指南,而是系统稳定工作的底线。在资源受限的嵌入式世界里,理解并尊重这些底线,比追求极致的参数更重要。把本文提到的延迟加上,把操作序列理清,把电源和地处理好,你的比较器应用就成功了一大半。