實驗前提
1、在進行本文步驟前,請先閱讀以下博文:
暫無
2、在進行本文步驟前,請先實現(xiàn)以下博文:
暫無
五、基礎知識
1、霍爾傳感器是什么?
答:霍爾傳感器是根據(jù)霍爾效應制作的一種磁場傳感器。
用磁鐵去靠近霍爾傳感器時,霍爾傳感器的引腳電平會產生變化。
2、霍爾傳感器主要用在什么地方?
答:霍爾傳感器可測速、計數(shù)、限位上。
舉例限位功能:兩個霍爾傳感器形成45°的夾角,電機邊緣粘著一個磁鐵,一旦電機轉動導致磁鐵觸發(fā)任意其中一個霍爾傳感器,則STM32檢測到觸發(fā)后立刻停止電機,不能再繼續(xù)往此方向轉動。以此達到限制電機轉動角度的作用。
3、本文使用的是什么霍爾傳感器模塊?
答:
香瓜買的霍爾傳感器模塊一共有四個引腳,GND、VCC、D0、A0。
其中只需要用到三根線,GND、VCC、D0。(A0不知做啥用的,計數(shù)?)
使用方法:
1)5V供電。
2)用跳線連接D0和STM32的IO口(本文連接的是PA11)。
3)D0默認是高電平,但磁鐵的特定一面(磁鐵另一面無用)去靠近霍爾傳感器模塊時,D0會被拉低。
4、霍爾傳感器與限位開關有什么區(qū)別?
答:
1)限位開關
①優(yōu)點:無功耗。
②缺點:易損壞。
2)霍爾傳感器
①優(yōu)點:不易損壞。
②缺點:有功耗。
六、實驗步驟
1、編寫并添加霍爾傳感器驅動
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
//消抖總次數(shù)
#define GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT 500000
/*********************內部變量************************/
static GUA_U32 sGUA_Hall_Sensor_DisapperasShakes_IdleCount = 0; //消抖時的空閑狀態(tài)計數(shù)值
static GUA_U32 sGUA_Hall_Sensor_DisapperasShakes_TriggerCount = 0; //消抖時的觸發(fā)狀態(tài)計數(shù)值
/*********************內部函數(shù)************************/
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: 霍爾傳感器檢測觸發(fā)狀態(tài)
//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)
{
//沒觸發(fā)
if(GPIO_ReadInputDataBit(GUA_HALL_SENSOR_PORT, GUA_HALL_SENSOR_PIN) == SET)
{
//計數(shù)
sGUA_Hall_Sensor_DisapperasShakes_IdleCount++;
sGUA_Hall_Sensor_DisapperasShakes_TriggerCount = 0;
//判斷計數(shù)是否足夠
if(sGUA_Hall_Sensor_DisapperasShakes_IdleCount 》= GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT)
{
return GUA_HALL_SENSOR_STATUS_IDLE;
}
}
//觸發(fā)
else
{
//計數(shù)
sGUA_Hall_Sensor_DisapperasShakes_IdleCount = 0;
sGUA_Hall_Sensor_DisapperasShakes_TriggerCount++;
//判斷計數(shù)是否足夠
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();
}
2)編寫驅動頭文件GUA_Hall_Sensor.h(存放在“……\HARDWARE”)
//******************************************************************************
//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
//霍爾傳感器的觸發(fā)狀態(tài)
#define GUA_HALL_SENSOR_STATUS_TRIGGER 0 //霍爾傳感器觸發(fā)
#define GUA_HALL_SENSOR_STATUS_IDLE 1 //霍爾傳感器沒觸發(fā)
#define GUA_HALL_SENSOR_STATUS_DISAPPERAS_SHAKS 2 //霍爾傳感器消抖中
/*********************外部函數(shù)聲明************************/
GUA_U8 GUA_Hall_Sensor_Check_Pin(void);
void GUA_Hall_Sensor_Init(void);
#endif
3)工程中添加GUA_Hall_Sensor.c
4)在MDK設置中添加串口驅動源文件路徑
2、在應用層中調用
1)添加驅動頭文件(main.c中)
#include “GUA_Hall_Sensor.h”
2)添加驅動初始化代碼(main.c的main函數(shù)中)
//霍爾傳感器初始化
GUA_Hall_Sensor_Init();
3)添加測試代碼
①寫測試代碼(main.c中)
static void GUA_Test(void)
{
U8 nGUA_Ret = 0;
U8 nGUA_Stop = 0;
while(1)
{
//檢測霍爾當前狀態(tài)
nGUA_Ret = GUA_Hall_Sensor_Check_Pin();
//檢測到霍爾被觸發(fā)
if(nGUA_Ret == GUA_HALL_SENSOR_STATUS_TRIGGER)
{
nGUA_Stop = 1;
}
}
②調用測試代碼(main.c的main函數(shù)中)
//測試代碼
GUA_Test();
七、注意事項
暫無。
八、實驗結果
仿真并設置斷點在測試代碼的“nGUA_Stop = 1;”中,全速運行。
用磁鐵去靠近模塊上的霍爾傳感器芯片,模塊上的led被點亮表示觸發(fā),同時工程中消抖之后會停止在斷點處,表示檢測到PA11處的霍爾傳感器觸發(fā)導致的低電平。