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