大家好!在之前的教程中,我们已经掌握了如何用 DSP 发出光(LED)和声(蜂鸣器)这些“信号级”的控制。今天,我们将迈出至关重要的一步,学习如何用微弱的数字信号去控制一个“能量级”的开关——继电器。
驱动继电器意味着我们可以用 DSP 来控制那些远超其 IO 口承受能力的设备,比如 220V 的电灯、电风扇、电磁阀等。这为我们打开了通向实际应用和工业控制的大门。
硬件揭秘:小电流如何控制大电流?
继电器本质上是一个电磁开关。它用一个小电流去控制一个电磁铁,通过电磁铁的吸合与释放,来接通或断开另一个完全独立的电路。这实现了低压部分(如DSP)与高压部分(如市电)之间的安全隔离。
1. 驱动电路与工作流程
让我们来解析这个电路的核心部分:
-
控制信号 RELAY: 这是来自我们 DSP 的命令信号。
-
驱动芯片 U1: ULN2003D: 和驱动蜂鸣器一样,DSP 的 IO 口电流不足以直接驱动继电器的线圈,所以我们再次使用了达林顿驱动芯片 ULN2003D 来放大电流。
-
信号流向: RELAY 信号进入 ULN2003D 的 IN5 端,从 OUT5 端输出,去控制继电器 RK1 的线圈。
-
控制逻辑: 记住,ULN2003D 是一个反相器。
-
当 RELAY (DSP引脚) 输出高电平时,OUT5 被拉到低电平,电流从 D5V -> 继电器线圈 -> OUT5 -> GND,形成回路。
-
线圈通电后产生磁性,吸引衔铁,使开关动作。
-
当 RELAY 输出低电平时,OUT5 悬空,线圈断电,开关在弹簧作用下复位。
-
-
续流二极管 DD1: 这是个至关重要的保护元件!继电器的线圈本质上是个电感,电感在断电的瞬间会产生一个很高的反向电动势,这个电压足以击穿驱动芯片。DD1 (IN4148) 在此时导通,为这个瞬时电流提供一个释放回路,从而保护了 ULN2003D。
2. 认识继电器的“触点”
继电器的输出端通常有三个引脚,我们通过 PCB 布局图可以更直观地认识它们:
-
COM (Common): 公共端。
-
NC (Normally Closed): 常闭端。在线圈未通电(默认状态)时,COM 和 NC 是接通的。
-
NO (Normally Open): 常开端。在线圈未通电时,COM 和 NO 是断开的。
当我们执行 RELAY_ON(给线圈通电)时,继电器动作,内部开关会切换:COM 和 NC 断开,COM 和 NO 接通。外部设备就可以连接在 P1 连接器的 COM 和 NO 或 NC 端,以实现通电接通或通电断开的逻辑。
3. DSP 引脚映射
根据原理图,我们的 RELAY 控制信号连接到了 DSP 的 GPIO15,它同样属于 GPIOA 端口组。
软件编码:发送控制指令
代码部分与之前 GPIO 的实验非常相似,主要就是对 GPIO15 进行初始化和控制。
1. 头文件 (relay.h)
#ifndef RELAY_H_
#define RELAY_H_
#include "DSP2833x_Device.h" // DSP2833x 头文件
#include "DSP2833x_Examples.h" // DSP2833x 例子相关头文件
// 根据硬件分析,GPIO15 输出高电平,驱动 ULN2003D,继电器线圈通电
#define RELAY_ON (GpioDataRegs.GPASET.bit.GPIO15=1)
// GPIO15 输出低电平,继电器线圈断电
#define RELAY_OFF (GpioDataRegs.GPACLEAR.bit.GPIO15=1)
void Relay_Init(void); // 继电器初始化函数声明
#endif /* RELAY_H_ */
2. 初始化函数 (relay.c)
这个函数将 GPIO15 初始化为通用输出模式。
#include "relay.h"
void Relay_Init(void)
{
EALLOW; // 关闭写保护
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // 开启GPIO时钟
// 继电器端口配置 (GPIO15)
// 选为通用 GPIO 功能
GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 0;
// 设置为输出方向
GpioCtrlRegs.GPADIR.bit.GPIO15 = 1;
// 使能内部上拉电阻
GpioCtrlRegs.GPAPUD.bit.GPIO15 = 0;
EDIS; // 开启写保护
// 程序启动时,默认让继电器处于关闭(断电)状态
GpioDataRegs.GPACLEAR.bit.GPIO15 = 1;
}
3. 主函数 (main.c)
在主函数中,我们初始化继电器后,直接将其打开,并保持该状态。
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include "leds.h"
#include "relay.h"
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无*******************************************************************************/
void main()
{
int i=0;
InitSysCtrl(); // 系统初始化
// 外设初始化
LED_Init();
Relay_Init();
RELAY_ON; // 打开继电器
while(1)
{
i++;
// LED 闪烁,证明程序在持续运行
if(i % 200 == 0)
{
LED1_TOGGLE;
}
DELAY_US(1000);
}
}
实验验证与后续探索
将这段程序下载到开发板后,你应该能清晰地听到继电器发出“嗒”的一声。这就是线圈通电后,衔铁吸合撞击的声音。
你可以使用万用表的蜂鸣档或电阻档来验证开关状态的变化:
-
程序运行前 (断电状态): 测量 P1 连接器的 COM 和 NC 脚,应该是导通的。测量 COM 和 NO 脚,应该是断开的。
-
程序运行后 (RELAY_ON): 测量 COM 和 NC 脚,应该变为断开。测量 COM 和 NO 脚,应该变为导通。
接下来可以做什么?
-
实现翻转控制: 尝试修改 main 函数中的 while(1) 循环,让继电器每隔一段时间(比如1秒)就 RELAY_TOGGLE 一次,听听它连续“嗒嗒”作响的声音。
-
按键控制: 结合我们后续会讲到的按键输入,实现按一下按键,继电器吸合;再按一下,继电器释放的功能。
-
连接外部设备: (注意安全!) 在专业人士指导下,你可以尝试用继电器去控制一个由独立电源供电的小风扇或 LED 灯带,真正实现用 DSP 控制一个实际的物理设备。
总结
恭喜你,你已经成功地用 DSP 控制了一个继电器!本次实验你掌握了:
-
继电器的工作原理和其在电路中的作用。
-
ULN2003D 驱动和续流二极管保护的重要性。
-
如何使用 GPIO 控制继电器的吸合与释放。
你与现实世界的交互又进了一步。从这里开始,通往更复杂、更实用的项目,如温控风扇、定时开关、电机控制等的大门已经为你敞开!