STM32F407-限位金属传感器限制步进电机

2023-05-16

一、硬件

1.硬件准备:57步进电机(型号57CM18),42步进电机,驱动器TB6600,开发板STM32F407ZGT6,SN-4NDO限位金属传感器,检测面在9mm左右。

步进电机和驱动器在STM32F407-用TB6600驱动器驱动57步进电机(代码+连线)已经记录过了,本文主要记录限位传感器。

2.连线

虽然说是传感器,但其实就是一个开关量,就跟光电开关一样。有两种接法:

  • PNP接法

蓝线接地,棕线接电源,黑色线作为输出接入开发板作为输入,在PNP接法中,常态黑色线为低电平,当传感器检测到物体时,会输出24V正电压。 

NPN接法差别就是检测到物体时,黑线输出的是负电压。

我这里将传感器的黑线输出连接至KEY0作为对开发板的输入,当检测到物体时,PB0引脚会变为低电平。原理图不能贴出来。(也就是用一个IO的电平高低去检测)

二、代码 

1. 因为检测到金属后黑线电压会变,所以我就想着用AD去采集电压,结果老师要求不让用AD,规定用中断去解决,于是就准备直接获取GPIO的电平状态,当电平转为低电平说明检测到金属,这个时候控制电机停止。

2.初始化配置

void EXTIX_Init(void)
{
	
	//PB0使用Exit0号中断线,PG1使用Exit1,PC2使用Exit2,PA3使用Exit3
	NVIC_InitTypeDef   NVIC_InitStructure;
	EXTI_InitTypeDef   EXTI_InitStructure;
	GPIO_InitTypeDef   GPIO_InitStructure;
	

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOG|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOB,GPIOG,GPIOC,GPIOA时钟
 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟(中断需要使用AFIO时钟)
	
	
	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PB0对应IO配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB0
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PG1对应IO配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化GPIOG1
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PC2对应IO配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC2
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PA3对应IO配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA3
	
 
 
 
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource0);//PB0 连接到中断线0
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOG, EXTI_PinSource1);//PG1 连接到中断线1
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource2);//PC2 连接到中断线2
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource3);//PA3 连接到中断线3
	
	//配置0号中断线
  EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line1 | EXTI_Line2 | EXTI_Line3;//LINE0
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
	//初始状态为低电平,当检测到物体时,KEY0输出高电平,此时INT0导通,变为低电平,即从上升沿跳变至下降沿时触发
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; 
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE0
  EXTI_Init(&EXTI_InitStructure);//配置
	
 
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//PB0对应的外部中断0
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//不区分优先级,只需要电平转换时进入中断即可
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);//配置
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;//外部中断2
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级3
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;//子优先级2
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);//配置
	
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//外部中断3
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;//子优先级2
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);//配置
	
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//外部中断4
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级1
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;//子优先级2
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);//配置
	   
}

3.IO口电平检测 

u8 Check_Sensor_State(void)
{
	 
    //高电平没有检测到
    if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == SET) 
    {
      return NO_Tagger;
    }
    //低电平检测到
    else
    {
      return Tagger;    
    }  
 }

3.中断服务函数(四个中断都差不多)

void EXTI0_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line0) == SET)
  {
    //可以停止,可以反转
    EXTI_ClearITPendingBit(EXTI_Line0);
  }
}

4.结果

最开始电机在正常运行,当用金属挡在传感器前时,黑色线输出正电压,PB0变为低电平,检测函数检测到电平发生变化,进入中断,停止电机或者反转都行,拿开物体后,电机恢复原来的运动状态。

中断服务函数里面可以根据具体需求来写,可以正转反转停止各种,我这里主函数开始一直让电机顺时针旋转,当检测到物体后进入中断,调取中断服务函数,打印一下exti(代码写成exit了)提示信息 ,然后设置电机进行逆时针旋转,当传感器没有被遮挡后,又恢复顺时针旋转。

完整项目(步进电机驱动+限位传感器)下载地址:https://download.csdn.net/download/qq_41573860/12657848

42,57双电机+4传感器项目下载地址:

csdn:https://download.csdn.net/download/qq_41573860/12679168

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F407-限位金属传感器限制步进电机 的相关文章

随机推荐

  • 二叉树最大深度与最小深度

    给定一个二叉树 xff0c 找出其最大深度 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数 说明 叶子节点是指没有子节点的节点 示例 xff1a 给定二叉树 3 9 20 null null 15 7 xff0c 3 9 20 15
  • 买卖股票的最佳时机①

    给定一个数组 xff0c 它的第 i 个元素是一支给定股票第 i 天的价格 如果你最多只允许完成一笔交易 xff08 即买入和卖出一支股票 xff09 xff0c 设计一个算法来计算你所能获取的最大利润 注意你不能在买入股票前卖出股票 示例
  • 图像语义分割原理及常用方法

    1图像语义分割的概念 1 1图像语义分割的概念与原理 图像语义分割可以说是图像理解的基石性技术 xff0c 在自动驾驶系统 xff08 具体为街景识别与理解 xff09 无人机应用 xff08 着陆点判断 xff09 以及穿戴式设备应用中举
  • TensorFlow基础篇

    1 TensorFlow 是什么 是一个深度学习库 xff0c 由 Google 开源 xff0c 可以对定义在 Tensor 张量 上的函数自动求导 Tensor 张量 意味着 N 维数组 xff0c Flow 流 意味着基于数据流图的计
  • 从国外官网github下载各种软件安装包项目太慢怎么办

    1 网速太慢 xff0c 被限速经常失败 xff0c 复制下面网址到迅雷下载 2 更改下载源 pip install selenium i http pypi douban com simple 还有多个其他下载源清华的下载源好像不能用了
  • 深度学习-神经网络编程使用过程中的问题汇总。

    1 pip安装下载速度慢 xff0c 不稳定容易失败等问题 第一个方法是改变下载源 pip install selenium i http pypi douban com simple 还有多个其他下载源清华的下载源好像不能用了 xff0c
  • Tensorflow问题之赋值失败为空值

    import tensorflow as tf a 61 tf zeros 2 3 b 61 tf ones 4 c 61 tf fill 2 2 9 print 34 a 34 a print 34 b 34 b print 34 c 3
  • 神经网络----TF1与TF2代码实现鸢尾花分类

    运行环境 xff1a python3 6 5 43 tensorflow1 13 2 python3 7 43 tensorflow2 0 Tensorflow1 xff1a 1 首先加载鸢尾花数据集 xff0c 读入输入特征以及标签 直接
  • 语义分割权重h5文件下载失败问题

    这个问题困扰我很久 xff0c 所以单拿出来记录以泄我心头之恨 xff0c 从github上下载预训练权重太慢 xff0c 经常发生timeout错误导致下载失败 xff0c 查了好多网站都没办法解决我的问题 xff0c 于是乎自己研究了一
  • LeetCode-整数转罗马数字

    罗马数字包含以下七种字符 xff1a I xff0c V xff0c X xff0c L xff0c C xff0c D 和 M 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如 xff0c 罗马数
  • could not find compatible versions for pod boost-for-react-native

    具体错误如下图 xff1a 这是因为在 jsi 中标记的boost for react native版本是1 63 0 xff0c 而在 gitee 中的 boost for react native 版本是 1 63 0 1 xff0c
  • 盛水最多的容器

    题目描述 xff1a 给你 n 个非负整数 a1 xff0c a2 xff0c xff0c an xff0c 每个数代表坐标中的一个点 i ai 在坐标内画 n 条垂直线 xff0c 垂直线 i 的两个端点分别为 i ai 和 i 0 找出
  • 步进电机细分功能

    首先步距角的概念 xff0c 61 360度 xff08 转子齿数 运行拍数 xff09 常规的两相步进电机步距角1 8 xff0c 三相1 2 xff0c 四相0 9 xff1b 一个步距角对应一个脉冲 xff0c 也就是说接收到一个脉冲
  • STM32全套开发板视频教程+实例源码+开发手册+调试工具下载

    好多人找不到STM32系列的学习资料 xff0c 教程什么的 xff0c 在这里说明一下 xff0c 去正点原子的官网有STM32全套开发板视频教程 43 代码 43 开发手册 43 调试工具的下载链接 xff1a http www ope
  • STM32F407-ADC(模数转换)

    一 硬件 STM32F407开发板 xff0c 杜邦线 通过通道获取板载电压的模拟输入信号转变为数字信号 xff0c 并通过转换变成电压 STM32F407有3个ADC xff0c 每个ADC有16个通道 xff0c 下表为ADC通道对应的
  • LeetCode-搜索插入位置

    给定一个排序数组和一个目标值 xff0c 在数组中找到目标值 xff0c 并返回其索引 如果目标值不存在于数组中 xff0c 返回它将会被按顺序插入的位置 你可以假设数组中无重复元素 示例 1 输入 1 3 5 6 5 输出 2 示例 2
  • Github快速查找资源常用筛选命令

    1 按项目名称 仓库名称搜索 xff08 不区分大小写 xff09 命令 in name xxx 示范 xff1a in name tensorflow 2 按照readme搜索 xff08 不区分大小写 xff09 命令 in readm
  • STM32F407-定时器中断

    1 通用定时器工作流程 2 时钟来源 定时器有4个时钟源 xff0c 分别为 xff1a 内部时钟 CK INT 外部时钟模式1 xff1a 外部输入脚 TIx 外部时钟模式2 xff1a 外部触发输入 ETR 仅适用TIM2 3 4 内部
  • STM32F407-获取GPIO电平状态

    判断STM32 GPIO输入口的输入状态 xff08 高电平或低电平 xff09 以PE2和PE4为例 xff1a 判断单个端口是否为高电平 xff1a if GPIOE gt IDR amp GPIO IDR IDR2 函数体 xff1b
  • STM32F407-限位金属传感器限制步进电机

    一 硬件 1 硬件准备 xff1a 57步进电机 xff08 型号57CM18 xff09 xff0c 42步进电机 xff0c 驱动器TB6600 xff0c 开发板STM32F407ZGT6 xff0c SN 4NDO限位金属传感器 x