【鸿蒙开发】Hi3861学习笔记- GPIO之继电器
00. 目录
文章目录
- 00. 目录
- 01. GPIO概述
- 02. 继电器概述
- 03. 硬件设计
- 04. 软件设计
- 05. 实验现象
- 06. 附录
01. GPIO概述
GPIO(General-purpose input/output)即通用型输入输出。通常,GPIO控制器通过分组的方式管理所有GPIO管脚,每组GPIO有一个或多个寄存器与之关联,通过读写寄存器完成对GPIO管脚的操作。
基本概念
GPIO又俗称为I/O口,I指的是输入(in),O指的是输出(out)。可以通过软件来控制其输入和输出,即I/O控制。
-
GPIO输入
输入是检测各个引脚上的电平状态,高电平或者低电平状态。常见的输入模式有:模拟输入、浮空输入、上拉输入、下拉输入。
-
GPIO输出
输出是当需要控制引脚电平的高低时需要用到输出功能。常见的输出模式有:开漏输出、推挽输出、复用开漏输出、复用推挽输出。
02. 继电器概述
继电器是一种电子控制器件,相当于一个开关,接在任意线上,断开状态下线就断开,没导通,闭合状态下线就接在一起,导通。通常使
用继电器可实现小电流控制大电流,或者低压控制高压等设备。比如芯片的 GPIO 输出电平是 3.3V,要控制 24V 或者 220V 高压设备,
可选择继电器。
继电器接线示意图如下所示:
默认情况下,常闭触点和公共触点是导通连接在一起的,当继电器工作后,公共触点和常闭触点就断开,然后常开触点和公共触点导通连
接在一起,这就像开关一样。
03. 硬件设计
由图可知,P1 端子的 RELAY 脚为继电器控制端,要使继电器工作,只需给端子的RELAY脚输出一个高电平,因此可使用导线将芯片的IO
口与P1端子的RELAY脚连接,通过 GPIO 输出高电平即可,若要继电器不工作,则输出低电平。P2 端子为继电器接线端子,COM 为公共
触点、NO 为常开触点、NC 为常闭触点。
继电器吸合条件分析
根据电路描述和元件布局,继电器(RK1)的吸合由以下关键条件决定:
1. 控制信号触发线圈通电
- 核心条件:继电器线圈(RK1)必须通电,电流需达到其吸合阈值(通常由线圈电阻和驱动电压决定)。
- 触发路径:
- 控制信号(如微控制器的GPIO引脚P2输出高电平)驱动开关元件(如三极管DD1),使VCC5(5V电源)→ 继电器线圈(RK1)→ 开关元件(DD1)→ 地(GND)形成闭合回路。
- 示例:当P2输出高电平时,三极管导通,电流流经线圈RK1,磁场产生,触点吸合。
2. 电流路径验证
- 线圈驱动电路:
- 继电器线圈直接由VCC5供电,驱动电流由控制信号通过开关元件(如三极管或MOSFET)控制。
- 关键参数:假设线圈电阻为R_coil,VCC5=5V,则驱动电流需满足:Icoil=RcoilVCC5−Vswitch其中 Vswitch 为开关元件压降(如三极管饱和压降约0.2V)。
- LED指示电路:
- LED(DK1)与电阻R10(1kΩ)串联,可能并联在线圈两端作为状态指示。
- 当线圈通电时,LED亮起,电流路径为:VCC5 → LED(DK1)→ R10 → 地。
- 限流计算:LED压降约2V,则限流电阻R10的电流为:ILED=R10VCC5−VLED=1kΩ5V−2V=3m**A确保LED安全点亮,且不影响线圈驱动。
- LED(DK1)与电阻R10(1kΩ)串联,可能并联在线圈两端作为状态指示。
3. 保护电路的作用
- 续流二极管(IN4148):
- 并联在线圈两端,阴极接VCC5侧,阳极接开关元件侧。
- 功能:当控制信号关闭(如P2变为低电平)时,线圈产生的反向电动势通过二极管释放,避免击穿开关元件。
4. 触点动作逻辑
- 吸合状态:
- 线圈通电时,COM触点与NO(常开触点)闭合,与NC(常闭触点)断开。
- 电路切换:主电路通过COM→NO导通(如控制外部负载通电)。
- 释放状态:
- 线圈断电时,COM触点复位至NC,NO断开。
04. 软件设计
bsp_relay.h
#ifndef BSP_RELAY_H
#define BSP_RELAY_H
#include "cmsis_os2.h"
#include "hi_io.h"
#include "hi_gpio.h"
//管脚定义
#define RELAY_PIN HI_IO_NAME_GPIO_14
#define RELAY_GPIO_FUN HI_IO_FUNC_GPIO_14_GPIO
#define RELAY(a) hi_gpio_set_ouput_val(RELAY_PIN,a)
//函数声明
void relay_init(void);
#endif
bsp_relay.c
#include "bsp_beep.h"
//蜂鸣器初始化
void beep_init(void)
{
hi_gpio_init(); // GPIO初始化
hi_io_set_pull(BEEP_PIN, HI_IO_PULL_UP); // 设置GPIO上拉
hi_io_set_func(BEEP_PIN, BEEP_GPIO_FUN); // 设置IO为GPIO功能
hi_gpio_set_dir(BEEP_PIN, HI_GPIO_DIR_OUT); // 设置GPIO为输出模式
}
//蜂鸣器报警
void beep_alarm(uint16_t cnt,uint16_t time)
{
while(cnt--)
{
BEEP(1);
usleep(time);
BEEP(0);
usleep(time);
}
}
template.c
#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "bsp_relay.h"
//继电器任务
osThreadId_t RELAY_Task_ID; //任务ID
void RELAY_Task(void)
{
relay_init();//继电器初始化
RELAY(1);//继电器吸合
sleep(3);//延时3S
RELAY(0);//继电器断开
while (1)
{
usleep(10*1000);
}
}
//继电器任务创建
void relay_task_create(void)
{
osThreadAttr_t taskOptions;
taskOptions.name = "RELAYTask"; // 任务的名字
taskOptions.attr_bits = 0; // 属性位
taskOptions.cb_mem = NULL; // 堆空间地址
taskOptions.cb_size = 0; // 堆空间大小
taskOptions.stack_mem = NULL; // 栈空间地址
taskOptions.stack_size = 1024; // 栈空间大小 单位:字节
taskOptions.priority = osPriorityNormal; // 任务的优先级
RELAY_Task_ID = osThreadNew((osThreadFunc_t)RELAY_Task, NULL, &taskOptions); // 创建任务1
if (RELAY_Task_ID != NULL)
{
printf("ID = %d, Create RELAY_Task_ID is OK!\n", RELAY_Task_ID);
}
}
/**
* @description: 初始化并创建任务
* @param {*}
* @return {*}
*/
static void template_demo(void)
{
printf("-Hi3861开发板--继电器实验\r\n");
relay_task_create();//继电器任务
}
SYS_RUN(template_demo);
05. 实验现象
下载程序前,按照如下接线
实验现象:继电器吸合一段时间后断开。