0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32的铁路自动围栏系统设计

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2023-05-17 16:26 次阅读

一、项目背景

随着城市规模的不断扩大和交通运输方式的日益发展,铁路与公路的交叉口已经成为常见的场景。然而,这些交叉口往往存在一定的安全隐患,因为有时不易发现列车行进的情况,导致公路上的车辆或行人可能会无意中闯入铁路区域,从而引发重大交通事故。

为了解决这个问题,当前开发了一款基于STM32的铁路自动围栏系统。该系统采用了STM32F103RCT6作为主控芯片,并使用步进电机来控制铁路围栏的开启和闭合。同时,系统还配备了红外感应器,以便能够及时监测到列车的通过情况。

当系统监测到有列车即将通过铁路交叉口时,公路信号灯会立刻变为红灯,蜂鸣器也会发出警报声音,以提醒行人和车辆注意安全。同时,铁路两侧的围栏也会自动关闭,在列车通过后再次打开。这样,就能有效地防止公路车辆和行人误闯铁路区域,保障了路人的安全。

image-20230517104342760

二、系统设计

2.1 硬件部分

STM32F103RCT6主铁路自动围栏系统的硬件部分主要包括:STM32F103RCT6主控芯片、步进电机、红外感应器、信号灯、蜂鸣器。 【1】STM32F103RCT6主控芯片是整个系统的核心,负责控制围栏的开启和闭合、监测红外感应器的状态、控制信号灯的变化以及控制蜂鸣器的报警声音。

【2】步进电机是用来控制铁路围栏的开启和闭合的设备,其动力来源为驱动芯片ULN2003。

【3】红外感应器是用来监测列车的通过情况,当感应到列车时输出高电平信号,否则输出低电平信号。

【4】信号灯则用来提示道路行人和车辆当前状态,红灯表示停止,绿灯表示通行。

【5】蜂鸣器则是用来发出报警声音,提醒行人和车辆注意安全。

2.2 软件部分

程序主要分为四部分:系统初始化、红外感应器检测、铁路围栏控制和信号灯控制。

【1】系统初始化主要是对硬件进行初始化,包括设置STM32的时钟、GPIO口的初始化等。

【2】红外感应器检测部分则是对红外感应器进行监测,当感应到列车时输出高电平信号,程序通过读取该信号实现对铁路围栏的控制和信号灯的变化。

【3】铁路围栏控制部分主要是通过对步进电机的控制来实现围栏的开启和闭合。

【4】信号灯控制部分则是通过对GPIO口的控制来实现信号灯的变化,当感应到列车时,将信号灯变为红色,否则为绿色。

三、核心代码实现

3.1 28BYJ48步进电机代码

以下是使用STM32F103RCT6驱动28BYJ-48步进电机实现正反转控制并封装成子函数调用的完整代码实现过程。

首先,需要定义相关引脚和变量:

#include "stm32f10x.h"
​
#define IN1_PIN GPIO_Pin_0
#define IN2_PIN GPIO_Pin_1
#define IN3_PIN GPIO_Pin_2
#define IN4_PIN GPIO_Pin_3
​
GPIO_InitTypeDef GPIO_InitStructure;
​
uint8_t step = 0;

然后,编写初始化GPIO的代码:

void init_GPIO(void)
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
​
  GPIO_InitStructure.GPIO_Pin = IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

接着,编写正转和反转函数的代码:

void forward(void)
{
  switch(step)
   {
    case 0:
      GPIO_SetBits(GPIOA, IN1_PIN);
      GPIO_ResetBits(GPIOA, IN2_PIN | IN3_PIN | IN4_PIN);
      break;
    case 1:
      GPIO_SetBits(GPIOA, IN1_PIN | IN2_PIN);
      GPIO_ResetBits(GPIOA, IN3_PIN | IN4_PIN);
      break;
    case 2:
      GPIO_SetBits(GPIOA, IN2_PIN);
      GPIO_ResetBits(GPIOA, IN1_PIN | IN3_PIN | IN4_PIN);
      break;
    case 3:
      GPIO_SetBits(GPIOA, IN3_PIN | IN2_PIN);
      GPIO_ResetBits(GPIOA, IN1_PIN | IN4_PIN);
      break;
    case 4:
      GPIO_SetBits(GPIOA, IN3_PIN);
      GPIO_ResetBits(GPIOA, IN1_PIN | IN2_PIN | IN4_PIN);
      break;
    case 5:
      GPIO_SetBits(GPIOA, IN4_PIN | IN3_PIN);
      GPIO_ResetBits(GPIOA, IN1_PIN | IN2_PIN);
      break;
    case 6:
      GPIO_SetBits(GPIOA, IN4_PIN);
      GPIO_ResetBits(GPIOA, IN1_PIN | IN2_PIN | IN3_PIN);
      break;
    case 7:
      GPIO_SetBits(GPIOA, IN1_PIN | IN4_PIN);
      GPIO_ResetBits(GPIOA, IN2_PIN | IN3_PIN);
      break;
   }
  step++;
  if(step == 8)
   {
    step = 0;
   }
}
​
void backward(void)
{
  switch(step)
   {
    case 0:
      GPIO_SetBits(GPIOA, IN1_PIN | IN4_PIN);
      GPIO_ResetBits(GPIOA, IN2_PIN | IN3_PIN);
      break;
    case 1:
      GPIO_SetBits(GPIOA, IN4_PIN);
      GPIO_ResetBits(GPIOA, IN1_PIN | IN2_PIN | IN3_PIN);
      break;
    case 2:
      GPIO_SetBits(GPIOA, IN3_PIN | IN4_PIN);
      GPIO_ResetBits(GPIOA, IN1_PIN | IN2_PIN);
      break;
    case 3:
      GPIO_SetBits(GPIOA, IN3_PIN);
      GPIO_ResetBits(GPIOA, IN1_PIN | IN2_PIN | IN4_PIN);
      break;
    case 4:
      GPIO_SetBits(GPIOA, IN2_PIN | IN3_PIN);
      GPIO_ResetBits(GPIOA, IN1_PIN | IN4_PIN);
      break;
    case 5:
      GPIO_SetBits(GPIOA, IN2_PIN);
      GPIO_ResetBits(GPIOA, IN1_PIN | IN3_PIN | IN4_PIN);
      break;
    case 6:
      GPIO_SetBits(GPIOA, IN1_PIN | IN2_PIN);
      GPIO_ResetBits(GPIOA, IN3_PIN | IN4_PIN);
      break;
    case 7:
      GPIO_SetBits(GPIOA, IN1_PIN);
      GPIO_ResetBits(GPIOA, IN2_PIN | IN3_PIN | IN4_PIN);
      break;
   }
  step--;
  if(step == -1)
   {
    step = 7;
   }
}

最后,可以封装正转和反转函数成子函数:

void rotate_motor(int steps, int direction)
{
  int i = 0;
  for(i = 0; i < steps; i++)
     {
         if(direction == 0)
         {
             forward();
         }
         else if(direction == 1)
     {
         backward();
     }
 }
 ​
 void motor_stop(void)
 {
     GPIO_ResetBits(GPIOA, IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN);
 }

最后,可以在主函数中使用这些封装好的子函数:

int main(void)
{
  init_GPIO();
​
  // 正转200步
  rotate_motor(200, 0);
​
  // 反转100步
  rotate_motor(100, 1);
​
  // 停止电机
  motor_stop();
​
  while (1);
}

3.2 蜂鸣器报警代码

#include "stm32f10x.h"
#define BUZZER_GPIO_PIN GPIO_Pin_7 
#define BUZZER_GPIO_PORT GPIOC
​
void buzzer_init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
​
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  GPIO_InitStructure.GPIO_Pin = BUZZER_GPIO_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(BUZZER_GPIO_PORT, &GPIO_InitStructure);
}
​
void buzzer_on(void)
{
  GPIO_SetBits(BUZZER_GPIO_PORT, BUZZER_GPIO_PIN); // Buzzer on
}
​
void buzzer_off(void)
{
  GPIO_ResetBits(BUZZER_GPIO_PORT, BUZZER_GPIO_PIN); // Buzzer off
}

3.3 红外感应器代码

#include "stm32f10x.h"
#define IR_GPIO_PIN GPIO_Pin_1 
#define IR_GPIO_PORT GPIOA
​
void ir_init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  EXTI_InitTypeDef EXTI_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
​
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  GPIO_InitStructure.GPIO_Pin = IR_GPIO_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 下拉输入模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(IR_GPIO_PORT, &GPIO_InitStructure);
​
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);
​
  EXTI_InitStructure.EXTI_Line = EXTI_Line1; // 对应中断线 EXTI1
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; // 上升沿和下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
​
  NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; // 中断向量
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; // 抢占优先级2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; // 响应优先级3
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
​
void EXTI1_IRQHandler(void)
{
  if (EXTI_GetITStatus(EXTI_Line1) != RESET)
   {
    // Do something when IR sensor detects the train
    EXTI_ClearITPendingBit(EXTI_Line1);
   }
}

3.4 信号灯控制代码

#include "stm32f10x.h"
#define LED_GREEN_GPIO_PIN GPIO_Pin_6 
#define LED_GREEN_GPIO_PORT GPIOB
#define LED_RED_GPIO_PIN GPIO_Pin_7 
#define LED_RED_GPIO_PORT GPIOB
​
void led_init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
​
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  GPIO_InitStructure.GPIO_Pin = LED_GREEN_GPIO_PIN | LED_RED_GPIO_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}
​
void led_green_on(void)
{
  GPIO_SetBits(LED_GREEN_GPIO_PORT, LED_GREEN_GPIO_PIN); // Green LED on
}
​
void led_green_off(void)
{
  GPIO_ResetBits(LED_GREEN_GPIO_PORT, LED_GREEN_GPIO_PIN); // Green LED off
}
​
void led_red_on(void)
{
  GPIO_SetBits(LED_RED_GPIO_PORT, LED_RED_GPIO_PIN); // Red LED on
}
​
void led_red_off(void)
{
  GPIO_ResetBits(LED_RED_GPIO_PORT, LED_RED_GPIO_PIN); // Red LED off
}

四、总结

当前设计的这种基于STM32的铁路自动围栏系统,通过对铁路交叉口进行有效的监测和控制,实现了对过往车辆和行人的有效防护。该系统采用STM32F103RCT6作为主控芯片,使用步进电机控制铁路围栏的开启和闭合,使用红外感应器来监测列车的通过情况。在公路与铁路的交叉路口,若在远处感应到有列车即将通过,则公路信号灯变为红灯,蜂鸣器报警,铁路两侧围栏自动闭合;直至感应到列车彻底离开,公路信号灯变为绿灯,蜂鸣器关闭,围栏打开。系统具有结构简单、性能可靠等优点,在实际应用中取得了良好的效果。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    449

    文章

    48573

    浏览量

    413079
  • STM32
    +关注

    关注

    2249

    文章

    10725

    浏览量

    350314
  • 步进电机
    +关注

    关注

    149

    文章

    2987

    浏览量

    146417
  • 铁路
    +关注

    关注

    1

    文章

    60

    浏览量

    17846
  • 单片机
    +关注

    关注

    0

    文章

    175

    浏览量

    16658
收藏 人收藏

    评论

    相关推荐

    煤矿人员定位系统——基于UWB技术带电子围栏功能

    要求掘进面等位置必须要配套电子围栏功能,包括但不限于激光雷达、UWB、视频分析等方式,后续贵州等省份也都在陆续跟进,这就对人员定位系统提出了更高的要求。  深圳市硅传科技有限公司研发的UWB人员定位
    发表于 06-27 15:11

    铁路通信资源管理系统

    摘要:提出并研究了一种以专业的图形化设计管理软件VisualNet为平台,无需编程和二次开发,进行铁路通信资源管理系统的构建过程。介绍了铁路通信设备图库的建库方法、设计过程,以及怎样利用该系统
    发表于 12-13 14:44

    铁路建设新帮手——机器视觉检测系统

    视觉的长项,相比起其他的科技工艺可以说是钢轨表面监测项目中的佼佼者。机器视觉系统能够获取高速运动的钢轨表面图像并进行缺陷表面的自动检测,为钢轨表面缺陷检测提供一种成本低、检测精度高的快速有效途径。铁道线
    发表于 04-18 15:47

    机器视觉与铁路安全的未来-如何减少列车事故

    视觉技术为铁路自动监测系统提供了一种可能,系统通过使用多种成像技术可以记录和报告列车、铁轨和基础设施的状况,如图1所示。通过检查铁轨、机车和车辆的缺陷可以提高
    发表于 12-01 16:38

    SKYLAB助力共享单车搭建电子围栏系统

    划定一个区域,系统后台会检测单车用户是否将单车停放在该区域内,从而对单车停放实现统一管理。 电子围栏是否实用的关键点就在于对停车区域识别的精准度上。以目前的OFO小黄车为例,它采用的就是北斗导航提出
    发表于 07-27 11:55

    电子围栏有什么功能?

    电子围栏按其在现场的安装位置,分为独立式,附属式和墙顶式三种基本安装形式。独立式电子围栏,直接架设在地面上。其高度约2米左右,一般安装10-12根线缆。考虑到设备和人身安全,要求在独立式电 子围栏的一侧或两侧,安装不低于1.2m
    发表于 10-11 09:01

    嵌入式系统铁路道口报警系统中有哪些应用?

    系统是一种工业控制领域用途广泛的系统软件,有着大家熟悉和友好的用户界面、统一的编程界面、强大的通讯功能而成为道口自动报警系统改型中首选的操作系统
    发表于 11-05 07:00

    强固型平板终端在铁路货运调度系统中的应用

    一、系统概述 随着国家铁路建设的飞速发展,铁路货运系统自动化程度已经从初级阶段向高级阶段发展,整体水平已经达到世界先进水平。而货运编组站的
    发表于 07-16 11:59 658次阅读
    强固型平板终端在<b class='flag-5'>铁路</b>货运调度<b class='flag-5'>系统</b>中的应用

    铁路供电系统的特点及其配电自动化应用分析

    1.铁路供电系统的特点 因为应用对象的特殊性。铁路供电系统在构成和功能上有一些独自的特点。主要以下方面: 1.1变(配)电所结构单一,功能基本相同 从地方供电
    发表于 10-19 15:37 7次下载
    <b class='flag-5'>铁路</b>供电<b class='flag-5'>系统</b>的特点及其配电<b class='flag-5'>自动</b>化应用分析

    综合自动化技术在铁路变配电所的应用

    鉴于综合自动化技术在铁路变配电所的应用,对提高贯通(自闭) 线供电的可靠性,保障铁路远输安全起到了关键的作用,因此结合以往设计的工程项目,简单阐述铁路变配电所综合
    发表于 10-20 09:15 12次下载
    综合<b class='flag-5'>自动</b>化技术在<b class='flag-5'>铁路</b>变配电所的应用

    浅谈脉冲电子围栏系统的组成及功能

    AILIFU艾礼富脉冲电子围栏系统组成主要由电子围栏主机、前端配件(终端杆、中间承力杆、终端杆绝缘子、承力杆绝子、高压避雷器、高压线、合金线、围栏警示牌、线线连接器、万向底座、避雷器支
    发表于 04-01 11:41 1256次阅读

    张力式电子围栏在周界报警系统中的应用

    张力式电子围栏是一种防止人体攀爬、翻越的物理围栏,通过感知前端攀爬、剪断、破坏围栏入侵的智能装置,是一种新型周界防范入侵报警系统,一种有形的围栏
    发表于 03-03 14:10 905次阅读
    张力式电子<b class='flag-5'>围栏</b>在周界报警<b class='flag-5'>系统</b>中的应用

    铁路交通自动控制系统开源

    电子发烧友网站提供《铁路交通自动控制系统开源.zip》资料免费下载
    发表于 01-31 14:06 0次下载
    <b class='flag-5'>铁路</b>交通<b class='flag-5'>自动控制系统</b>开源

    铁路10kV变配电所综合自动系统的应用

    摘要: 目前,在先进技术手段的推动下,国内铁路10kV变配电系统自动化程度逐渐提升,进一步增强了铁路的管理运营效深本文将对铁路供电
    的头像 发表于 04-01 13:24 255次阅读
    <b class='flag-5'>铁路</b>10kV变配电所综合<b class='flag-5'>自动</b>化<b class='flag-5'>系统</b>的应用

    变配电所综合自动系统铁路上有什么应用

    z张欣 安科瑞电气股份有限公司 上海嘉定 201801 摘要:目前,在先进技术手段的推动下,国内铁路10kV变配电系统自动化程度逐渐提升,进一步增强了铁路的管理运营效深本文将对
    的头像 发表于 04-03 15:09 236次阅读
    变配电所综合<b class='flag-5'>自动</b>化<b class='flag-5'>系统</b>在<b class='flag-5'>铁路</b>上有什么应用