發布日期:2022-10-09 點擊率:1207
霍爾傳感器 stm32:stm32—霍爾傳感器的初步使用 第1張" title="霍爾傳感器 stm32:stm32—霍爾傳感器的初步使用 第1張-傳感器知識網"/>
目錄
一、簡介二、連接三、代碼
一、簡介
霍爾器件是一種磁傳感器。用它們可以檢測磁場及其變化,可在各種與磁場有關的場合中使用。在模塊測試的時候也很簡單,用手在附近其他引腳波動也會造成磁場變化,可以檢測得出,此外通過它,將許多非電、非磁的物理量例如力、力矩、壓力、應力、位置、位移、速度、加速度、角度、角速度、轉數、轉速以及工作狀態發生變化的時間等,也可以通過本傳感器轉變成電量來進行檢測和控制。
按照霍爾器件的功能可將它們分為:霍爾線性器件和霍爾開關器件。前者輸出模擬量,后者輸出數字量。本模塊是霍爾開關傳感器
二、連接
將VCC和GND連接在開發板對應的引腳上(此處選擇普中STM32F103開發板),
D0接在PD7上;因為本傳感器是和霍爾開關器件,所以雖然有D0口但是沒有什么用處,只是擺設。
三、代碼
在huoer.h 文件中,我們先進行宏定義,方便移植
定義完了之后,再對huoer.c文件中的PC4接收引腳進行初始化
#include “frame.h”
//對霍爾傳感器進行初始化
最后,在main.c函數里面進行情況選擇
1、霍爾傳感器是什么?
答:霍爾傳感器是根據霍爾效應制作的一種磁場傳感器。
用磁鐵去靠近霍爾傳感器時,霍爾傳感器的引腳電平會產生變化。
2、霍爾傳感器主要用在什么地方?
答:霍爾傳感器可測速、計數、限位上。
舉例限位功能:兩個霍爾傳感器形成45°的夾角,電機邊緣粘著一個磁鐵,一旦電機轉動導致磁鐵觸發任意其中一個霍爾傳感器,則STM32檢測到觸發后立刻停止電機,不能再繼續往此方向轉動。以此達到限制電機轉動角度的作用。
3、本文使用的是什么霍爾傳感器模塊?
答:
香瓜買的霍爾傳感器模塊一共有四個引腳,GND、VCC、D0、A0。
其中只需要用到三根線,GND、VCC、D0。(A0不知做啥用的,計數?)
使用方法:
1)5V供電。
2)用跳線連接D0和STM32的IO口(本文連接的是PA11)。
3)D0默認是高電平,但磁鐵的特定一面(磁鐵另一面無用)去靠近霍爾傳感器模塊時,D0會被拉低。
4、霍爾傳感器與限位開關有什么區別?
答:
1)限位開關
①優點:無功耗。
②缺點:易損壞。
2)霍爾傳感器
①優點:不易損壞。
②缺點:有功耗。
六、實驗步驟
1、編寫并添加霍爾傳感器驅動
1)編寫驅動GUA_Hall_Sensor.c(存放在“……HARDWARE”)
實驗前提
1、在進行本文步驟前,請先閱讀以下博文:
暫無
2、在進行本文步驟前,請先實現以下博文:
暫無
五、基礎知識
1、霍爾傳感器是什么?
答:霍爾傳感器是根據霍爾效應制作的一種磁場傳感器。
用磁鐵去靠近霍爾傳感器時,霍爾傳感器的引腳電平會產生變化。
2、霍爾傳感器主要用在什么地方?
答:霍爾傳感器可測速、計數、限位上。
舉例限位功能:兩個霍爾傳感器形成45°的夾角,電機邊緣粘著一個磁鐵,一旦電機轉動導致磁鐵觸發任意其中一個霍爾傳感器,則STM32檢測到觸發后立刻停止電機,不能再繼續往此方向轉動。以此達到限制電機轉動角度的作用。
3、本文使用的是什么霍爾傳感器模塊?
答:
香瓜買的霍爾傳感器模塊一共有四個引腳,GND、VCC、D0、A0。
其中只需要用到三根線,GND、VCC、D0。(A0不知做啥用的,計數?)
使用方法:
1)5V供電。
2)用跳線連接D0和STM32的IO口(本文連接的是PA11)。
3)D0默認是高電平,但磁鐵的特定一面(磁鐵另一面無用)去靠近霍爾傳感器模塊時,D0會被拉低。
4、霍爾傳感器與限位開關有什么區別?
答:
1)限位開關
①優點:無功耗。
②缺點:易損壞。
2)霍爾傳感器
①優點:不易損壞。
②缺點:有功耗。
六、實驗步驟
1、編寫并添加霍爾傳感器驅動
1)編寫驅動GUA_Hall_Sensor.c(存放在“……HARDWARE”)
/
//霍爾傳感器引腳
#define GUA_HALL_SENSOR_PORT GPIOA
#define GUA_HALL_SENSOR_PIN GPIO_Pin_11
//消抖總次數
#define GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT
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);
/
//類型宏
#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
3)工程中添加GUA_Hall_Sensor.c
4)在MDK設置中添加串口驅動源文件路徑
2、在應用層中調用
1)添加驅動頭文件(main.c中)
#include “GUA_Hall_Sensor.h”
2)添加驅動初始化代碼(main.c的main函數中)
//霍爾傳感器初始化
GUA_Hall_Sensor_Init();
3)添加測試代碼
①寫測試代碼(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;
}
}
②調用測試代碼(main.c的main函數中)
//測試代碼
GUA_Test();
七、注意事項
暫無。
八、實驗結果
仿真并設置斷點在測試代碼的“nGUA_Stop=1;”中,全速運行。
用磁鐵去靠近模塊上的霍爾傳感器芯片,模塊上的led被點亮表示觸發,同時工程中消抖之后會停止在斷點處,表示檢測到PA11處的霍爾傳感器觸發導致的低電平。
這里我用通用定時器3的通道1來測量轉速
霍爾轉速傳感器基本介紹霍爾傳感器分類和原理關于為什么選用開關型常開PNP型霍爾傳感器
STM32程序實現程序介紹程序源碼TIM3_CAP.HTIM3_CAP.H解讀TIM3_CAP.CTIM3_CAP.C解讀TIM3中斷函數解讀MAIN.CMAIN.C解讀
結果工程文件
霍爾轉速傳感器基本介紹
霍爾傳感器分類和原理
我用的是開關型常開PNP型的霍爾傳感器
開關型的有2種分類,一種是常開,另外一種就是常閉了
關于什么常開常閉,請看下圖
常開通俗來講,就是霍爾傳感器沒有檢測到磁鐵的時候開關就是斷開的,常閉相反
霍爾傳感器具體分類
圖片來自淘寶鏈接
說明
DC-直流AC交流NO-常開NC-常閉
關于為什么選用開關型常開PNP型霍爾傳感器
單片機只能接收高低電平,0或者是1,
開關型常開的霍爾傳感器剛好符合單片機的這個特性
檢測到磁鐵的時候就輸出高電平或者低電平,
PNP型就是檢測到磁鐵的時候的輸出高電平,沒有檢測到的時候就是低電平
實驗中,給霍爾傳感器5V供電,檢測到磁鐵,霍爾傳感器就輸入5V,沒有檢測到就是0V了
實物圖
STM32程序實現
程序介紹
單片機STM32F103ZE
霍爾5V供電,傳感器數據輸出線接PA6
定時器3 通道1 輸入捕獲模式
程序源碼
TIM3_CAP.H
TIM3_CAP.H解讀
定時器只能在捕獲到高電平的時候,把當前計數器的數值保存下次,由于我們需要計算2次高電平的時間,所有需要一個邏輯位TIM3_FLAG
TIM3_CAP用于保存第2次定時器捕獲高電平時候的計數器的數值
TIM3_RES是2次高電平總的計數器的數值
TIM3_RES乘以計數器每計一個數的時間就是總的時間了
TIM3_CAP.C
TIM3_CAP.C解讀
首先開啟定時器3和GPIOA的時鐘
接著設置PA6為下拉輸入,為什么下拉輸入,因為我們需要捕獲高電平,如果你要捕獲低電平,設置PA6為上拉輸入,然后設置定時器下降沿捕獲
設置定時器的自動重載值和預分頻值
設置通道1為輸入不分頻,不濾波
關于什么是分頻,什么是濾波
濾波
首先看STM32中文參考手冊中的介紹
我的理解就是輸入捕獲采樣頻率也就是速度
分頻
貼上官方介紹
就是每幾個高電平觸發一次捕獲
如果你設置每2個事件觸發一次捕獲,那么檢測到2次高電平的時候才會把當前的計數器的數值保存到TIM3->CCR1寄存器中
什么是TIM3->CCR1寄存器呢
看官方的介紹就知道了
也就是保存捕獲的時候計數器的數值
計數器的值能捕獲入TIM3_CCR1寄存器和設置上升沿捕獲
開啟定時器更新中斷和通道1捕獲中斷
設置中斷分組和優先級
開啟定時器3
TIM3中斷函數解讀
TIM3_FLAG是8位的,其中第7位用于標志第一次捕獲,如果檢測到第一次捕獲就置1,第8位用于標志第二次捕獲,檢測到了就置1,1~6用于在檢測到第一次捕獲的時候定時器更新的次數
MAIN.C
MAIN.C解讀
主函數是檢測到2次高電平就通過串口打印出高電平的時間
以下頭文件中是用了原子哥的頭文件
結果
LED1每0.2s切換亮滅狀態一次,故每0.4s亮一次,結果和下圖一樣
用飛線把PA6(通道1)和PE5(LED1)連接起來
工程文件
工程文件 鏈接
下一篇: PLC、DCS、FCS三大控
上一篇: 電氣控制線路圖控制原