本帖最后由 梨花若雪 于 2026-9-17 15:27 编辑
瑞萨RA系列里还有一个极度容易被忽略的模拟类冷门外设——ACMP(Analog Comparator)高速模拟比较器。多数开发者做电压阈值、过流过压检测时,要么用ADC定时采样+软件比较,要么外接独立比较器芯片,很少有人用到MCU片内集成的硬件比较器。它能实现纳秒级的电压翻转响应,全程零CPU开销,还能直接内部联动ELC、POEG、ADC等外设,是硬件级保护、高速信号检测场景的隐藏利器。
一、功能介绍
ACMP是片内集成的纯硬件模拟电压比较器,核心功能是实时比较两个模拟输入端的电压大小,直接输出高低电平数字信号。它的响应速度在几十纳秒级别,完全不需要CPU参与运算,输出既可以接到外部引脚,也可以直接内部触发中断、ELC事件、POEG保护动作。
它的典型应用场景包括:
- 电源过压/欠压硬件保护,直接联动POEG切断功率输出
- 电机驱动的相电流过流检测,硬件级极速响应
- 交流信号零交叉检测、峰值检测
- 替代外部独立比较器,节省BOM成本与PCB面积
- 配合片内OPAMP、DAC组成可编程模拟阈值电路
- 窗口电压检测,判断模拟信号是否在正常区间内
和ADC软件轮询方案相比,ACMP的响应速度快上百倍,且不占用任何CPU算力;和外部比较器相比,它省去了外围芯片、分压电阻、滤波电容,还能直接和片内外设硬件联动,系统集成度和可靠性更高。
二、理论介绍
RA4M3的ACMP分为高速型(ACMPHS)和低功耗型(ACMPLP)两个版本,高速型响应快、适合保护场景,低功耗型功耗低、适合待机检测。核心结构包含输入多路选择器、比较器核心、输出滤波防抖、输出路由四个部分,支持单端比较和窗口比较两种工作模式。
ACMP硬件原理框图:
核心特性说明- 双规格可选:高速模式响应时间典型值50ns,低功耗模式仅微安级电流,可根据场景切换
- 输入源灵活:正负输入端均可独立选择外部引脚、内部参考电压、DAC输出、OPAMP输出,无需外部走线
- 窗口比较模式:两路ACMP可组成窗口检测器,同时检测电压的上下限,判断信号是否在正常区间
- 硬件防抖滤波:内置可编程数字滤波器,可滤除输入信号的毛刺,避免误触发
- 多路径输出联动:输出可直接触发中断、ELC事件、POEG保护、ADC启动,全硬件链路零软件延迟
三、e2s IDE配置步骤
我使用瑞萨RA4M3 MCU和e2s IDE + FSP框架,以“内部参考电压1.65V为阈值,检测外部输入电压高低,中断输出+串口打印状态”为例,完整配置与代码如下:
- 打开e2s IDE,创建RA4M3的FSP工程,提前配置一路UART用于printf输出
- 打开FSP Configuration,在Analog分类中找到ACMPHS,点击添加通道0实例
- 配置ACMPHS通道参数:
- 名称:g_acmphs0
- 正输入源:选择外部模拟引脚ACMPHS0_IVCMP
- 负输入源:选择内部参考电压VREF165(1.65V)
- 输出极性:不反转,正输入高于负输入时输出高
- 数字滤波:使能,滤波时钟分频系数设为32
- 中断触发:双边沿触发(电压上升/下降都触发中断)
- 中断优先级:设置为2
- 点击Generate Project Content生成驱动代码
- 在main.c中添加业务代码,包含中断回调与串口打印,完整示例如下:
- <pre style="font-family: Consolas, Monaco, "Courier New", monospace;"><code>#include "hal_data.h"
- #include <stdio.h>
- #include <stdint.h>
- volatile uint8_t cmp_state_flag = 0; // 比较状态翻转标志
- volatile uint8_t cmp_output_val = 0; // 当前比较输出值
- /* ACMP中断回调函数 */
- void acmphs0_callback(acmphs_callback_args_t * p_args)
- {
- cmp_output_val = p_args->output_state;
- cmp_state_flag = 1;
- }
- void hal_entry(void)
- {
- fsp_err_t err;
- printf("\r\n===== ACMP高速模拟比较器测试 =====\r\n");
- printf("阈值电压:内部1.65V参考源\r\n");
- printf("测试引脚:ACMPHS0外部输入\r\n\r\n");
- /* 初始化ACMPHS模块 */
- err = R_ACMPHS_Open(&g_acmphs0_ctrl, &g_acmphs0_cfg);
- assert(FSP_SUCCESS == err);
- /* 启动比较器,等待稳定 */
- err = R_ACMPHS_Start(&g_acmphs0_ctrl);
- assert(FSP_SUCCESS == err);
- R_BSP_SoftwareDelay(10, BSP_DELAY_UNITS_MICROSECONDS);
- /* 读取初始状态 */
- R_ACMPHS_OutputGet(&g_acmphs0_ctrl, &cmp_output_val);
- printf("初始状态:输入电压 %s 1.65V阈值\r\n",
- cmp_output_val ? "高于" : "低于");
- while(1)
- {
- if (1 == cmp_state_flag)
- {
- /* 串口打印当前比较状态 */
- printf("状态翻转!当前输入电压 %s 1.65V阈值\r\n",
- cmp_output_val ? "高于" : "低于");
- cmp_state_flag = 0;
- }
- /* CPU可并行执行其他任务 */
- __WFI();
- }
- }
- </code></pre>
ACMP完整代码逻辑流程图:
四、预期的输入输出输入:
- ACMPHS0外部引脚输入0~3.3V连续变化的模拟电压
- 比较阈值固定为内部1.65V参考电压
- 输入信号允许带有小幅毛刺,硬件滤波会自动滤除
串口输出:
典型现象:用可调电阻调节输入电压,在1.65V附近缓慢调节,串口会精准打印状态翻转信息;输入信号叠加小幅毛刺时,不会出现误触发;用示波器观测输出引脚,电压翻转延迟仅几十纳秒,远快于ADC采样+软件比较的方案。
五、优缺点分析优点- 极速响应:高速模式响应时间仅几十纳秒,是硬件级保护的理想选择,比ADC轮询快两个数量级
- 零CPU占用:完全由硬件实现比较与滤波,CPU仅在状态翻转时介入,常态下可深度休眠
- 高集成度:支持内部参考电压、DAC、OPAMP互联,无需外部元件即可组成完整检测电路
- 硬件联动能力强:输出可直接触发ELC、POEG、ADC,形成全硬件保护链路,无软件延迟
- 节省成本:替代外部比较器芯片、分压电阻、滤波电容,降低BOM成本与PCB面积
缺点- 仅能做大小比较:只能输出高低逻辑,无法像ADC那样读取精确电压数值
- 阈值精度有限:内部参考电压存在一定误差,精度低于高精度外部比较器
- 通道数量少:一般仅集成2~4路ACMP通道,无法满足大量检测点需求
- 输入范围受限:输入电压范围受模拟电源限制,无法处理超过VCC的电压
- 调试不直观:模拟内部节点无法测量,出现阈值偏差时排查难度高于分立器件
总的来说,ACMP是一款“小身材大作用”的偏门外设。对于过压过流保护、零交叉检测、阈值报警这类只需要判断高低、不需要精确数值的场景,它比ADC方案更快、更省资源、更可靠;尤其是配合POEG、ELC组成全硬件保护链路时,能大幅提升系统的安全性与响应速度,是工业控制、电机驱动、电源类产品非常值得挖掘的片内资源。
|