SingleYork 发表于 2025-4-17 09:18:49

【15系列】SYK-0806-A2S1 工业自动化控制之【04-输入输出点动控制】

大家好,我是『芯知识学堂』的SingleYork,前一篇文章给大家介绍了“SYK-0806-A2S1 工业自动化控制之【03-延时函数演示流水灯】”,

这一篇中,笔者要给大家介绍如何用板子上的输入口来点动控制板子的输出。

所谓的点动控制,顾名思义就是:

当有输入信号的时候,让对应的板子输出ON;

当没有输入信号的时候,让对应的板子输出OFF;

我们先来看下板子输入输出IO口分布情况:



关于输入、输出引脚的软件配置,其实在上一讲的“SYK-0806-A2S1 工业自动化控制之【03-延时函数演示流水灯】”,

中就有介绍过,在“bsp_gpio.c”文件的“void GPIO_Config(void)”函数中配置Y00-Y05输出的时候,实际上同时也将X00-X07输入也配置好了:

/************************ IO口配置 ****************************/
void GPIO_Config(void)
{
      GPIO_InitTypeDef      GPIO_InitStructure;                                                      //结构定义
   
    //Y00
    GPIO_InitStructure.Pin= Y00_GPIO_PIN;            //指定要初始化的IO
      GPIO_InitStructure.Mode = GPIO_OUT_PP;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(Y00_GPIO,&GPIO_InitStructure); //初始化
   
    //Y01
    GPIO_InitStructure.Pin= Y01_GPIO_PIN;            //指定要初始化的IO
      GPIO_InitStructure.Mode = GPIO_OUT_PP;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(Y01_GPIO,&GPIO_InitStructure); //初始化
   
    //Y02
    GPIO_InitStructure.Pin= Y02_GPIO_PIN;            //指定要初始化的IO
      GPIO_InitStructure.Mode = GPIO_OUT_PP;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(Y02_GPIO,&GPIO_InitStructure); //初始化
   
    //Y03
    GPIO_InitStructure.Pin= Y03_GPIO_PIN;            //指定要初始化的IO
      GPIO_InitStructure.Mode = GPIO_OUT_PP;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(Y03_GPIO,&GPIO_InitStructure); //初始化
   
    //Y04
    GPIO_InitStructure.Pin= Y04_GPIO_PIN;            //指定要初始化的IO
      GPIO_InitStructure.Mode = GPIO_OUT_PP;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(Y04_GPIO,&GPIO_InitStructure); //初始化
   
    //Y05
    GPIO_InitStructure.Pin= Y05_GPIO_PIN;            //指定要初始化的IO
      GPIO_InitStructure.Mode = GPIO_OUT_PP;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(Y05_GPIO,&GPIO_InitStructure); //初始化
   
    //X00
    GPIO_InitStructure.Pin= X00_GPIO_PIN;            //指定要初始化的IO
      GPIO_InitStructure.Mode = GPIO_PullUp;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(X00_GPIO,&GPIO_InitStructure); //初始化
   
    //X01
    GPIO_InitStructure.Pin= X01_GPIO_PIN;            //指定要初始化的IO
      GPIO_InitStructure.Mode = GPIO_PullUp;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(X01_GPIO,&GPIO_InitStructure); //初始化
   
    //X02
    GPIO_InitStructure.Pin= X02_GPIO_PIN;            //指定要初始化的IO
      GPIO_InitStructure.Mode = GPIO_PullUp;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(X02_GPIO,&GPIO_InitStructure); //初始化
   
    //X03
    GPIO_InitStructure.Pin= X03_GPIO_PIN;            //指定要初始化的IO
      GPIO_InitStructure.Mode = GPIO_PullUp;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(X03_GPIO,&GPIO_InitStructure); //初始化
   
    //X04
    GPIO_InitStructure.Pin= X04_GPIO_PIN;            //指定要初始化的IO
      GPIO_InitStructure.Mode = GPIO_PullUp;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(X04_GPIO,&GPIO_InitStructure); //初始化
   
    //X05
    GPIO_InitStructure.Pin= X05_GPIO_PIN;            //指定要初始化的IO
      GPIO_InitStructure.Mode = GPIO_PullUp;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(X05_GPIO,&GPIO_InitStructure); //初始化
   
    //X06
    GPIO_InitStructure.Pin= X06_GPIO_PIN;            //指定要初始化的IO
      GPIO_InitStructure.Mode = GPIO_PullUp;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(X06_GPIO,&GPIO_InitStructure); //初始化
   
    //X07
    GPIO_InitStructure.Pin= X07_GPIO_PIN;            //指定要初始化的IO
      GPIO_InitStructure.Mode = GPIO_PullUp;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
      GPIO_Inilize(X07_GPIO,&GPIO_InitStructure); //初始化
      
    Y00 = OutputT_OFF;
    Y01 = OutputT_OFF;
    Y02 = OutputT_OFF;
    Y03 = OutputT_OFF;
    Y04 = OutputT_OFF;
    Y05 = OutputT_OFF;
}



同样,GPIO引脚分布也是在“bsp_gpio.h”文件中定义好了:

#ifndef      __BSP_GPIO_H__
#define      __BSP_GPIO_H__

#include      "GPIO.h"

/****************** 输出GPIO ******************/
//Y00 - Y05
#define Y00                        P37
#define Y00_GPIO_PIN               GPIO_Pin_7
#define Y00_GPIO                   GPIO_P3

#define Y01                        P36
#define Y01_GPIO_PIN               GPIO_Pin_6
#define Y01_GPIO                   GPIO_P3

#define Y02                        P35
#define Y02_GPIO_PIN               GPIO_Pin_5
#define Y02_GPIO                   GPIO_P3

#define Y03                        P34
#define Y03_GPIO_PIN               GPIO_Pin_4
#define Y03_GPIO                   GPIO_P3

#define Y04                        P33
#define Y04_GPIO_PIN               GPIO_Pin_3
#define Y04_GPIO                   GPIO_P3

#define Y05                        P32
#define Y05_GPIO_PIN               GPIO_Pin_2
#define Y05_GPIO                   GPIO_P3

//X00 - X07
#define X00                        P12
#define X00_GPIO_PIN               GPIO_Pin_2
#define X00_GPIO                   GPIO_P1

#define X01                        P13
#define X01_GPIO_PIN               GPIO_Pin_3
#define X01_GPIO                   GPIO_P1

#define X02                        P14
#define X02_GPIO_PIN               GPIO_Pin_4
#define X02_GPIO                   GPIO_P1

#define X03                        P15
#define X03_GPIO_PIN               GPIO_Pin_5
#define X03_GPIO                   GPIO_P1

#define X04                        P16
#define X04_GPIO_PIN               GPIO_Pin_6
#define X04_GPIO                   GPIO_P1

#define X05                        P17
#define X05_GPIO_PIN               GPIO_Pin_7
#define X05_GPIO                   GPIO_P1

#define X06                        P54
#define X06_GPIO_PIN               GPIO_Pin_4
#define X06_GPIO                   GPIO_P5

#define X07                        P55
#define X07_GPIO_PIN               GPIO_Pin_5
#define X07_GPIO                   GPIO_P5

#define Input_ON                   0   //输入ON
#define Input_OFF                  1   //输入OFF

#define OutputT_ON               1   //晶体管输出ON
#define OutputT_OFF                0   //晶体管输出OFF

void GPIO_Config(void);

#endif


接下来我们看输入部分的硬件电路:



输入部分采用了光耦隔离,在光耦的左边,X00即为外部输出信号,根据光耦控制的原理不难看出:

当X00悬空或输入高电平(24V)时,光耦未导通,此时IN00为高电平;

当X00输入低电平(0V)时,光耦导通,此时IN00为低电平;

再来看输出部分的硬件电路:



输出部分是由一个N-MOS管来实现,根据N-MOS管的控制逻辑:

当OUT00为低电平时,N-MOS管AO3400未导通,此时Y00输出为高电平;

当OUT00为高电平时,N-MOS管AO3400导通,此时Y00输出为低电平;

根据文章开头说的,我们本例要实现的控制逻辑,我们可以得到如下代码:

void app_run(void)
{
    //X00有信号,Y00输出低电平;反之,Y00输出高电平
    if(!X00)
    {
      Y00 = OutputT_ON;
    }
    else
    {
      Y00 = OutputT_OFF;
    }
    //X01有信号,Y01输出低电平;反之,Y01输出高电平
    if(!X01)
    {
      Y01 = OutputT_ON;
    }
    else
    {
      Y01 = OutputT_OFF;
    }
    //X02有信号,Y02输出低电平;反之,Y02输出高电平
    if(!X02)
    {
      Y02 = OutputT_ON;
    }
    else
    {
      Y02 = OutputT_OFF;
    }
    //X03有信号,Y03输出低电平;反之,Y03输出高电平
    if(!X03)
    {
      Y03 = OutputT_ON;
    }
    else
    {
      Y03 = OutputT_OFF;
    }
    //X04或X05有信号,Y04输出低电平;X04或X05都没有信号,Y04输出高电平
    if(!X04||!X05)
    {
      Y04 = OutputT_ON;
    }
    else
    {
      Y04 = OutputT_OFF;
    }
    //X06或X07有信号,Y05输出低电平;X06或X07都没有信号,Y05输出高电平
    if(!X06||!X07)
    {
      Y05 = OutputT_ON;
    }
    else
    {
      Y05 = OutputT_OFF;
    }
}


上述代码中,有几个“if(!X04||!X05)”这样的语句,这里有一点需要注意一下,那就是运算符的优先级问题,关于C语音中运算符的优先级我们可以看下表:



从上表中我们可以知道,一元运算符“!”的优先级要比逻辑运算符“||”的优先级高,

因此此处要判断“X04或X05有信号”时,可以写成“if(!X04||!X05)”,

当然咯,有时候大家搞不清楚运算符的优先级又懒得去查表的话,也可以多写个括号,写成“if((!X04)||(!X05))”。

程序编译OK后,直接下载即可,然后我们就可以动手试下效果了:



好了,关于使用本节内容笔者就介绍到这里了,有疑问的小伙伴们可以给笔者留言或者直接参与评论,

下一节笔者将给大家介绍“如何利用定时器来实现流水灯效果”,详见“SYK-0806-A2S1 工业自动化控制之【05-定时器控制的流水灯】”感谢大家的支持!

本章附件:





国芯人工智能 发表于 2025-4-17 09:23:00

大家好,我是『芯知识学堂』的SingleYork,感谢大家对上篇文章的关注。在本篇中,我们将继续探讨SYK-0806-A2S1工业自动化控制的应用,具体讲解如何通过输入口实现点动控制输出。

点动控制的基本概念

点动控制(Jog Control)是一种常见的工业控制方式,其核心逻辑是:当输入信号有效时,对应的输出端口立即响应并保持ON状态;当输入信号无效时,输出端口则恢复为OFF状态。这种控制方式广泛应用于需要快速启停或短时操作的场景,例如电机点动、阀门控制等。

SYK-0806-A2S1的输入输出配置

在SYK-0806-A2S1开发板上,输入输出(I/O)端口的配置是通过软件实现的。在上一篇文章中,我们已经在bspgpioc文件的void GPIOConfig(void)函数中对Y00-Y05输出端口进行了配置,同时X00-X07输入端口也一并完成了初始化。以下是相关代码的简要说明:

c
// IO口配置
void GPIOConfig(void)
{
    GPIOInitTypeDef GPIOInitStructure; // 结构定义

    // Y00配置
    GPIOInitStructure.Pin = Y00GPIOPIN; // 指定要初始化的IO
    GPIOInitStructure.Mode = GPIOOUTPP; // 指定IO的输入或输出方式
    GPIOInit(&GPIOInitStructure); // 初始化IO

    // 其他输出端口配置(Y01-Y05)略...

    // X00-X07输入端口配置
    GPIOInitStructure.Pin = X00GPIOPIN | X01GPIOPIN | ... | X07GPIOPIN; // 指定输入端口
    GPIOInitStructure.Mode = GPIOINPULLUP; // 配置为输入模式,带上拉电阻
    GPIOInit(&GPIOInitStructure); // 初始化输入端口
}

点动控制的实现逻辑

在点动控制中,我们需要实时检测输入端口的状态,并根据状态变化控制输出端口。以下是实现点动控制的核心逻辑:

1. 输入端口状态检测:通过读取输入端口的状态(高电平或低电平)来判断是否有信号输入。
2. 输出端口控制:根据输入端口的状态,直接控制输出端口的ON或OFF状态。

以下是点动控制的示例代码:

c
void JogControl(void)
{
    // 检测X00输入状态
    if (GPIOReadInputPin(X00GPIOPIN) == GPIOPINSET) // 如果X00为高电平
    {
      GPIOWritePin(Y00GPIOPIN, GPIOPINSET); // Y00输出高电平(ON)
    }
    else // 如果X00为低电平
    {
      GPIOWritePin(Y00GPIOPIN, GPIOPINRESET); // Y00输出低电平(OFF)
    }

    // 其他输入输出点动控制逻辑(X01-Y01, X02-Y02等)略...
}

实际应用中的注意事项

1. 消抖处理:在实际应用中,机械开关或传感器可能会产生抖动,导致输入信号不稳定。因此,建议在检测输入状态时加入消抖处理,例如延时检测或软件滤波。
2. 响应速度:点动控制通常需要快速响应,因此应尽量减少代码中的延时操作,确保输出端口能够及时跟随输入信号的变化。
3. 安全性设计:在工业控制中,安全性至关重要。建议在关键控制逻辑中加入保护机制,例如超时检测、故障报警等,以防止意外情况发生。

总结

通过本文的介绍,我们了解了如何在SYK-0806-A2S1开发板上实现点动控制。点动控制作为一种简单而实用的控制方式,在工业自动化中具有广泛的应用场景。希望本文的内容能够帮助大家更好地掌握相关技术,并在实际项目中灵活运用。

如果您对本文内容有任何疑问或建议,欢迎在评论区留言讨论。感谢大家的支持,我们下期再见!

——SingleYork,『芯知识学堂』

[本文内容由国芯人工智能辅助生成,仅供参考]
页: [1]
查看完整版本: 【15系列】SYK-0806-A2S1 工业自动化控制之【04-输入输出点动控制】