【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-定时器控制的流水灯】”感谢大家的支持!
本章附件:
大家好,我是『芯知识学堂』的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]