當前位置:首頁 » 編程語言 » 霍爾感測器防誤觸c語言程序
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

霍爾感測器防誤觸c語言程序

發布時間: 2023-05-25 10:57:50

『壹』 霍爾3144感測器怎麼測速,求大神教,最好有c語言程序

測速有M法T法,高速就數單位時間脈沖的個數,低速就測脈沖的間隔

『貳』 關於霍爾感測器測速的問題(單片機),原理就是磁鐵在轉盤上,每轉一圈,霍爾的out口就產生一個脈沖

每次霍爾靠近磁鐵都會有一個脈沖信號,你用定時器記錄一周花的時間,測一下你的車輪長。就出來了

『叄』 s7-200smart如何接霍爾信號

1、確認所使用的霍爾感測器電壓等級(通常為5V或12V)和輸出信號類型(通常為開友畢關量或模擬行告罩量)。
2、根據霍爾感測器的電壓等級,選擇合適的數字輸入模塊或模擬輸入模塊,並將其插入S7-200Smart的介面模塊位置。
3、將霍爾感測器的輸出信號線連接到數字輸入模塊或模擬輸入模塊的相應埠上。
4、在S7-200Smart的編程軟體中,配置相應的輸入埠和信號類型,編寫相檔鬧應的程序進行霍爾感測器信號的處理。

『肆』 3144霍爾感測器怎麼用,引腳怎麼接單片機,外部中斷怎麼寫,求大神帶

中斷設置成負跳變觸發,引腳的話,信號接外部中斷,如果電源和單片機電源共地,

『伍』 單片機測車輪速度,我把程序的思路寫下來了,好多都不知道怎麼實現,而且也不知道有的錯怎麼解決

  1. 停止運行。在else後面加break //一分鍾之後賦值並跳出循環

  2. 液晶顯示。看是什麼裂野液晶顯示器埋源拍,找一個彎羨液晶函數,輸入是speed。

程序:

speed=speedNum/60; 液晶函數(speed);break;

具體結果要調試一下

『陸』 用c語言編寫控制電機運動的程序

1、有三個輸入,分別是一個按鈕、兩個霍爾感測器(也就是接近開關),我用P0.0到P0.2來代替;輸出2個或以上(這看接什麼顯示器,如果是PC的話,就不用數字量輸出,直接串口就可以了)控制正反轉的繼電器管腳用P1.0、P1.1;需要與一個全局變數轉動次數k連接起來,另外兩個輸入接近開關選用NPN感測器或用光電隔離,總之有效信號能把管腳電壓拉低就可以。
2、常式:

#include<reg51.h>//選用晶振11.0592MHz
unsignedchark=0;//k表示正反轉次數
sbitX0=P3^2;//調節按鈕
sbitX1=P1^1;//上限位接近開關信號
sbitX2=P1^2;//下限位接近開關信號
sbitY1=P0^0;//電機上升(注意:我使用的是管腳輸出為0時候,電機運動,這樣可以避免啟動時候,單片機自復位對電機點動的影響)
sbitY2=P0^1;//電機下降
voiddelay50ms(unsignedinti)
{
unsignedintj;
for(i;i>0;i--)
for(j=46078;j>0;j--);
}
main()
{
IT0=1;//下降沿觸發
EX0=1;//開P3.2外部中斷
EA=1;//總中斷開
while(1)
while(k)
{
Y1=0;//正轉
while(X1==1);//等待正轉接近開關反應
Y1=1;//正轉停
delay50ms(1);//停止時間50ms
Y2=0;//反轉
while(X2==1);//等待反轉接近開關反應
Y2=1;//反轉停
k--;//圈數減一
}
}
voidcounter0(void)interrupt0
{
k++;//外部中斷控制圈數加一
//這個位置可以加你顯示程序
}

『柒』 我想問一下這個霍爾模塊怎麼和單片機連,怎麼用單片機檢測和計數

VCC接梁態5V 電壓 ,GND接GND ,DO接單片機IO口 常態為高。橡型源
磁性物體每經過模塊左邊的那個類是三極體的 A3144 霍爾感測器一次,接DO的單片機IO口被拉低一次。單片機租鍵內部程序監視IO口電平變化進行相關邏輯運算即可

『捌』 求利用3144霍爾元件做測速器的編程和線路圖~

產品說明:

產品名稱:ZH3144
產品類別:單輸出霍爾開關集成電路
產品規格:4-20V
產品型號:ZH3144
產品說明:*電源電壓范圍寬,輸出電流大。*開關速度快,無瞬間抖動。*工作頻率寬(0~100KHz)。*壽命長、體積小、安裝方便。*能直接和邏輯電路介面。

應用場合*直流無刷電機無觸點開關*位置控制電流感測器*汽車點火器安全報警裝置*隔離檢測轉速檢測

霍爾感測器是對磁敏感的感測元件,常用於開關信號採集的有CS3020、CS3040等,這種感測器是一個3端器件,外形與三極體相似,只要接上電源、地,即可工作,輸出通常是集電極開路(OC)門輸出,工作電壓范圍寬,使用非常方便。如圖1所示是CS3020的外形圖,將有字面對准自己,三根引腳從左向右分別是Vcc,地,輸出。
圖1 CS3020外形圖
使用霍爾感測器獲得脈沖信號,其機械結構也可以做得較為簡單,只要在轉軸的圓周上粘上一粒磁鋼,讓霍爾開關靠近磁鋼,就有信號輸出,轉軸旋轉時,就會不斷地產生脈沖信號輸出。如果在圓周上粘上多粒磁鋼,可以實現旋轉一周,獲得多個脈沖輸出。在粘磁鋼時要注意,霍爾感測器對磁場方向敏感,粘之前可以先手動接近一下感測器,如果沒有信號輸出,可以換一個方向再試。這種感測器不怕灰塵、油污,在工業現場應用廣泛。
2 硬體電路設計
測速的方法決定了測速信號的硬體連接,測速實際上就是測頻,因此,頻率測量的一些原則同樣適用於測速。
通常可以用計數法、測脈寬法和等精度法來進行測試。所謂計數法,就是給定一個閘門時間,在閘門時間內計數輸入的脈沖個數;測脈寬法是利用待測信號的脈寬來控冊大仿製計數門,對一個高精度的高頻計數信號進行計數。由於閘門與被測信號不能同步,因此,這兩種方法都存在±1誤差的問題,第一種方法適用於信號頻率高時使用,第二種方法則在信號頻率低時使用。等精度法則對高、低頻信號都有很好的適應性。
圖2是測速電路的信號獲取部分,在電源輸入端並聯電容C2用來濾去電源尖嘯,使霍爾元件穩定工作。HG表示霍爾元件,採用CS3020,在霍爾元件輸出端(引腳3)與地並聯電容C3濾去波形尖峰,再接一個上拉電阻R2,然後將其接入LM324的引腳3。用LM324構成一個電壓比較器,將霍爾元件輸出電壓與電位器RP1比較得出高低電平信號給單片機讀取。C4用於波形整形,以保證獲得良好數字信號。LED便於觀察,當比較器輸出高電平時不亮,低電平時亮。微型電機M可採用 型,通過電位器RP1分壓,實現提高或降低電機轉速的目的。C1電容使電機的速度不會產生突變,因為電容能存儲電荷。
電壓比較器的功能:比較兩個電壓的大小(用輸出電壓的高或低電平,表示兩個輸入電壓的大小關系):
當州纖「+」輸入端電壓高於「-」輸入端時,電壓比較器輸出為高電平;
當「+」輸入端電壓低於「-」輸入端時,電壓比較器輸出為低電平;
比較器還有整形的作用,利用這一特點可使單片機獲得良好穩定的輸出信號,不至於丟失信號,能提高測速的精確性和穩定性。
圖.2 測速電路原理圖
3 測速程序
測量轉速,使用霍爾感測器,被測軸安裝有1隻磁鋼,即轉軸每轉一周,產生1個脈沖,要求將轉速值(轉/分)顯示在數碼管上。
用C語言編制的程序如下:
//硬體:老版STC實驗版
//P3-5口接轉速脈沖
#include <STC12C5410AD.H> // 單仿桐片機內部專用寄存器定義
#define uchar unsigned char
#define uint unsigned int //數據類型的宏定義
uchar code LK[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,} ;//數碼管0~9的字型碼
uchar LK1[4]={0xfe,0xfd,0xfb,0xf7}; //位選碼
uint data z,counter; //定義無符號整型全局變數lk
//====================================================
void init(void) //定義名為init的初始化子函數
{ //init子函數開始,分別賦值
TMOD=0X51; //GATE C/T M1 M0 GATE C/T M1 M0 計數器T1 定時器T0
// 0 1 0 1 0 0 0 1
TH1=0; //計數器初始值
TL1=0;
TH0=-(50000/256); //定時器t0 定時50ms
TL0=-(50000%256);

EA=1; // IE=0X00; //EA - ET1 ES ET1 EX1 ET0 EX0
ET0=1; // 1 0 0 0 0 0 1 0
TR1=1;
TR0=1;
TF0=1;
}
//=============================================
void delay(uint k)//延時程序
{
uint data i,j;
for(i=0;i<k;i++)
{
for(;j<121;j++) {;}
}
}
//================================================
void display(void) //數碼管顯示
{
P1=LK[z/1000];P2=LK1[0];delay(10);
P1=LK[(z/100)%10];P2=LK1[1];delay(10);
P1=LK[(z%100)/10];P2=LK1[2];delay(10);
P1=LK[z%10];P2=LK1[3];delay(10);
}
//=========================================
void main(void) //主程序開始
{
uint temp1,temp2;
init(); //調用init初始化子函數

for(;;)
{

temp1=TL1;temp2=TH1;
counter=(temp2<<8)+temp1; //讀出計數器值並轉化為十進制
//z=counter;
display();
} //無限循環語句結束
} //主程序結束
//===================================================
// uint chushi=60;
void timer0(void) interrupt 1 using 1
{

TH0=-(50000/256); //定時器t0 定時50ms
TL0=-(50000%256);

// chushi--;
// if(chushi<=0){
z=counter /0.5 ; //讀出速度
//}
TH0=0; //每50MS清一次定時器
TL1=0;
}
霍爾測速
測速是工農業生產中經常遇到的問題,學會使用單片機技術設計測速儀表具有很重要的意義。要測速,首先要解決是采樣的問題。在使用模擬技術製作測速表時,常用測速發電機的方法,即將測速發電機的轉軸與待測軸相連,測速發電機的電壓高低反映了轉速的高低。使用單片機進行測速,可以使用簡單的脈沖計數法。只要轉軸每旋轉一周,產生一個或固定的多個脈沖,並將脈沖送入單片機中進行計數,即可獲得轉速的信息。
下面以常見的玩具電機作為測速對象,用CS3020設計信號獲取電路,通過電壓比較器實現計數脈沖的輸出,既可在單片機實驗箱進行轉速測量,也可直接將輸出接到頻率計或脈沖計數器,得到單位時間內的脈沖數,進行換算即可得電機轉速。這樣可少用硬體,不需編程,但僅是對霍爾感測器測速應用的驗證。
1 脈沖信號的獲得
霍爾感測器是對磁敏感的感測元件,常用於開關信號採集的有CS3020、CS3040等,這種感測器是一個3端器件,外形與三極體相似,只要接上電源、地,即可工作,輸出通常是集電極開路(OC)門輸出,工作電壓范圍寬,使用非常方便。如圖1所示是CS3020的外形圖,將有字面對准自己,三根引腳從左向右分別是Vcc,地,輸出。

『玖』 用單片機C51中的計數器來測霍爾感測器轉一圈的時間程序

#include<reg52.h>

#include<Star1602.h>

#define CIRCLE 1.8 //宏定義 車輪的周長(這個要根據實際的車輪進行設置)

sbit Signal = P1^0; //這里的Signal表示的是霍爾傳碰友感器的信號引腳

int m_second=0; //定義變數m_second,用來記錄時間(笑鍵槐以毫秒為單位)

float speed=0.0 ; //定義速度變數

float length=0.0 ;//定義路程變數

void main()

{

lcd_init(); //初始化液晶函數

TMOD = 0x01; //打開定時器0,並設定其工作方式為16位定時模式。

TH0=(65536-10000)/ 256;

TL0=(65536-10000)% 256; //設定定時器的初值,亮滲使得沒10ms中斷一次

EA = 1; //允許總中斷

ET0 = 1; //允許定時器0終端

TR0 = 1; //啟動定時器0

while(1) //大循環

{

while(Signal); //等待霍爾感測器信號線拉低;

speed = CIRCLE *1000 / m_second ; //計算速度。

m_second = 0; //計時清零

length += CIRCLE ; //路程加一個車輪周期

//第一行,顯示速度

lcd_pos(0x0); //設定液晶的寫入位置為第一行第一格

lcd_wdat(『S』);

lcd_wdat(『p』);

lcd_wdat(『e』);

lcd_wdat(『e』);

lcd_wdat(『d』);

lcd_wdat(『:』);

lcd_wdat( (int)speed%10 ); //顯示速度的整數部分

lcd_wdat( (int)(speed*10)%10 ); //顯示速度的小數第一位

lcd_wdat( (int)(speed*100)%10 ); //顯示速度的小數第二位

lcd_wdat(『m』);

lcd_wdat(『/』);

lcd_wdat(『s』);

//第二行,顯示里程

lcd_pos(0x80); //設定液晶的寫入位置為第二行第一格

lcd_wdat(『L』);

lcd_wdat(『e』);

lcd_wdat(『n』);

lcd_wdat(『g』);

lcd_wdat(『t』);

lcd_wdat(『h』);

lcd_wdat(『:』);

lcd_wdat(length /10000+0x30); //顯示里程的萬位;

lcd_wdat(length %10000/1000+0x30); //顯示里程的千位;

lcd_wdat(length %1000/100+0x30); //顯示里程的百位;

lcd_wdat(length %100/10+0x30); //顯示里程的十位;

lcd_wdat(length %10+0x30); //顯示里程的個位;

lcd_wdat(『m』);

}

}

void timer0_intt() interrupt 1 //

{

TH0=(65536-10000)/ 256;

TL0=(65536-10000)% 256; //設定定時器的初值,使得沒10ms中斷一次

m_second += 10; //因為中斷每10毫秒一次,所以這里每次加10;

}

附件1 Star1602.h
#ifndef __STAR1602_H__

#define __STAR1602_H__

sbit rs= P2^0; //

sbit rw = P2^1; //

sbit ep = P2^2; //

void lcd_init(); //液晶初始化函數

void lcd_pos(unsigned char pos); //設定液晶的顯示位置函數

void lcd_wdat(unsigned char dat); //液晶寫入字元

void lcd_write_int(unsigned int x); //液晶顯示一個整形變數

#endif

附件2 Star1602.c
#include <reg52.h>

#include "1602.h"

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

函數功能:LCD延時子程序

入口參數:ms

出口參數:

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

static void delay(unsigned char ms)

{

unsigned char i;

while(ms--)

{

for(i = 0; i< 5; i++);

}

}

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

函數功能:測試LCD忙碌狀態

入口參數:

出口參數:result

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

static bit lcd_bz()

{

bit result;

rs = 0;

rw = 1;

ep = 1;

delay(5);

result = (bit)(P0 & 0x80);

ep = 0;

return result;

}

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

函數功能:寫指令數據到LCD子程序

入口參數:cmd

出口參數:

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

static void lcd_wcmd(unsigned char cmd)

{

while(lcd_bz()); //判斷LCD是否忙碌

rs = 0;

rw = 0;

ep = 0;

delay(5);

P0 = cmd;

delay(5);

ep = 1;

delay(5);

ep = 0;

}

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

函數功能:設定顯示位置子程序

入口參數:pos

出口參數:

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

void lcd_pos(unsigned char pos)

{

lcd_wcmd(pos | 0x80);

}

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

函數功能:寫入顯示數據到LCD子程序

入口參數:dat

出口參數:

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

void lcd_wdat(unsigned char dat)

{

while(lcd_bz()); //判斷LCD是否忙碌

rs = 1;

rw = 0;

ep = 0;

P0 = dat;

delay(5);

ep = 1;

delay(5);

ep = 0;

}

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

函數功能:LCD初始化子程序

入口參數:

出口參數:

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

void lcd_init()

{

lcd_wcmd(0x38);

delay(100);

lcd_wcmd(0x0c);

delay(100);

lcd_wcmd(0x06);

delay(100);

lcd_wcmd(0x01);

delay(100);

}

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

函數功能:LCD寫入一個整形數據

入口參數:int x

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

void lcd_write_int(unsigned int x);

{

unsigned char x1,x2,x3,x4,x5;

x1 = x/10000;

x2=x%10000/1000;

x3=x%1000/100;

x4=x%100/10;

x5=x%10;
lcd_wdat(x1+0x30);

lcd_wdat(x2+0x30);

lcd_wdat(x3+0x30);

lcd_wdat(x4+0x30);

lcd_wdat(x5+0x30);

}

『拾』 本人採用單片機STC89C54RD+做了一個設計,其中定時器0和1已經用了,現在還想加一個霍爾感測器做測速用,

本人採用單片機STC89C54RD+做了一個設計,其中定時器0和1已經用了,現在還想加一個霍爾感測器做測速用,
將感測器的信號線接外部中斷0,這個決定非汪歲常正確!
問題是只用一個外部中斷0可以實現測速嗎?完全可以,一點不打折。
如果不行要怎麼改?銀帆肯定能行。
定時器可以疊加使用嗎?加一個定時器2可以實現嗎?要怎麼設置呢?

不要這么麻煩。

現在說解鋒陵雹決方法:
1、定義一個全局變數,unsigned int huoer; //霍爾計數器
2、定義一個全局變數,unsigned int hr_time; //霍爾計數的時間
3、外部中斷0服務函數中, huoer++; //增量霍爾計數
4、在一個定時時間比較長的定時中斷中,hr_time++; //霍爾計數的時間累計,用條件判斷適時停止hr_time增量(時間到了)
5、 主程序中,轉速=huoer/hr_time