STM32之霍尔检测电机归位时掉电

发布者:会哭的蓝精灵最新更新时间:2020-01-30 来源: eefocus关键字:STM32  霍尔检测  电机归位  掉电 手机看文章 扫描二维码
随时随地手机看文章

一、简介


本文介绍如何在STM32上使用霍尔传感器模块检测电机运行位置,当电机归位时自动断开电源。


二、实验平台


库版本:STM32F10x_StdPeriph_Lib_V3.5.0


编译软件:MDK4.53


硬件平台:STM32开发板(主芯片stm32f103c8t6


仿真器:JLINK


三、版权声明


四、实验前提


在进行本文步骤前,请先阅读并实现以下博文:


1、《STM32之系统滴答定时器》:http://blog.csdn.net/feilusia/article/details/52835711


2、《STM32之DRV8834电机驱动》:http://blog.csdn.net/feilusia/article/details/52853951

3、《STM32之LED》:http://blog.csdn.net/feilusia/article/details/52882581


4、《STM32之霍尔传感器模块》:http://blog.csdn.net/feilusia/article/details/52873885


五、基础知识


1、本文实现原理是如何的?


答:


1)起始状态


磁铁被放置在电机运行起始处的位置,霍尔传感器装置在电机上,且起始状态时霍尔传感器被触发状态。


2)电机运行状态


当STM32发现霍尔传感器不被触发了,说明电机正在运行。


3)电机归位状态


当人为手动或者通过控制的方式,将电机位置归零,也就是霍尔传感器再次被磁铁触发时。


此时STM32将控制电源的IO口拉低,整个电路实现掉电。


(本文只控制IO口实现掉电,不对硬件实现掉电的电路进行分析)


六、实验步骤


1、编写并添加掉电控制的驱动


1)编写驱动GUA_Power_OnOff.c(存放在“……HARDWARE”)



//******************************************************************************              

//name:             GUA_Power_OnOff.c             

//introduce:        按键开关机驱动      

//author:           甜甜的大香瓜                     

//email:            897503845@qq.com         

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.12.28      

//****************************************************************************** 

#include "GUA_Power_OnOff.h"

#include "stm32f10x.h"

#include "GUA_Hall_Sensor.h"

#include "GUA_DRV8834_2.h"

#include "GUA_Led.h"

 

/*********************宏定义************************/

//电机状态

#define GUA_MOTOR_X_STATUS_INIT              0

#define GUA_MOTOR_X_STATUS_ON                1

#define GUA_MOTOR_X_STATUS_OFF               2

 

//按键开关引脚

#define GUA_POWER_ONOFF                    GPIOA

#define GUA_POWER_ONOFF_PIN                GPIO_Pin_12

#define GUA_POWER_ONOFF_RCC                RCC_APB2Periph_GPIOA

/*********************内部变量***********************/

static GUA_U8 sGUA_Motor_X_Status = GUA_MOTOR_X_STATUS_INIT;

 

/*********************内部函数************************/

static void GUA_Power_OnOff_IO_Init(void);

 

//******************************************************************************            

//name:             GUA_Power_OnOff_IO_Init           

//introduce:        按键开关机的IO初始化         

//parameter:        none                 

//return:           none         

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group          香瓜单片机之STM8/STM32(164311667)                  

//changetime:       2016.12.28                     

//******************************************************************************

static void GUA_Power_OnOff_IO_Init(void)

{

//IO结构体

GPIO_InitTypeDef GPIO_InitStructure;

//时钟使能

RCC_APB2PeriphClockCmd(GUA_POWER_ONOFF_RCC, ENABLE);

//按键开关机IO配置

GPIO_InitStructure.GPIO_Pin = GUA_POWER_ONOFF_PIN; 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GUA_POWER_ONOFF, &GPIO_InitStructure);

}

 

//******************************************************************************        

//name:             GUA_Power_OnOff_Check        

//introduce:        电源关断控制的状态检测  

//parameter:        none    

//return:           nGUA_Power_OnOff_Status: GUA_POWER_ONOFF_STATUS_ON开机;GUA_OWER_ONOFF_STATUS_OFF关机      

//author:           甜甜的大香瓜             

//email:            897503845@qq.com           

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.12.28       

//****************************************************************************** 

GUA_U8 GUA_Power_OnOff_Check(GUA_U8 nGUA_Hall_Sensor_Check_Pin)

{

  //判断电机X转动位置

  switch(sGUA_Motor_X_Status)

  {

    //上电后X还未离开0位置

    case GUA_MOTOR_X_STATUS_INIT:

    {

      //检测X电机是否离开0位置

      if(nGUA_Hall_Sensor_Check_Pin == GUA_HALL_SENSOR_STATUS_TRIGGER) //霍尔传感器被触发,说明上电时在初始位置

      {

        sGUA_Motor_X_Status = GUA_MOTOR_X_STATUS_INIT;    

      }

      else if(nGUA_Hall_Sensor_Check_Pin == GUA_HALL_SENSOR_STATUS_IDLE) //霍尔传感器没被触发,说明上电时在初始位置

      {

        sGUA_Motor_X_Status = GUA_MOTOR_X_STATUS_ON;  

      }       

      

      break;

    }

    

    //上电后X离开0位置

    case GUA_MOTOR_X_STATUS_ON:

    {

      //检测X电机是否回0位置

      if(nGUA_Hall_Sensor_Check_Pin == GUA_HALL_SENSOR_STATUS_TRIGGER) //霍尔传感器被触发,说明回0位置

      {

        sGUA_Motor_X_Status = GUA_MOTOR_X_STATUS_OFF;    

      }

      else if(nGUA_Hall_Sensor_Check_Pin == GUA_HALL_SENSOR_STATUS_IDLE) //霍尔传感器没被触发,说明未回0位置

      {

        sGUA_Motor_X_Status = GUA_MOTOR_X_STATUS_ON;  

      }       

      

      break;

    }

    

    default:break;

  } 

  

  //根据X转动位置,来判断是否要关机

  if(sGUA_Motor_X_Status == GUA_MOTOR_X_STATUS_OFF)                             //关机状态                             

  {

    return GUA_POWER_ONOFF_STATUS_OFF;  

  }

  else                                                                  //开机状态

  { 

    return GUA_POWER_ONOFF_STATUS_ON; 

  }   

}

 

//******************************************************************************        

//name:             GUA_Power_OnOff_Control        

//introduce:        电源控制      

//parameter:        nGUA_Power_OnOff_Status: GUA_POWER_ONOFF_STATUS_ON开机;GUA_POWER_ONOFF_STATUS_OFF关机     

//return:           none      

//author:           甜甜的大香瓜             

//email:            897503845@qq.com           

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.12.28       

//****************************************************************************** 

void GUA_Power_OnOff_Control(GUA_U8 nGUA_Power_OnOff_Status)

{

  //开机状态

  if(nGUA_Power_OnOff_Status == GUA_POWER_ONOFF_STATUS_ON)

  {

    GPIO_WriteBit(GUA_POWER_ONOFF, GUA_POWER_ONOFF_PIN, Bit_SET); //1 开机  

GUA_Led_Set(GUA_LED_POWERONOFF_PORT, GUA_LED_POWERONOFF_PIN, GUA_LED_MODE_ON); //LED亮     

  }

  //关机状态

  else

  { 

    GUA_DRV8834_Return_Zero_2(&stGUA_Motor_Config_2); //Y电机回零    

    GPIO_WriteBit(GUA_POWER_ONOFF, GUA_POWER_ONOFF_PIN, Bit_RESET); //1 关机

    while(1);

  }  

}

 

//******************************************************************************        

//name:             GUA_Power_OnOff_Init        

//introduce:        上下电的按键初始化      

//parameter:        none      

//return:           none      

//author:           甜甜的大香瓜             

//email:            897503845@qq.com           

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.12.28       

[1] [2]
关键字:STM32  霍尔检测  电机归位  掉电 引用地址:STM32之霍尔检测电机归位时掉电

上一篇:STM32之限位开关
下一篇:STM32之红外接收

推荐阅读最新更新时间:2024-11-12 13:19

基于STM32单片机的电子称设计
摘要 电子秤是将检测与转换技术、计算机技术、信息处理、数字技术等技术综合一体的现代新型称重仪器。它与我们日常生活紧密结合息息相关。 电子称主要以单片机作为中心控制单元,通过称重传感器进行模数转换单元,在配以键盘、显示电路及强大软件来组成。电子称不但计量准确、快速方便,更重要的自动称重、数字显示,对人们生活的影响越来越大,广受欢迎。 本系统的设计主要从硬件电路设计,软件编程调试,实物焊接调试三部分进行详细阐述。硬件电路主要是基于单片机为核心的控制单元实现数据的处理,采用压力传感器对数据进行采集,电子秤专用24位AD转换芯片HX711对传感器采集到的模拟量进行AD转换,转换后的数据送到单片机进行处理显示,数据显示由LCD160
[单片机]
基于<font color='red'>STM32</font>单片机的电子称设计
STM32CubeMX之定时器控制微秒延时详解
写在前面的话,为什么另需定时器进行微秒级延时。 1.在HAL固件库中只有使用Systick作为延时计数器,毫秒级延时HAL_Delay()。为了增加精确的微秒级延时,一般都是更改Systick配置参数,但HAL固件库许多地方都使用了HAL_Delay()函数,因此建议大家不要修改系统自动配置的Systick参数; 2.个人觉得到加入操作系统时要占用Systick,而MCU系统自身的时基还要选择其他的定时器,综上所述,对Systick做的更改基本白搭; 因此采用定时器控制微妙延时的方法,是比较灵活的。需要用户增加的代码很少,经济实用,节能环保- -; 步骤1.配置时钟 注意,一定要确定红色部分标记的晶振频率要与实际的晶振保持一致。
[单片机]
基于STM32+CS创世 SD NAND(贴片SD卡)完成FATFS文件系统移植与测试(下篇)
四、移植FATFS文件系统 前面第3章,完成了SD NAND的驱动代码编写,这一章节实现FATFS文件的移植。 4.1 FATFS文件系统介绍 (1)介绍 FatFs 是一种完全免费开源的 FAT 文件系统模块,专门为小型的嵌入式系统而设计。它完全用标准C 语言编写,所以具有良好的硬件平台独立性,可以移植到 8051、 PIC、 AVR、 SH、 Z80、 H8、 ARM 等系列单片机上而只需做简单的修改。它支持 FATl2、 FATl6 和 FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对 8 位单片机和 16 位单片机做了优化。 (2)特点 【1】Windows兼容的FAT文件系统 【2
[单片机]
基于STM32+CS创世 SD NAND(贴片SD卡)完成FATFS文件系统移植与测试(下篇)
STM32-点亮一个LED灯-流水灯
1.跟着例程自己创建自己的工程时,出现了GPIO库文件里有undefined等等,在我们刚开始学习新建工程时要注意C/c++里面的Defined,与开发板匹配! 2.在启动文件中选择与开发板匹配的文件,比如hd,ld,md等等只要加入一种,多了会出现错误. 3.终于成功了! 4.出现Flash download failed cortex M3 注意Flashdownload里面关于你芯片Flash匹配。 5.今天终于借助于库开发点亮第一个LED灯,哈哈。 http://blog.csdn.net/hantangsongming/article/details/8139793 http://blog.sina.com.cn/s/b
[单片机]
STM32的FLASH简单应用
  STM3210XXX内嵌的闪存存储器可以用于在线编程(ICP)或在程序中编程(IAP)。也可以作为闪存存放数据。   主存储块:小容量产品 4K 64位        中容量产品 16K 64位        大容量产品 64K 64位   信息块: 258 64位 闪存模块组织织: 中容量(每页1K)和大容量(每页2K)的参照数据手册。   闪存存储器被组织成32位宽的存储器单元,可以存放代码和数据常数。每一个闪存模块都有一个特定的启始地址。   此次测试目的在于利用闪存存储器存放数据,并不是实现程序烧录功能,所以,只关注存储器的读写,保护功能留待日后再研究。   下面的例子是从0x08008204的地址中
[单片机]
<font color='red'>STM32</font>的FLASH简单应用
初学STM32对AFIO的简单理解
在配置PC13引脚的外部线中断时,配置其外挂时钟时用到了复用功能: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE); 原因是PC13的第一功能引脚是GPIO,第二功能引脚是TAMER-RTC1,并没有EXTI的功能,要想用它产生外部线中断,必须配置AFIO复用功能,将EXTI功能映射到PC13引脚上。 PC13引脚功能图 又例: CAN总线用到了PB8、PB9,而这两个引脚本身没有CAN功能,需要重映射: RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIO
[单片机]
STM32 GPIO口的使用
实验平台清单如下: 开发板: 战舰 STM32ZET6 V3.4 核心芯片: STM32F103RCT6 开发环境: MDK-ARM Version:5.10 PC操作系统: Windows 7 旗舰版 仿真器: ST-Link 打开MDK开发平台,在菜单栏中单击“Project - New μVision Project”创建一个新的工程。然后在弹出的“Select Device for Target 1”对话框中选择合适的芯片。由于我采用的是STM32F103ZET6,所以选择ST – STM32F103ZE。 选择好芯片之后,会弹出一个消息框,“Copy STM32 Startup
[单片机]
STM32单片机GPIO的配置模式
1. 操作GPIO的意义 我们在学习单片机的时候,一般都是从操作GPIO开始的,很多单片机学习的教程第一课就是点亮发光二极管或者是流水灯。所以对于初学者而言,及时掌握单片机的GPIO口是一件具有里程碑意义的事情。今天以STM32单片机为例,简单看一下GPIO口。 2. STM32单片机GPIO的配置模式 STM32单片机的GPIO最有8组,分别为A,B,C,D,E,每组有0-15共16个。可以配置为8中模式: 3. 相关寄存器 配置GPIO相关的寄存器有如下几个: 1.端口配置低寄存器:(GPIOx_CRL) (x=A..E) 2.端口配置高寄存器:(GPIOx_CRH) (x=A..E) 3.端口输入数据寄存器:(GPI
[单片机]
<font color='red'>STM32</font>单片机GPIO的配置模式
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved