当前位置: 首页 > article >正文

【鸿蒙开发】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安全点亮,且不影响线圈驱动。

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. 实验现象

下载程序前,按照如下接线
在这里插入图片描述

实验现象:继电器吸合一段时间后断开。

06. 附录


http://www.kler.cn/a/588664.html

相关文章:

  • 时序约束整理
  • 【sklearn 03】逻辑回归、决策树、支持向量机
  • 网页制作16-Javascipt时间特效の设置D-DAY倒计时
  • 【Node.js入门笔记5---fs文件信息与元数据】
  • 项目经历-笔记
  • perl的package中“Subroutine new redefined”问题
  • (六)Spring Boot学习——spring security做基于方法的认证
  • IMX6ULL学习整理篇——UBoot的一些基础知识(1.编译流程)
  • 使用yolov8+flask实现精美登录界面+图片视频摄像头检测系统
  • 电机控制常见面试问题(十一)
  • 【CSS】一、基础选择器
  • 蓝桥杯好题推荐---激光炸弹
  • 【蓝桥杯每日一题】3.16
  • 【Agent】OpenManus 项目架构分析
  • 技术栈分享之----Swagger
  • 专题|Python贝叶斯金融数据应用实例合集:随机波动率SV模型、逻辑回归、参数更新、绩效比较BEST分析亚马逊股票、普尔指数...
  • 思维训练让你更高、更强 |【逻辑思维能力】「刷题训练笔记」假设法模式逻辑训练题(6-16)
  • JVM常用概念之即时常量
  • Bash语言的智能家居
  • airtest用法