二、用 Teensy 4.1/Esp32系列MCU控制电磁继电器和固态继电器模块
先记住最重要的限制:Teensy 4.1和Esp32系列MCU的 GPIO 是 3.3V 信号,不能承受 5V 输入。Teensy4.1官方建议的单脚最大输出电流为 4mA。因此,模块写着“5V 继电器”,并不意味着它可以直接由 Teensy 引脚驱动;“带光耦”也不意味着可以不看接线图就获得真正的电气隔离。
我们俱乐部自己设计了基于74HCT245 IC的电平转换模块,用来让teensy4.1/eps32系列MCU控制5伏的元器件,详见站内相关文章。本文默认不使用这个电平转换模块。
本文分别讨论四种情况:带光耦的电磁继电器模块、不带光耦的电磁继电器模块、带光耦的固态继电器模块,以及没有额外光耦的固态继电器模块。由于市售模块接线差异很大,下文给出的是核对条件成立后的接法,不是按模块名称即可照接的万能引脚表。
先断电,再接线。以下以俱乐部的低压直流机器人为背景,不涉及市电接线。每次试验先用小负载验证模块的触发方式,再接入实际支路。继电器或固态继电器的输出额定值,必须覆盖电池充满时的电压、负载持续电流和接通冲击;原有保险丝仍须保留。
一、先分清模块上的两组端子
无论是哪种模块,都先把它看成两部分:
- 控制侧:Teensy 发出“开/关”命令。常见标记有
IN、VCC、GND、DC+、DC−或IN+、IN−。 - 负载侧:真正接入被控制设备的供电线路。电磁继电器常标
COM、NO、NC;固态继电器可能标LOAD+、LOAD−或OUT。
不要把 COM 当成控制侧的 GND。COM 是电磁继电器的触点端子。对希望“默认断电”的附件,通常选 COM 与 NO:继电器未吸合时,两端断开。实际还须测试模块在 Teensy 未启动、重启和掉电时的状态。
对于机器人电路中的直流分支,可以这样理解电磁继电器触点的位置:
分支保险丝输出正极 → COM → NO → 被控设备电源正极;设备负极 → 对应电源负极。
这是控制某个经过选型的附件或分支的示意,不是建议用一块普通继电器模块直接切断供电主电源,也不是用继电器替代电机驱动器。
二、带光耦的电磁继电器模块
光耦可以理解为“用光把控制命令传过去”的器件。但光耦存在于板上和整块模块实现电气隔离是两件事。要保持隔离,控制侧与继电器线圈侧需要按模块设计分别供电,且不能再通过地线或其他线路把两侧接在一起。
情况 A:模块明确支持 3.3V 控制,按普通模块使用
以已确认 3.3V 可触发、低电平有效的模块为例:
| Teensy/电源侧 | 继电器模块 |
|---|---|
| Teensy GPIO | IN |
| 控制侧 3.3V 或厂家要求的控制电源 | 控制侧 VCC |
Teensy GND |
控制侧 GND,仅在该模块要求共地时连接 |
| 符合线圈规格的独立电源 | JD-VCC、RY-VCC 等线圈电源端,按模块说明连接 |
此时通常是 GPIO 输出 LOW 吸合、输出 HIGH 释放,但必须以实际模块的说明书和测试结果为准。有的模块可用跳线选择高、低电平触发。不能从“带光耦”三个字推断触发极性。
使用同一非隔离电源、共用地线,或者保留将控制侧与线圈侧相连的跳线时,可以发挥模块的驱动功能,但不能声称控制侧与线圈侧已经真正电气隔离。
情况 B:希望真正隔离线圈侧
某些模块允许移除 VCC 与 JD-VCC 一类端子之间的跳线:控制侧由 Teensy 一侧供电,线圈侧由另一组电源供电,两侧地线不连接。有厂家给出过这样的完整隔离接法,但它是该款模块的接法,不适用于所有“JD-VCC 模块”。
动手前要同时确认三件事:
- 模块说明书确实支持这种隔离接法,且板上没有其他共地连接。
- 光耦输入在 3.3V 下能可靠触发,所需输入电流不超过 Teensy GPIO 的建议能力。
- 给线圈侧供电的电源与控制侧确实隔离;从同一非隔离降压器引出两根线,并不会凭空产生隔离。
特别注意:不要把 5V 模块的 VCC 接 5V、IN 直接接 Teensy GPIO,然后仅凭“输出高电平是 3.3V”就认为安全。某些低电平触发模块的输入电路会通过电阻和指示灯连接到 5V,可能导致关断不可靠,甚至向 Teensy 引脚施加不合适的电压。拿不到模块原理图或可靠输入规格时,换用明确标注 3.3V 控制兼容的模块,或另加合适的驱动/隔离电路。
三、不带光耦的电磁继电器模块
这里首先要辨别:“不带光耦”不等于“没有驱动电路”。
类型 A:模块板上已有三极管或 MOS 管驱动
若说明书明确写明其 IN 接受 3.3V 逻辑输入,且输入电流符合 Teensy 的 GPIO 能力,常见接线为:
- 模块
VCC→ 模块规定的工作电源,例如其规定的 5V 电源; - 模块
GND→ 电源地,并与 TeensyGND共地; - 模块
IN→ Teensy GPIO; COM、NO→ 串入经过保险丝保护的负载正极线路。
为什么需要共地?没有隔离的电压信号必须有共同的参考点,模块才能正确判断 Teensy 输出的是高还是低。即便模块由 5V 供电,也仍须单独确认 IN 是否真正兼容 3.3V、是否会反向向 GPIO 施加 5V;不能只看继电器线圈上印的“5V”。
类型 B:只是“裸继电器”或板上没有足够的驱动电路
不能把线圈直接接在 Teensy GPIO 与地之间。应使用由 Teensy 控制的三极管/MOS 管驱动电路,线圈由自己的额定电源供电,并在线圈处设置合适的关断保护;也可以直接选一块已完成这些设计、明确兼容 3.3V 的模块。原因是线圈所需电流及关断时产生的电压冲击,不适合由 GPIO 直接承担。
四、带光耦的固态继电器模块
固态继电器(SSR)用电子器件开关负载,没有机械触点。这里有一个容易误解的地方:不少固态继电器本体已经通过内部发光器件传递控制信号;商家宣传的“带光耦”,可能只是模块输入端又加了一层光耦。因此仍须看具体型号和接线图,不能按广告标题判断隔离方式。
对俱乐部的 7.4V、12V、24V 直流电池负载,第一步不是接 Teensy,而是确认 SSR 输出端明确适用于直流负载。常见交流输出 SSR 不能拿来控制电池直流:撤去输入信号后,输出可能仍保持导通。
若某款直流输出、带光耦输入的 SSR 模块明确支持 3.3V 控制:
- 控制侧:Teensy GPIO 接模块控制输入;控制侧电源和地按该模块说明连接。若要保持真正隔离,不能擅自共地,且隔离侧须有符合要求的独立供电。
- 负载侧:在它允许的接线方式下,将直流输出端串接到被控支路的正极;有极性标记时严格遵守极性。负载负极仍按系统设计接回其电源负极。
- 控制方式:按该模块规定的高电平有效或低电平有效方式切换,不要根据“SSR 通常高电平触发”猜测。
还应确认其断开漏电流、导通发热、启动冲击和散热要求。SSR 的“关闭”不一定等同于机械触点的完全断开;小功率电子设备可能对漏电尤其敏感。
五、没有额外光耦的固态继电器模块
这类产品尤其要分两种看,不能简单归为同一种接法。
类型 A:SSR 本体具有规定的输入/输出隔离,只是模块没再加光耦
常见控制端标为 IN+、IN−。如果数据手册证明 3.3V 输入即可可靠导通、输入所需电流不超过 Teensy 的建议输出能力,可以按说明将 GPIO 接 IN+、Teensy GND 接 IN−,由 HIGH/LOW 控制。这里的 GND 是SSR 输入回路的返回端;不要把它与负载侧端子混淆。
但“输入范围包含 3.3V”与“GPIO 可以直接驱动”仍是两个问题:某些光学 MOS 继电器的推荐输入 LED 电流达到数毫安乃至更高,不能只看输入电压就决定直连。
如果输入要求 5V、12V 或超过 GPIO 可提供的电流,改用适当的三极管/MOS 管只驱动 SSR 的输入侧:
- SSR
IN+接其规定的输入电源正极; - SSR
IN−经驱动器件接回该输入电源负极; - Teensy GPIO 控制驱动器件;
- Teensy 与该驱动电路的输入侧按设计共地。
驱动器件导通时,SSR 输入回路才有电流;输入电源不得因共地接法而把 5V/12V 直接送入 Teensy GPIO。具体驱动电路应按 SSR 输入电流选型,而不能照搬一个固定电阻值。SSR 的负载侧是否隔离,仍以其自身规格和实际布线为准。
类型 B:商家称它为“固态继电器模块”,实际只是普通 MOS 开关板
这种板可能根本没有输入/输出隔离,有的还采用切负极的低边接法。此时应按照 MOS 开关模块核对共地要求、控制电平、输出接法和反向电流路径,不要按“隔离 SSR”接线。尤其不宜未经分析就用低边模块切断仍连接着 Teensy 信号线的舵机板、传感器板或计算机供电支路。
六、Teensy 4.1 控制程序示例
先用说明书和小负载测试,确定模块到底是 高电平有效还是 低电平有效。下面代码使用两个示例引脚:一个接已确认的低电平有效模块,另一个接已确认的高电平有效模块。它们可以是电磁继电器,也可以是满足前述输入条件的 SSR;代码不能解决硬件不兼容问题。Teensy 使用 pinMode() 设置输出、digitalWrite() 设置电平。
constexpr int RELAY_LOW_PIN = 2; // 已确认:LOW 接通,HIGH 断开
constexpr int SSR_HIGH_PIN = 3; // 已确认:HIGH 接通,LOW 断开
void setup() {
// 先设定希望的初始电平,再将引脚设为输出。
digitalWrite(RELAY_LOW_PIN, HIGH);
digitalWrite(SSR_HIGH_PIN, LOW);
pinMode(RELAY_LOW_PIN, OUTPUT);
pinMode(SSR_HIGH_PIN, OUTPUT);
}
void loop() {
// 示例:接通测试负载 1 秒,再断开 2 秒。
digitalWrite(RELAY_LOW_PIN, LOW);
digitalWrite(SSR_HIGH_PIN, HIGH);
delay(1000);
digitalWrite(RELAY_LOW_PIN, HIGH);
digitalWrite(SSR_HIGH_PIN, LOW);
delay(2000);
}
这段程序不保证上电到 setup() 执行之前始终断电。Teensy 的数字引脚起初不是由这段代码驱动的输出状态;面向机器人运动支路时,应另外设计经验证的硬件默认关闭状态,并测试 Teensy 尚未上电、复位、刷写程序和控制线脱落等情况。也不要将示例中的周期性开关直接用于电机、舵机电源或计算机供电。
七、给DIY机器人配电的实际建议
| 现有支路 | 如何使用这些模块更合适 |
|---|---|
| 电机驱动支路 | Teensy 用驱动器规定的接口控制运动。若还需要切断动力,另行设计经过直流负载选型和故障评估的开关及独立停机路径;普通继电器/SSR 模块不是急停的完整方案。 |
| 舵机降压与配电支路 | 先检查降压模块是否有合适的使能端。确需额外切断电源时,核对舵机启动冲击,并评估断电后机械臂失去保持力的后果。 |
| MCU、5V 元器件支路 | Teensy 自己所在的供电支路通常不应由 Teensy 唯一控制其断电。小型附件可分别控制,不要把“关掉附件”和“关掉控制器”混为一谈。 |
| Jetson/树莓派支路 | 先执行系统正常关机,再考虑受控切断电源;不把继电器或 SSR 当作日常关机命令。 |
最后的判断顺序是:先查模块具体型号和原理图,再查 Teensy 输入/输出兼容性,然后查负载侧的直流额定值,最后测试上电、断电和故障状态。特别是带光耦模块,务必说清楚自己得到的是“模块上有光耦”,还是经过独立供电和布线验证的“真正电气隔离”。
八、我要不要为继电器/开关电路并联一个二极管?
最直接确认的方式是用示波器测量控制信号在继电器开合时有没有发生波形突变。但也可以采用下面两条经验评估:
1、电磁继电器。一般来说,为继电器并联一个二极管或tvs管的目的是抑制继电器线圈断电/通电时产生的电压冲击,从而避免元件或MCU损坏,但是由于我们使用teensy 4.1作为控制MCU,它不能直接控制没有光耦或其他控制电路的继电器模块。而我们购买的光耦隔离模块通常不只是“一只继电器加一个光耦”:板上还可能有线圈驱动器、指示灯及续流元件,因此并不一定需要再额外并联一个二极管。具体要先查模块原理图或咨询商家,但大概率不需要。
2、固态继电器、PMOS 和 NMOS 模块没有电磁继电器的“线圈”,所以不需要照搬“线圈两端并续流二极管”的接法;但如果它们控制的是电磁阀、继电器线圈等感性负载,负载断电时仍可能产生电压冲击,仍需确认有没有合适的抑制措施。
但是,在我们的当前的机器人控制电路方案中,没有任何地方直接它们来控制上面所说的电磁阀、继电器线圈等感性负载,因此不需要。