標(biāo)題: 完整的單片機(jī)霍爾測速程序+原理圖 [打印本頁]

作者: idealize    時(shí)間: 2016-6-30 19:01
標(biāo)題: 完整的單片機(jī)霍爾測速程序+原理圖
經(jīng)本人編寫的正確的霍爾測速程序以及正確的原理圖
  1. /************霍爾測速儀******************/
  2. /****************************************/
  3. /****************************************/
  4. /**編寫人:劉夢宇**/
  5. /**主控芯片:STC89C52RC**/
  6. /**晶振12MHZ**/
  7. #include<reg52.h>
  8. #include<intrins.h>
  9. #define uint8 unsigned char
  10. #define uint16 unsigned int
  11. #define CMD 0x00
  12. #define DAT 0x01
  13. #define DataPort P0//LCD數(shù)據(jù)口
  14. sbit RW=P2^6;         
  15. sbit RS=P2^5;
  16. sbit E=P2^7;
  17. uint16 N=0;
  18. uint8 C_50ms;
  19. uint8 Z=0;
  20. uint8 count=0;
  21. bit flag_1s=0;
  22. /**ms級延時(shí)子程序**/
  23. void delay(uint16 t)
  24. {
  25.         uint16 a;
  26.         for(;t>0;t--)
  27.                 for(a=123;a>0;a--);
  28. }
  29. /**LCD時(shí)序**/
  30. void write_LCD(uint8 dat,bit rs)
  31. {
  32.         E=0;
  33.         RW=0;
  34.         RS=rs;//選擇指令or數(shù)據(jù)
  35.         _nop_();
  36.         _nop_();
  37.         _nop_();
  38.         E=1;
  39.         _nop_();//delay(1);
  40.         _nop_();
  41.         _nop_();
  42.         DataPort=dat;//將數(shù)據(jù)送到LCD數(shù)據(jù)口
  43.         _nop_();
  44.         _nop_();
  45.         _nop_();
  46.         E=0;
  47.         delay(1);
  48. }
  49. /**LCD選擇顯示位置子函數(shù)**/
  50. void SetXY(uint8 x,uint8 y)
  51. {
  52.         x=x&0x0f;//防止X、Y        超過量程
  53.         y=y&0x01;
  54.         if(y)
  55.         {
  56.                 write_LCD(0x80+x,CMD);
  57.         }
  58.         else
  59.         {
  60.                 write_LCD(0xc0+x,CMD);
  61.         }
  62. }
  63. /**轉(zhuǎn)速數(shù)值轉(zhuǎn)換子函數(shù)**/
  64. void disload(uint16 a)
  65. {
  66.         SetXY(4,0);
  67.         write_LCD(a/1000+'0',DAT);
  68.         write_LCD(a%1000/100+'0',DAT);
  69.         write_LCD(a%100/10+'0',DAT);
  70.         write_LCD(a%10+'0',DAT);
  71.         write_LCD('r',DAT);
  72.         write_LCD('/',DAT);
  73.         write_LCD('m',DAT);
  74.         write_LCD('i',DAT);
  75.         write_LCD('n',DAT);
  76. }
  77. /**LCD字符指針函數(shù)**/
  78. void LCD_wrstr(uint8*str)
  79. {
  80.         while(*str!='\0')
  81.         {
  82.                 write_LCD(*str,DAT);
  83.                 str++;
  84.         }
  85. }
  86. /**初始化子程序**/
  87. void All_init()
  88. {
  89.         delay(500);
  90.         write_LCD(0x38,CMD);
  91.         write_LCD(0x38,CMD);
  92.         write_LCD(0x0c,CMD);
  93.         write_LCD(0x01,CMD);
  94.         delay(10);

  95.         SetXY(0,1);//設(shè)置標(biāo)題顯示位置
  96.         LCD_wrstr("Tachometer:");
  97.        
  98.         TMOD=0x01;//設(shè)置T0位工作方式1——作為16位定時(shí)器
  99.         ET0=1;//打開定時(shí)器0的中斷
  100.         TR0=1;//打開定時(shí)器0
  101.         TH0=(65536-50000)/256;//裝入初值
  102.         TL0=(65536-50000)%256;
  103.         IT0=1;//外部中斷0為下降沿中斷
  104.         EX0=1;//打開外部中斷               
  105.         EA=1;//打開總中斷
  106. }
  107. void main()
  108. {
  109.         All_init();//先進(jìn)行初始化
  110.         while(1)
  111.         {
  112.                 if(flag_1s==1)
  113.                 {
  114.                         flag_1s=0;//1s標(biāo)志位清零
  115.                         disload(N);
  116.                 }
  117.         }

  118. }
  119. /**定時(shí)器0中斷服務(wù)子程序**/                                          
  120. void timer0() interrupt 1
  121. {
  122.         TH0=(65536-50000)/256;
  123.         TL0=(65536-50000)%256;
  124.         if(++C_50ms>19)
  125.         {
  126.                 EX0=0;//關(guān)閉外部中斷0
  127.                 C_50ms=0;//定時(shí)1s之后C_50ms清零
  128.                 N=60*Z;//計(jì)算轉(zhuǎn)速
  129.                 Z=0;//初始化圈數(shù)
  130.                 flag_1s=1;//1s標(biāo)志位置1
  131.                 TH0=0x3c;//重新賦值
  132.                 TL0=0xb0;               
  133.                 EX0=1;//打開外部中斷0,開始計(jì)數(shù)。
  134.         }
  135. }
  136. void wai0() interrupt 0
  137. {
  138.         count++;
  139.         if(count==2) //兩次外部脈沖,電機(jī)轉(zhuǎn)一圈。
  140.         {
  141.                 Z++;//轉(zhuǎn)圈+1
  142.                 count=0;//初始計(jì)數(shù)值
  143.         }
  144.        
  145. }
復(fù)制代碼

霍爾測速儀.pdf

176.55 KB, 下載次數(shù): 549, 下載積分: 黑幣 -5

原理圖

正確的霍爾測速程序.doc

36.5 KB, 下載次數(shù): 586, 下載積分: 黑幣 -5

程序


作者: admin    時(shí)間: 2016-7-1 00:35
霍爾測速的好東東,對初學(xué)者很有幫助,51黑有你更精彩!!
作者: 奧斯特洛夫斯基    時(shí)間: 2016-7-1 07:01
為什么電阻沒阻值?還有各元件的名稱?
作者: idealize    時(shí)間: 2016-7-5 08:55
奧斯特洛夫斯基 發(fā)表于 2016-7-1 07:01
為什么電阻沒阻值?還有各元件的名稱?

R4  470
R2、R3、R5  10K
電位器 104
忘標(biāo)了  抱歉
作者: hongsy11    時(shí)間: 2016-11-2 23:35
為什么程序是要弄到顯示屏顯示,覺得用串口打印出來顯示可能更好便于調(diào)試吧!
不過還是不太懂霍爾傳感器,霍爾傳感器的接線是怎么接的?
作者: huang917500    時(shí)間: 2016-12-6 22:58
謝謝,感謝分享!
作者: 叮當(dāng)貓    時(shí)間: 2017-3-15 11:15
確實(shí)很簡潔,又實(shí)現(xiàn)了測速功能
作者: 1447918177    時(shí)間: 2017-4-7 15:06
怎么仿真的時(shí)候一直是0000
作者: dzbj    時(shí)間: 2017-4-7 15:43
本帖最后由 dzbj 于 2017-4-7 15:47 編輯

現(xiàn)在常用的霍爾開關(guān)基本上是直接輸出電位 不需要用三極管開關(guān)一下 片子可以直接采集脈沖

在初始化時(shí)鐘時(shí) 開外部中斷 然后設(shè)置成下降沿觸發(fā)

void Chk_Rate()                //*轉(zhuǎn)速檢測
{
        if(num_ES>=20)                                        //如果 到達(dá)設(shè)定值(每5ms一個(gè)中斷 總計(jì)100ms)
        {
                SD[6]=Rate_num;                                        //賦值 系統(tǒng)緩沖區(qū)位6值為當(dāng)前采集到的int1觸發(fā)次數(shù)
                Rate_num=0;                                                //頻率采集計(jì)數(shù)器清零
                num_ES=0;                                                //計(jì)時(shí)器ES清零
        }
}

void Server_Int1() interrupt 2        //服務(wù) 外部中斷1
{
        Rate_num++;                //頻率計(jì)數(shù)器自加
}

然后處理SD[6]里的數(shù)據(jù)就可以了 我用100ms踩一次是為了兼容最大轉(zhuǎn)速 一圈用12個(gè)磁點(diǎn) 最高轉(zhuǎn)速7000/分 在一個(gè)8位下能滿足最高轉(zhuǎn)速的間隔也就100ms左右
實(shí)際顯示時(shí)刷屏的間隔遠(yuǎn)大于100ms 不需要不斷的刷新 小于200ms的刷新速率看著就有點(diǎn)別扭了 一般1s刷一次就可以 不需要采集轉(zhuǎn)速時(shí)不調(diào)用"Chk_Rate()"函數(shù) 讓它自己溢出 調(diào)用的時(shí)候 SD[6]每100ms被更新一次 到需要顯示的時(shí)候肯定是準(zhǔn)確的 而不是溢出后重新計(jì)入的

作者: zeng10119    時(shí)間: 2017-4-9 13:24
學(xué)習(xí)一下,用來做小車測速!謝謝分享!
作者: zeng10119    時(shí)間: 2017-4-10 18:27
洛水神仙 發(fā)表于 2017-4-10 15:23
真的幫上我的忙啦,拜謝樓主

能用嗎?我試了下怎么都是整數(shù)的轉(zhuǎn)速,60 12 180這些的。我使用開關(guān)型霍爾器件,VCC,GND,D0,A0這幾個(gè)接口的,然后接到D0
作者: tjx小星星    時(shí)間: 2017-4-17 12:10
哥,那個(gè)地方N=60*Z,可不可以給我解釋為啥要乘60
作者: 虎牙51    時(shí)間: 2017-5-10 09:23
謝謝,正在學(xué)習(xí)了測速功能。
作者: jingshe    時(shí)間: 2017-6-7 15:39
我正在以這個(gè)學(xué)習(xí)測四路速度信號,結(jié)果改瞎了,還是沒出來。
作者: 柔情歲月    時(shí)間: 2017-9-13 16:11
60hz 最高每分鐘360轉(zhuǎn)?
作者: 持勤補(bǔ)拙    時(shí)間: 2017-9-21 19:18
試著做個(gè)玩玩
作者: faridzled    時(shí)間: 2017-9-22 07:29
thanks for sharing
作者: cy218    時(shí)間: 2017-9-23 10:35
看下,自己寫的出問題了,實(shí)際應(yīng)用不過關(guān)
作者: jyc1001    時(shí)間: 2017-10-10 03:00
可以搞個(gè)轉(zhuǎn)速表
作者: 柔情歲月    時(shí)間: 2017-10-25 15:25
柔情歲月 發(fā)表于 2017-9-13 16:15
60Hz 最高360一分鐘?

后來重新測試了沒問題。!
作者: sxw    時(shí)間: 2017-11-22 16:13
請問一下,這個(gè)霍爾元件型號是?

作者: nszzm    時(shí)間: 2017-12-11 20:48
現(xiàn)在就缺這個(gè),能不能做個(gè)電動機(jī)測速表
作者: 急不可待    時(shí)間: 2017-12-25 21:57
這是樓主程序仿真,

2017-12-25_215042.jpg (246.44 KB, 下載次數(shù): 201)

2017-12-25_215042.jpg

作者: 急不可待    時(shí)間: 2018-1-1 11:03
樓主的程序?qū)嵨飦砹。測速是60    60 的跳,

IMG_20180101_102840.jpg (672.7 KB, 下載次數(shù): 197)

IMG_20180101_102840.jpg

IMG_20180101_102722.jpg (701.2 KB, 下載次數(shù): 186)

IMG_20180101_102722.jpg

IMG_20180101_102714.jpg (690.57 KB, 下載次數(shù): 181)

IMG_20180101_102714.jpg

IMG_20180101_102923.jpg (632.07 KB, 下載次數(shù): 231)

IMG_20180101_102923.jpg

IMG_20180101_102909.jpg (579.32 KB, 下載次數(shù): 200)

IMG_20180101_102909.jpg

作者: 1367826804    時(shí)間: 2018-1-2 20:15
這個(gè)程序?qū)雴纹瑱C(jī)后顯示0000,怎樣能使數(shù)據(jù)變動
作者: 1367826804    時(shí)間: 2018-1-2 20:18
急不可待 發(fā)表于 2018-1-1 11:03
樓主的程序?qū)嵨飦砹恕y速是60    60 的跳,

怎樣讓數(shù)據(jù)跳動起來
作者: 急不可待    時(shí)間: 2018-1-2 22:24
1367826804 發(fā)表于 2018-1-2 20:15
這個(gè)程序?qū)雴纹瑱C(jī)后顯示0000,怎樣能使數(shù)據(jù)變動

這個(gè)是測速軟件。需要有轉(zhuǎn)速,
作者: 1367826804    時(shí)間: 2018-1-3 13:35
急不可待 發(fā)表于 2018-1-2 22:24
這個(gè)是測速軟件。需要有轉(zhuǎn)速,

測速怎樣加,在單片機(jī)上加入線性霍爾傳感器后,顯示0000r/min,然后拿磁鐵靠近時(shí)顯示b/min
作者: chiao2016    時(shí)間: 2018-1-3 15:07
下載下來,參考一下
作者: 1367826804    時(shí)間: 2018-1-3 20:06
急不可待 發(fā)表于 2018-1-2 22:24
這個(gè)是測速軟件。需要有轉(zhuǎn)速,

這是線性霍爾傳感器還是模擬霍爾傳感器
作者: 1367826804    時(shí)間: 2018-1-3 21:50
急不可待 發(fā)表于 2017-12-25 21:57
這是樓主程序仿真,

可以把這個(gè)仿真發(fā)我一份么
作者: 急不可待    時(shí)間: 2018-1-4 22:20
仿真               

霍爾測速仿真1.zip

1.43 MB, 下載次數(shù): 49, 下載積分: 黑幣 -5


作者: 宮商角徵羽smile    時(shí)間: 2018-4-21 16:10
1593275953 發(fā)表于 2017-5-24 10:28
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

是LCD顯示
作者: 一只常德蛤蟆皮    時(shí)間: 2018-4-21 21:11
謝謝樓主分享 學(xué)習(xí)了
作者: 宮商角徵羽smile    時(shí)間: 2018-5-1 15:11
樓主,有PROTEUS仿真嗎?
作者: 宮商角徵羽smile    時(shí)間: 2018-5-4 08:47
急不可待 發(fā)表于 2018-1-4 22:20
仿真

你的壓縮包里沒有仿真圖,只有.c文件
作者: wwalk.    時(shí)間: 2018-5-5 10:57
急不可待 發(fā)表于 2017-12-25 21:57
這是樓主程序仿真,

樓主右下角 中斷源是怎么搞的  模擬霍爾元件嗎?

作者: fang98512400    時(shí)間: 2018-5-30 22:17
樓主,如果我想直接用你的例程,但是原理圖接口不一樣,那我應(yīng)該改哪些數(shù)據(jù)才能正確運(yùn)行在我的開發(fā)板上?抱歉,我是新手,可能問了一個(gè)十分愚蠢的問題。

1.JPG (73.78 KB, 下載次數(shù): 186)

52

52

2.JPG (23.7 KB, 下載次數(shù): 190)

LCD

LCD

3.JPG (43.97 KB, 下載次數(shù): 180)

模數(shù)

模數(shù)

4.JPG (40.91 KB, 下載次數(shù): 183)

串行口

串行口

作者: linnyshow    時(shí)間: 2018-5-31 20:01
材料很完整。。。
作者: ljf007    時(shí)間: 2018-6-24 10:40
看了這個(gè)之后很有啟發(fā)。
作者: 華仔    時(shí)間: 2018-7-13 15:45
不錯(cuò),好東西,程序能夠運(yùn)行,一點(diǎn)錯(cuò)誤都沒有,正需要,謝謝
作者: chenbinhavebeen    時(shí)間: 2018-7-19 20:27
dzbj 發(fā)表于 2017-4-7 15:43
現(xiàn)在常用的霍爾開關(guān)基本上是直接輸出電位 不需要用三極管開關(guān)一下 片子可以直接采集脈沖

在初始化時(shí)鐘時(shí) ...

有詳細(xì)代碼嗎?急需
作者: lyhot    時(shí)間: 2018-10-16 17:31
51黑有你更精彩。
作者: 哪哪兒啊    時(shí)間: 2018-11-23 13:18
能分享一下原理圖嗎,在AD打開的

作者: 愛單片機(jī)喲    時(shí)間: 2018-11-23 15:14

謝謝你的幫助,挺管用的
作者: qq1023721750    時(shí)間: 2019-1-22 11:01
學(xué)習(xí)一下
作者: centch    時(shí)間: 2019-3-10 21:15
正在學(xué)習(xí),很不錯(cuò)的資料。多謝。
作者: 啦啦啦鄺小云    時(shí)間: 2019-3-14 18:05
謝謝分享
作者: 819698895    時(shí)間: 2019-4-10 09:53
idealize 發(fā)表于 2016-7-5 08:55
R4  470
R2、R3、R5  10K
電位器 104

學(xué)習(xí)了,挺好的
作者: 陳小聰    時(shí)間: 2019-4-18 21:09
tjx小星星 發(fā)表于 2017-4-17 12:10
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

測的是一秒轉(zhuǎn)多少圈,轉(zhuǎn)速單位一般都是 xx轉(zhuǎn)/分
作者: 沈一光    時(shí)間: 2019-4-29 20:05
對我很有幫助
作者: YXun    時(shí)間: 2019-6-16 11:53
  點(diǎn)贊學(xué)習(xí)了
作者: ZimuQAQ    時(shí)間: 2019-6-28 14:15
請問我的LCD不顯示是數(shù)據(jù)是什么原因呢?
作者: 404098919    時(shí)間: 2019-8-12 09:25
這個(gè)好,能看懂
作者: 漠北書生    時(shí)間: 2019-12-26 21:03
不錯(cuò),學(xué)習(xí)了
作者: wlhuang    時(shí)間: 2020-3-3 19:42
感謝分享!
作者: kevintang    時(shí)間: 2020-3-4 21:59
感謝分享!
作者: 51black-wj    時(shí)間: 2020-3-6 19:38
lz,板子型號推送一下
作者: trewtrwe    時(shí)間: 2020-4-12 14:21
正在找這個(gè)程序,真給力啊
作者: ll。。    時(shí)間: 2020-9-19 11:03
能不能把元器件列個(gè)表格出來
作者: ll。。    時(shí)間: 2020-9-19 11:06
能說一下用了都是什么元器件嗎,還有規(guī)格
作者: ll。。    時(shí)間: 2020-9-23 19:10
急不可待 發(fā)表于 2017-12-25 21:57
這是樓主程序仿真,

為什么我仿真不出來呢
作者: 長風(fēng)007    時(shí)間: 2020-9-23 19:45
樓主不錯(cuò),最好能將器件的型號列出來。
作者: 李建剛    時(shí)間: 2020-9-24 15:00
下載了好幾次,才下載成功,扣了好幾次分,51太黑了
作者: 阿羊    時(shí)間: 2020-12-9 20:30
華仔 發(fā)表于 2018-7-13 15:45
不錯(cuò),好東西,程序能夠運(yùn)行,一點(diǎn)錯(cuò)誤都沒有,正需要,謝謝

可以交流一下嗎?,最近在做會用到,小白有點(diǎn)迷
作者: chjchj816    時(shí)間: 2020-12-10 20:46
有參考價(jià)值  學(xué)學(xué)看看
作者: 阿羊    時(shí)間: 2020-12-12 19:51
急不可待 發(fā)表于 2018-1-1 11:03
樓主的程序?qū)嵨飦砹。測速是60    60 的跳,

大哥在嗎,我想問一下您這個(gè)霍爾測速的用到了哪些原件可以跟小弟說一下嗎
作者: HJ_S    時(shí)間: 2020-12-24 01:45
資料不錯(cuò),51黑有你更精彩
作者: untiltheday.    時(shí)間: 2021-1-1 19:24
求助,這個(gè)程序沒有寫霍爾輸出放在哪個(gè)口,為什么原理圖里測輸出的確是在3.2的IO口
作者: silence991    時(shí)間: 2022-11-19 17:16
tjx小星星 發(fā)表于 2017-4-17 12:10
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

轉(zhuǎn)速是r/min,秒換算成分鐘,要乘以60
作者: 1261867136qq    時(shí)間: 2022-11-23 08:37
fang98512400 發(fā)表于 2018-5-30 22:17
樓主,如果我想直接用你的例程,但是原理圖接口不一樣,那我應(yīng)該改哪些數(shù)據(jù)才能正確運(yùn)行在我的開發(fā)板上? ...

先看懂樓主硬件 ~~~
作者: QQQQ987    時(shí)間: 2023-11-13 21:48
fang98512400 發(fā)表于 2018-5-30 22:17
樓主,如果我想直接用你的例程,但是原理圖接口不一樣,那我應(yīng)該改哪些數(shù)據(jù)才能正確運(yùn)行在我的開發(fā)板上? ...

確實(shí)要模轉(zhuǎn)數(shù)進(jìn)行轉(zhuǎn)換,,




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1