找回密码
 立即注册
查看: 58|回复: 1

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

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-04-21 13:00:02

19

主题

9

回帖

217

积分

中级会员

积分
217
发表于 2025-4-17 09:18:49 | 显示全部楼层 |阅读模式
大家好,我是『芯知识学堂』的SingleYork,前一篇文章给大家介绍了“SYK-0806-A2S1 工业自动化控制之【03-延时函数演示流水灯】”,

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

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

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

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

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

01.png

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

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

  1. /************************ IO口配置 ****************************/
  2. void GPIO_Config(void)
  3. {
  4.         GPIO_InitTypeDef        GPIO_InitStructure;                                                        //结构定义
  5.    
  6.     //Y00
  7.     GPIO_InitStructure.Pin  = Y00_GPIO_PIN;            //指定要初始化的IO
  8.         GPIO_InitStructure.Mode = GPIO_OUT_PP;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  9.         GPIO_Inilize(Y00_GPIO,&GPIO_InitStructure); //初始化
  10.    
  11.     //Y01
  12.     GPIO_InitStructure.Pin  = Y01_GPIO_PIN;            //指定要初始化的IO
  13.         GPIO_InitStructure.Mode = GPIO_OUT_PP;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  14.         GPIO_Inilize(Y01_GPIO,&GPIO_InitStructure); //初始化
  15.    
  16.     //Y02
  17.     GPIO_InitStructure.Pin  = Y02_GPIO_PIN;            //指定要初始化的IO
  18.         GPIO_InitStructure.Mode = GPIO_OUT_PP;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  19.         GPIO_Inilize(Y02_GPIO,&GPIO_InitStructure); //初始化
  20.    
  21.     //Y03
  22.     GPIO_InitStructure.Pin  = Y03_GPIO_PIN;            //指定要初始化的IO
  23.         GPIO_InitStructure.Mode = GPIO_OUT_PP;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  24.         GPIO_Inilize(Y03_GPIO,&GPIO_InitStructure); //初始化
  25.    
  26.     //Y04
  27.     GPIO_InitStructure.Pin  = Y04_GPIO_PIN;            //指定要初始化的IO
  28.         GPIO_InitStructure.Mode = GPIO_OUT_PP;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  29.         GPIO_Inilize(Y04_GPIO,&GPIO_InitStructure); //初始化
  30.    
  31.     //Y05
  32.     GPIO_InitStructure.Pin  = Y05_GPIO_PIN;            //指定要初始化的IO
  33.         GPIO_InitStructure.Mode = GPIO_OUT_PP;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  34.         GPIO_Inilize(Y05_GPIO,&GPIO_InitStructure); //初始化
  35.    
  36.     //X00
  37.     GPIO_InitStructure.Pin  = X00_GPIO_PIN;            //指定要初始化的IO
  38.         GPIO_InitStructure.Mode = GPIO_PullUp;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  39.         GPIO_Inilize(X00_GPIO,&GPIO_InitStructure); //初始化
  40.    
  41.     //X01
  42.     GPIO_InitStructure.Pin  = X01_GPIO_PIN;            //指定要初始化的IO
  43.         GPIO_InitStructure.Mode = GPIO_PullUp;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  44.         GPIO_Inilize(X01_GPIO,&GPIO_InitStructure); //初始化
  45.    
  46.     //X02
  47.     GPIO_InitStructure.Pin  = X02_GPIO_PIN;            //指定要初始化的IO
  48.         GPIO_InitStructure.Mode = GPIO_PullUp;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  49.         GPIO_Inilize(X02_GPIO,&GPIO_InitStructure); //初始化
  50.    
  51.     //X03
  52.     GPIO_InitStructure.Pin  = X03_GPIO_PIN;            //指定要初始化的IO
  53.         GPIO_InitStructure.Mode = GPIO_PullUp;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  54.         GPIO_Inilize(X03_GPIO,&GPIO_InitStructure); //初始化
  55.    
  56.     //X04
  57.     GPIO_InitStructure.Pin  = X04_GPIO_PIN;            //指定要初始化的IO
  58.         GPIO_InitStructure.Mode = GPIO_PullUp;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  59.         GPIO_Inilize(X04_GPIO,&GPIO_InitStructure); //初始化
  60.    
  61.     //X05
  62.     GPIO_InitStructure.Pin  = X05_GPIO_PIN;            //指定要初始化的IO
  63.         GPIO_InitStructure.Mode = GPIO_PullUp;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  64.         GPIO_Inilize(X05_GPIO,&GPIO_InitStructure); //初始化
  65.    
  66.     //X06
  67.     GPIO_InitStructure.Pin  = X06_GPIO_PIN;            //指定要初始化的IO
  68.         GPIO_InitStructure.Mode = GPIO_PullUp;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  69.         GPIO_Inilize(X06_GPIO,&GPIO_InitStructure); //初始化
  70.    
  71.     //X07
  72.     GPIO_InitStructure.Pin  = X07_GPIO_PIN;            //指定要初始化的IO
  73.         GPIO_InitStructure.Mode = GPIO_PullUp;                //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  74.         GPIO_Inilize(X07_GPIO,&GPIO_InitStructure); //初始化
  75.       
  76.     Y00 = OutputT_OFF;
  77.     Y01 = OutputT_OFF;
  78.     Y02 = OutputT_OFF;
  79.     Y03 = OutputT_OFF;
  80.     Y04 = OutputT_OFF;
  81.     Y05 = OutputT_OFF;
  82. }
复制代码


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

  1. #ifndef        __BSP_GPIO_H__
  2. #define        __BSP_GPIO_H__
  3. #include        "GPIO.h"
  4. /****************** 输出GPIO ******************/
  5. //Y00 - Y05
  6. #define Y00                        P37
  7. #define Y00_GPIO_PIN               GPIO_Pin_7
  8. #define Y00_GPIO                   GPIO_P3
  9. #define Y01                        P36
  10. #define Y01_GPIO_PIN               GPIO_Pin_6
  11. #define Y01_GPIO                   GPIO_P3
  12. #define Y02                        P35
  13. #define Y02_GPIO_PIN               GPIO_Pin_5
  14. #define Y02_GPIO                   GPIO_P3
  15. #define Y03                        P34
  16. #define Y03_GPIO_PIN               GPIO_Pin_4
  17. #define Y03_GPIO                   GPIO_P3
  18. #define Y04                        P33
  19. #define Y04_GPIO_PIN               GPIO_Pin_3
  20. #define Y04_GPIO                   GPIO_P3
  21. #define Y05                        P32
  22. #define Y05_GPIO_PIN               GPIO_Pin_2
  23. #define Y05_GPIO                   GPIO_P3
  24. //X00 - X07
  25. #define X00                        P12
  26. #define X00_GPIO_PIN               GPIO_Pin_2
  27. #define X00_GPIO                   GPIO_P1
  28. #define X01                        P13
  29. #define X01_GPIO_PIN               GPIO_Pin_3
  30. #define X01_GPIO                   GPIO_P1
  31. #define X02                        P14
  32. #define X02_GPIO_PIN               GPIO_Pin_4
  33. #define X02_GPIO                   GPIO_P1
  34. #define X03                        P15
  35. #define X03_GPIO_PIN               GPIO_Pin_5
  36. #define X03_GPIO                   GPIO_P1
  37. #define X04                        P16
  38. #define X04_GPIO_PIN               GPIO_Pin_6
  39. #define X04_GPIO                   GPIO_P1
  40. #define X05                        P17
  41. #define X05_GPIO_PIN               GPIO_Pin_7
  42. #define X05_GPIO                   GPIO_P1
  43. #define X06                        P54
  44. #define X06_GPIO_PIN               GPIO_Pin_4
  45. #define X06_GPIO                   GPIO_P5
  46. #define X07                        P55
  47. #define X07_GPIO_PIN               GPIO_Pin_5
  48. #define X07_GPIO                   GPIO_P5
  49. #define Input_ON                   0   //输入ON
  50. #define Input_OFF                  1   //输入OFF
  51. #define OutputT_ON                 1   //晶体管输出ON
  52. #define OutputT_OFF                0   //晶体管输出OFF
  53. void GPIO_Config(void);
  54. #endif
复制代码


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

10.png

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

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

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

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

11.png

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

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

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

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

  1. void app_run(void)
  2. {
  3.     //X00有信号,Y00输出低电平;反之,Y00输出高电平
  4.     if(!X00)
  5.     {
  6.         Y00 = OutputT_ON;
  7.     }
  8.     else
  9.     {
  10.         Y00 = OutputT_OFF;
  11.     }
  12.     //X01有信号,Y01输出低电平;反之,Y01输出高电平
  13.     if(!X01)
  14.     {
  15.         Y01 = OutputT_ON;
  16.     }
  17.     else
  18.     {
  19.         Y01 = OutputT_OFF;
  20.     }
  21.     //X02有信号,Y02输出低电平;反之,Y02输出高电平
  22.     if(!X02)
  23.     {
  24.         Y02 = OutputT_ON;
  25.     }
  26.     else
  27.     {
  28.         Y02 = OutputT_OFF;
  29.     }
  30.     //X03有信号,Y03输出低电平;反之,Y03输出高电平
  31.     if(!X03)
  32.     {
  33.         Y03 = OutputT_ON;
  34.     }
  35.     else
  36.     {
  37.         Y03 = OutputT_OFF;
  38.     }
  39.     //X04或X05有信号,Y04输出低电平;X04或X05都没有信号,Y04输出高电平
  40.     if(!X04||!X05)
  41.     {
  42.         Y04 = OutputT_ON;
  43.     }
  44.     else
  45.     {
  46.         Y04 = OutputT_OFF;
  47.     }
  48.     //X06或X07有信号,Y05输出低电平;X06或X07都没有信号,Y05输出高电平
  49.     if(!X06||!X07)
  50.     {
  51.         Y05 = OutputT_ON;
  52.     }
  53.     else
  54.     {
  55.         Y05 = OutputT_OFF;
  56.     }
  57. }
复制代码


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

04.png

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

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

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

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

09.gif

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

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

本章附件:

【STC15系列】SYK-0806-A2S1- 04-输入输出点动控制.rar (57.91 KB, 下载次数: 1)



本帖被以下淘专辑推荐:

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 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输入端口也一并完成了初始化。以下是相关代码的简要说明:
  1. c
  2. // IO口配置
  3. void GPIOConfig(void)
  4. {
  5.     GPIOInitTypeDef GPIOInitStructure; // 结构定义
  6.     // Y00配置
  7.     GPIOInitStructure.Pin = Y00GPIOPIN; // 指定要初始化的IO
  8.     GPIOInitStructure.Mode = GPIOOUTPP; // 指定IO的输入或输出方式
  9.     GPIOInit(&GPIOInitStructure); // 初始化IO
  10.     // 其他输出端口配置(Y01-Y05)略...
  11.     // X00-X07输入端口配置
  12.     GPIOInitStructure.Pin = X00GPIOPIN | X01GPIOPIN | ... | X07GPIOPIN; // 指定输入端口
  13.     GPIOInitStructure.Mode = GPIOINPULLUP; // 配置为输入模式,带上拉电阻
  14.     GPIOInit(&GPIOInitStructure); // 初始化输入端口
  15. }
复制代码

点动控制的实现逻辑

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

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

以下是点动控制的示例代码:
  1. c
  2. void JogControl(void)
  3. {
  4.     // 检测X00输入状态
  5.     if (GPIOReadInputPin(X00GPIOPIN) == GPIOPINSET) // 如果X00为高电平
  6.     {
  7.         GPIOWritePin(Y00GPIOPIN, GPIOPINSET); // Y00输出高电平(ON)
  8.     }
  9.     else // 如果X00为低电平
  10.     {
  11.         GPIOWritePin(Y00GPIOPIN, GPIOPINRESET); // Y00输出低电平(OFF)
  12.     }
  13.     // 其他输入输出点动控制逻辑(X01-Y01, X02-Y02等)略...
  14. }
复制代码

实际应用中的注意事项

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

总结

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

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

——SingleYork,『芯知识学堂』

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 00:53 , Processed in 0.183292 second(s), 60 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表