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-限位金属传感器限制步进电机 的相关文章

  • KEIL5 调试STM32F407 停在LDR R0=SystemInit,不能进入main()函数

    点击魔术棒 xff0c 点击Debug 点击Setting Reset不要用Autodetect xff0c 选择SYSRESETREQ
  • STM32F407-串口数据传送

    一 串口基础 1 常用的串口相关寄存器 USART SR状态寄存器USART DR数据寄存器USART BRR波特率寄存器 2 串口操作相关库函数 xff08 省略入口参数 xff09 void USART Init 串口初始化 xff1a
  • STM32F407-限位金属传感器限制步进电机

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

    功夫不负有心人 xff0c 终于把这个做出来了 xff0c 本项目为控制42 57两个步进电机 xff0c 带动齿轮 xff0c 进行上下左右转动 xff0c 四个限位金属传感器限制位置 传感器配置过程 步进电机配置过程 记录一下一个问题
  • STM32F407用wk2124芯片编写SPI转四路串口驱动

    目录 引言 一 SPI通信配置 1 GPIO初始化设置 2 SPI参数配置 3 读写函数 4 速度设置 二 WK2124逻辑代码编写 1 片选初始化 2 写寄存器函数 3 读寄存器函数 4 写FIFO函数 5 读FIFO函数 6 WK212
  • STM32F407-基于AD7606进行多路数据采集

    1 原理图 2 管脚定义 2 1 OS2 OS1 OS0 查阅数据手册 这三个管脚组合控制过采样模式 000 表示无过采样 xff0c 最大 200Ksps 采样速率 001 表示 2 倍过采样 xff0c 也就是硬件内部采集 2 个样本求
  • stm32f407 FreeRTOS+LVGL移植

    参考资料 xff1a 正点原子 littleVGL 开发指南 正点原子 STM32F407 FreeRTOS 开发指南 硬件平台 xff1a stm32f407开发板 xff08 或最小系统 xff09 4 3寸TFTLCD 以正点原子的例
  • 基于STM32F407时钟配置学习

    STM32F4x系列时钟树如下 xff1a 1 系统时钟SYSCLK 在STM32F407中 xff0c 除了一些特定的时钟 xff08 例如 xff0c USB OTG FS时钟 xff0c I2S时钟 xff09 外 xff0c 系统所
  • STM32F407串口接收并解码字符串

    STM32F407串口接收并解码字符串 usart2 c 串口2初始化 span class token comment 初始化串口2 span span class token comment bound 波特率 span span cl
  • STM32F407的LCD1602液晶显示程序

    LCD1602 H ifndef LCD1602 H define LCD1602 H include sys h include stm32f4xx h unsigned char message 20 unsigned char mes
  • stm32f407 RTC不更新问题排查

    1 问题 在做stm32f407rtc实验时 xff0c 代码是用cubemx生成的 xff0c 通过串口打印出时间值 xff0c 1s打印一次 但是结果与料想中的不一致 发现打印出来的值一直不更新 按下复位键 xff0c 后时间会更新一次
  • 亲测+STM32F407+freertos+cumax+串口空闲中断和can接收发送

    STM32F407 freertos cumax 串口空闲中断和can接收发送 本人最近再学习使用cumax软件搭建stm32f4的freertos系统 废话不多说 首先介绍一下主要的硬件和软件配置 Cumax 采用Version6 1 1
  • STM32F407 串口编程USART1,USART2,USART3,UART4

    串口设置的一般步骤可以总结为如下几个步骤 xff1a 1 串口时钟使能 xff0c GPIO时钟使能 2 设置引脚复用器映射 xff1a 调用GPIO PinAFConfig函数 3 GPIO初始化设置 xff1a 要设置模式为复用功能 4
  • STM32F407单片机移植MS5611气压计(基于IIC)---同时解决温度低于20度时计算得到的大气压错误的问题

    最近一个工程项目需要使用MS5611气压计 就花时间研究了一下 发现网上很多都是基于STM32F103单片机的MS5611气压计源程序 当移植到STM32F407时发现采集的大气压力和温度值不对 同时发现网上部分程序在温度高于20度时 计算
  • PID算法与PID自整定算法

    PID算法与PID自整定算法 本文是由于研发恒温槽项目故需要了解PID控制算法和PID自整定算法 为方便本人日后需要故作此记录 直接粘贴代码吧 这是PID位置式控温算法 函数名 void Pid positional float speed
  • STM32F407单片机读取USR-WIFI232-B2模块的MAC地址

    最近工程项目需要单片机读取USR WIFI232 B2 WIFI 模块的MAC地址 研究了一下 并成功获取了MAC地址 步骤如下 1 单片机上电 USR WIFI232 B2 WIFI 模块先延时12秒 等待模块准备好 2 单片机给USR
  • STM32F407 单片机+DMA+环形缓冲区+GPS报文解析

    本文采用DMA 环形缓冲区对GPS报文进行解析 思路是通过DMA中断接收到GPS报文后 存放到环形缓冲区 然后在主程序中解析GPS报文 解析GPS报文的关键是 将环形缓冲区中的字节转换成字符串 然后在字符串中查找GPS报文头标识 例如 GP
  • SD卡 FATFS CSV 文件中的 逗号和换行

    RFC 4180 Common Format and MIME Type for Comma Separated Values CSV Files 要点有 1 CSV的换行符号要使用CRLF 即 回车符 换行符 的形式 2 文字可以使用双引
  • FATFS实现数据追加功能(原文不覆盖)

    在对FATFS的应用中我们经常需要把采集的数据存入的文件中 用作保存 也许我们的系统是一个长期的运行过程 但是我们的数据可能不是持续采集的 所以我们这样写代码 注册一个工作区域 f mount 0 fs 打开创建一个新文件 res f op
  • STM32F407 USART3串口使用DMA接收不定长数据和DMA中断发送

    一 前言 使用DMA通信的好处是 不占用单片机资源 不像普通串口中断 发送一个字节触发一次中断 发送100个字节触发100次中断 接收一个字节触发一次中断 接收200个字节触发200次中断 数据接收完毕触发一次DMA中断 发送数据完毕触发一

随机推荐

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

    给定一个二叉树 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