(1)实验平台:

普中Hi3861鸿蒙物联网WIFI套件https://item.taobao.com/item.htm?id=829136021914(2)资料下载:普中科技-各型号产品资料下载链接


        前面章节我们已经介绍了使用 IO 口输出高低电平,本章我们通过另外一个实验来讲述单片机 IO 口的输出。通过单片机的一个 IO 口控制板载继电器,实现继电器的开和断控制。本章分为如下几部分内容:

 

14.1 实验介绍

14.1.1 实验简介

14.1.2 实验目的

14.1.3 GPIO 函数使用

14.2 硬件设计

14.3 软件设计

14.4 实验现象


14.1 实验介绍

14.1.1 实验简介

        继电器是一种电子控制器件,相当于一个开关,接在任意线上,断开状态下线就断开,没导通,闭合状态下线就接在一起,导通。通常使用继电器可实现小电流控制大电流,或者低压控制高压等设备。比如芯片的GPIO 输出电平是3.3V,要控制 24V 或者 220V 高压设备,可选择继电器。 继电器接线示意图如下所示:

        继电器接线示意图如下所示:

        默认情况下,常闭触点和公共触点是导通连接在一起的,当继电器工作后,公共触点和常闭触点就断开,然后常开触点和公共触点导通连接在一起,这就像开关一样。

14.1.2 实验目的

        继电器吸合一段时间后断开。

14.1.3 GPIO 函数使用

        参考  LED 实验章节

14.2 硬件设计

        本实验使用到硬件资源如下:

        (1)继电器模块

        (2)Hi3861 GPIO

        继电器模块电路如下所示:

        由图可知,P1 端子的 RELAY 脚为继电器控制端,要使继电器工作,只需给端子的RELAY脚输出一个高电平,因此可使用导线将芯片的IO口与P1端子的RELAY脚连接,通过 GPIO 输出高电平即可,若要继电器不工作,则输出低电平。P2端子为继电器接线端子,COM 为公共触点、NO 为常开触点、NC 为常闭触点。

14.3 软件设计

        将前面章节创建好的工程模板,复制一份,重命名为10_relay,如下所示:

        然后在如下路径下新建 bsp_led.c 和 bsp_led.h 文件:

        (1)修改 demo 文件夹下的 BUILD.gn 文件,如下所示:

        (2)添加工程编译文件路径,如下所示

        (3)修改 bsp_relay.c 文件,代码如下:

/**
 ****************************************************************************************************
 * @file        bsp_relay.c
 * @author      普中科技
 * @version     V1.0
 * @date        2024-06-05
 * @brief       继电器实验
 * @license     Copyright (c) 2024-2034, 深圳市普中科技有限公司
 ****************************************************************************************************
 * @attention
 *
 * 实验平台:普中-Hi3861
 * 在线视频:https://space.bilibili.com/2146492485
 * 公司网址:www.prechin.cn
 * 购买地址:
 *
 */

#include "bsp_relay.h"


//继电器初始化
void relay_init(void)
{
    hi_gpio_init();                                            // GPIO初始化
    hi_io_set_pull(RELAY_PIN, HI_IO_PULL_DOWN);                   // 设置GPIO下拉
    hi_io_set_func(RELAY_PIN, RELAY_GPIO_FUN);                   // 设置IO为GPIO功能
    hi_gpio_set_dir(RELAY_PIN, HI_GPIO_DIR_OUT);                // 设置GPIO为输出模式
}

        (4)修改 bsp_relay.h 文件,代码如下:

/**
 ****************************************************************************************************
 * @file        bsp_relay.h
 * @author      普中科技
 * @version     V1.0
 * @date        2024-06-05
 * @brief       继电器实验
 * @license     Copyright (c) 2024-2034, 深圳市普中科技有限公司
 ****************************************************************************************************
 * @attention
 *
 * 实验平台:普中-Hi3861
 * 在线视频:https://space.bilibili.com/2146492485
 * 公司网址:www.prechin.cn
 * 购买地址:
 *
 */

#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

        (5)修改 template.c 文件,代码如下:

/**
 ****************************************************************************************************
 * @file        template.c
 * @author      普中科技
 * @version     V1.0
 * @date        2024-06-05
 * @brief       继电器实验
 * @license     Copyright (c) 2024-2034, 深圳市普中科技有限公司
 ****************************************************************************************************
 * @attention
 *
 * 实验平台:普中-Hi3861
 * 在线视频:https://space.bilibili.com/2146492485
 * 公司网址:www.prechin.cn
 * 购买地址:
 *
 ****************************************************************************************************
 * 实验现象:继电器通电一段时间后断开
 *
 ****************************************************************************************************
 */

#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);

14.4 实验现象

        下载程序前,按照如下接线:

        将程序下载到开发板内(可参考“2.2.5 程序下载运行”章节),打开串口调试助手“\5--开发工具\4-串口调试助手\UartAssist.exe”,波特率设置为115200,实验现象:继电器吸合一段时间后断开。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐