本篇博文最後修改時間:2017年03月06日,23:50。
java
1、簡介app
本文介紹如何在STM32上使用霍爾傳感器模塊。函數
2、實驗平臺測試
庫版本:STM32F10x_StdPeriph_Lib_V3.5.0spa
編譯軟件:MDK4.53.net
硬件平臺:STM32開發板(主芯片stm32f103c8t6)3d
仿真器:JLINKcode
三、版權聲明blog
博主:甜甜的大香瓜ip
聲明:喝水不忘挖井人,轉載請註明出處。
原文地址:http://blog.csdn.NET/feilusia
聯繫方式:897503845@qq.com
香瓜BLE之CC2541羣:127442605
香瓜BLE之CC2640羣:557278427
暫無
5、基礎知識
一、霍爾傳感器是什麼?
答:霍爾傳感器是根據霍爾效應制做的一種磁場傳感器。
用磁鐵去靠近霍爾傳感器時,霍爾傳感器的引腳電平會產生變化。
二、霍爾傳感器主要用在什麼地方?
答:霍爾傳感器可測速、計數、限位上。
舉例限位功能:兩個霍爾傳感器造成45°的夾角,電機邊緣粘着一個磁鐵,一旦電機轉動致使磁鐵觸發任意其中一個霍爾傳感器,則STM32檢測到觸發後馬上中止電機,不能再繼續往此方向轉動。以此達到限制電機轉動角度的做用。
三、本文使用的是什麼霍爾傳感器模塊?
答:
香瓜買的霍爾傳感器模塊一共有四個引腳,GND、VCC、D0、A0。
其中只須要用到三根線,GND、VCC、D0。(A0不知作啥用的,計數?)
使用方法:
1)5V供電。
2)用跳線鏈接D0和STM32的IO口(本文鏈接的是PA11)。
3)D0默認是高電平,但磁鐵的特定一面(磁鐵另外一面無用)去靠近霍爾傳感器模塊時,D0會被拉低。
四、霍爾傳感器與限位開關有什麼區別?
答:
1)限位開關
①優勢:無功耗。
②缺點:易損壞。
2)霍爾傳感器
①優勢:不易損壞。
②缺點:有功耗。
6、實驗步驟
一、編寫並添加霍爾傳感器驅動
1)編寫驅動GUA_Hall_Sensor.c(存放在「……\HARDWARE」)
//****************************************************************************** //name: GUA_Hall_Sensor.c //introduce: 霍爾傳感器驅動 //author: 甜甜的大香瓜 //email: 897503845@qq.com //QQ group 香瓜單片機之STM8/STM32(164311667) //changetime: 2017.03.06 //****************************************************************************** #include "stm32f10x.h" #include "GUA_Hall_Sensor.h" /*********************宏定義************************/ //霍爾傳感器引腳 #define GUA_HALL_SENSOR_PORT GPIOA #define GUA_HALL_SENSOR_PIN GPIO_Pin_11 //消抖總次數 #define GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT 500000 /*********************內部變量************************/ static GUA_U32 sGUA_Hall_Sensor_DisapperasShakes_IdleCount = 0; //消抖時的空閒狀態計數值 static GUA_U32 sGUA_Hall_Sensor_DisapperasShakes_TriggerCount = 0; //消抖時的觸發狀態計數值 /*********************內部函數************************/ static void GUA_Hall_Sensor_IO_Init(void); //****************************************************************************** //name: GUA_Hall_Sensor_IO_Init //introduce: 霍爾傳感器的IO初始化 //parameter: none //return: none //author: 甜甜的大香瓜 //email: 897503845@qq.com //QQ group 香瓜單片機之STM8/STM32(164311667) //changetime: 2017.03.06 //****************************************************************************** static void GUA_Hall_Sensor_IO_Init(void) { //IO結構體 GPIO_InitTypeDef GPIO_InitStructure; //時鐘使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //霍爾IO配置 GPIO_InitStructure.GPIO_Pin = GUA_HALL_SENSOR_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GUA_HALL_SENSOR_PORT, &GPIO_InitStructure); } //****************************************************************************** //name: GUA_Hall_Sensor_Check_Pin //introduce: 霍爾傳感器檢測觸發狀態 //parameter: none //return: GUA_HALL_SENSOR_STATUS_IDLE or GUA_HALL_SENSOR_STATUS_TRIGGER //author: 甜甜的大香瓜 //email: 897503845@qq.com //QQ group 香瓜單片機之STM8/STM32(164311667) //changetime: 2017.03.06 //****************************************************************************** GUA_U8 GUA_Hall_Sensor_Check_Pin(void) { //沒觸發 if(GPIO_ReadInputDataBit(GUA_HALL_SENSOR_PORT, GUA_HALL_SENSOR_PIN) == SET) { //計數 sGUA_Hall_Sensor_DisapperasShakes_IdleCount++; sGUA_Hall_Sensor_DisapperasShakes_TriggerCount = 0; //判斷計數是否足夠 if(sGUA_Hall_Sensor_DisapperasShakes_IdleCount >= GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT) { return GUA_HALL_SENSOR_STATUS_IDLE; } } //觸發 else { //計數 sGUA_Hall_Sensor_DisapperasShakes_IdleCount = 0; sGUA_Hall_Sensor_DisapperasShakes_TriggerCount++; //判斷計數是否足夠 if(sGUA_Hall_Sensor_DisapperasShakes_TriggerCount >= GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT) { return GUA_HALL_SENSOR_STATUS_TRIGGER; } } return GUA_HALL_SENSOR_STATUS_DISAPPERAS_SHAKS; } //****************************************************************************** //name: GUA_Limit_Switch_Init //introduce: 霍爾傳感器初始化 //parameter: none //return: none //author: 甜甜的大香瓜 //email: 897503845@qq.com //QQ group 香瓜單片機之STM8/STM32(164311667) //changetime: 2017.03.06 //****************************************************************************** void GUA_Hall_Sensor_Init(void) { //初始化IO GUA_Hall_Sensor_IO_Init(); }
//****************************************************************************** //name: GUA_Hall_Sensor.h //introduce: 霍爾傳感器驅動的頭文件 //author: 甜甜的大香瓜 //email: 897503845@qq.com //QQ group 香瓜單片機之STM8/STM32(164311667) //changetime: 2017.03.06 //****************************************************************************** #ifndef _GUA_HALL_SENSOR_H_ #define _GUA_HALL_SENSOR_H_ /*********************宏定義************************/ //類型宏 #ifndef GUA_U8 typedef unsigned char GUA_U8; #endif #ifndef GUA_8 typedef signed char GUA_8; #endif #ifndef GUA_U16 typedef unsigned short GUA_U16; #endif #ifndef GUA_16 typedef signed short GUA_16; #endif #ifndef GUA_U32 typedef unsigned long GUA_U32; #endif #ifndef GUA_32 typedef signed long GUA_32; #endif #ifndef GUA_U64 typedef unsigned long long GUA_U64; #endif #ifndef GUA_64 typedef signed long long GUA_64; #endif //霍爾傳感器的觸發狀態 #define GUA_HALL_SENSOR_STATUS_TRIGGER 0 //霍爾傳感器觸發 #define GUA_HALL_SENSOR_STATUS_IDLE 1 //霍爾傳感器沒觸發 #define GUA_HALL_SENSOR_STATUS_DISAPPERAS_SHAKS 2 //霍爾傳感器消抖中 /*********************外部函數聲明************************/ GUA_U8 GUA_Hall_Sensor_Check_Pin(void); void GUA_Hall_Sensor_Init(void); #endif
4)在MDK設置中添加串口驅動源文件路徑
二、在應用層中調用
1)添加驅動頭文件(main.c中)
#include "GUA_Hall_Sensor.h"
//霍爾傳感器初始化 GUA_Hall_Sensor_Init();
①寫測試代碼(main.c中)
static void GUA_Test(void) { U8 nGUA_Ret = 0; U8 nGUA_Stop = 0; while(1) { //檢測霍爾當前狀態 nGUA_Ret = GUA_Hall_Sensor_Check_Pin(); //檢測到霍爾被觸發 if(nGUA_Ret == GUA_HALL_SENSOR_STATUS_TRIGGER) { nGUA_Stop = 1; } }
//測試代碼 GUA_Test();
暫無。
8、實驗結果
仿真並設置斷點在測試代碼的「nGUA_Stop = 1;」中,全速運行。
用磁鐵去靠近模塊上的霍爾傳感器芯片,模塊上的led被點亮表示觸發,同時工程中消抖以後會中止在斷點處,表示檢測到PA11處的霍爾傳感器觸發致使的低電平。以下圖
所以實驗成功。