㈠ 51單片機和霍爾元件測速問題!!!急急急!!!
我怎麼沒有看到你調用變數的顯示函數、
㈡ 51單片機系統中怎麼測直流電機的轉速,方法有幾種及各方法原理是什麼
1電源引出脈沖信號,放大整形,根據極數算出轉數,可能電源要加個小電感。
2用霍爾元件,在軸上置磁鐵,測出轉速
3軸上塗一半反光,一半不反光塗料,發光管-光敏管接收,放大整形,不可強光干擾
4軸上裝扇葉,發光管-光敏管接收,放大整形,不可強光干擾
5軸上裝旋轉編碼器,不但知道轉速,還可知道角度,方向
㈢ 單片機模擬中,用什麼代替霍爾感測器(protues)
Proteus里可以替代脈沖信號發生器的兩個,一個工具條里的就是你說的DClock,還有一個是元件:CLOCK。這兩者的用法是相似的。
㈣ 霍爾感測器在測量電機轉速時,它如何與單片機連接啊 求個電路圖 謝謝
2基於霍爾感測器的電機轉速測量系統硬體設計
2.1電機轉速測量系統的硬體電路設計
2.1.1總體硬體設計
使用單片機測量電機轉速的基本結構如圖2-1所示。該系統包括霍爾感測器、隔離整形電路、主CPU、顯示電路、報警電路及電源等部分。
圖2-1系統總體結構圖
其測量過程是測量轉速的霍爾感測器和電機機軸同軸連接,機軸每轉一周,產生一定量的脈沖個數,由霍爾器件電路輸出。經過電耦合器後,即經過隔離整形電路後,成為轉數計數器的計數脈沖。同時霍爾感測器電路輸出幅度為12V的脈沖經光電耦合後降為5V,保持同單片機AT89C51邏輯電平相一致,控制計數時間,即可實現計數器的計數值對應機軸的轉速值。主CPU將該值數據處理後,在LCD液晶顯示器上顯示出來。一旦超速,CPU通過喇叭和轉燈發出聲、光報警信號。
1.感測器部分
主要分為兩個部分。第一部分是利用霍爾器件將電機的轉速轉化為脈沖信號。霍爾測速模塊由鐵質的測速齒輪和帶有霍爾元件的支架構成。測速齒輪如圖2-2所示,齒輪厚度大約2mm,將其固定在待測電機的轉軸上。將霍爾元件固定在距齒輪外圓1mm的探頭上,霍爾元件的對面粘貼小磁鋼,當測速齒輪的每個齒經過探頭正前方時,改變了磁通密度,霍爾元件就輸出一個脈沖信號。第二部分是使用六反相器和光耦,將感測器輸出的信號進行整形隔離,減少計數的干擾。
測速齒輪霍爾元件
圖2-2轉速變換裝置
2.處理器
採用AT89C51單片機作為系統的處理器。
3.顯示部分
該部分有兩個功能,在正常情況下,通過LCD液晶顯示器顯示當前的頻率數值,當電機的轉速超出一定的范圍後,通過蜂鳴器進行報警。蜂鳴器是一種一體化結構的電子訊響器,採用直流電壓供電,廣泛應用於計算機、列印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件。
2.1.2系統電路設計
實際測量時,要把霍爾感測器固定在直流測速電機的底板上,與霍爾探頭相對的電機的軸上固定著一片磁鋼塊,電機每轉一周,霍爾感測器便發出一個脈沖信號,將此脈沖信號接到開發的多功能實驗板上的P3.2[]上,設定T0定時,每分鍾所計的進入P3.2的脈沖個數即為直流電機的轉速。
由於在虛擬模擬電路圖中,沒有電機及感測器,所以就直接用一個脈沖信號代替,電路圖如圖2-3所示。
圖2-3總體硬體電路圖
2.2霍爾感測器測量電路設計
2.2.1霍爾元件
根據霍爾效應,人們用半導體材料製成的元件叫霍爾元件。它具有對磁場敏感、結構簡單、體積小、頻率響應寬、輸出電壓變化大和使用壽命長等優點,因此,在測量、自動化、計算機和信息技術等領域得到廣泛的應用。
霍爾感測器A3144是AllegroMicroSystems公司生產的寬溫、開關型霍爾效應感測器,其工作溫度范圍可達-40℃~150℃。它由電壓調整電路、反相電源保護電路、霍爾元件、溫度補償電路、微信號放大器、施密特觸發器和OC門輸出極構成,通過使用上拉電阻可以將其輸出接入CMOS邏輯電路。該晶元具有尺寸小、穩定性好、靈敏度高等特點,有兩種封裝形式,一種是3腳貼片微小型封裝,後綴為「LH」;另一種是3腳直插式封裝,後綴為「UA」[5]。
A3144E系列單極高溫霍爾效應集成感測器是由穩壓電源,霍爾電壓發生器,差分放大器,施密特觸發器和輸出放大器組成的磁敏感測電路,其輸入為磁感應強度,輸出是一個數字電壓訊號。它是一種單磁極工作的磁敏電路,適用於矩形或者柱形磁體下工作。可應用於汽車工業和軍事工程中。
霍爾感測器的外形圖和與磁場的作用關系如圖2-4所示。磁場由磁鋼提供,所以霍爾感測器和磁鋼需要配對使用。
霍爾元件和磁鋼管腳圖
圖2-4霍爾感測器的外形圖
該霍爾感測器的接線圖如圖2-5所示。
圖2-5霍爾感測器的接線圖
2.2.2霍爾感測器測量原理
測量電機轉速的第一步就是要將電機的轉速表示為單片機可以識別的脈沖信號,從而進行脈沖計數。霍爾器件作為一種轉速測量系統的感測器,它有結構牢固、體積小、重量輕、壽命長、安裝方便等優點,因此選用霍爾感測器檢測脈沖信號,其基本的測量原理如圖2-6所示,當電機轉動時,帶動感測器運動,產生對應頻率的脈沖信號,經過信號處理後輸出到計數器或其他的脈沖計數裝置,進行轉速的測量[6]。
㈤ 如何用51單片機實現直流無刷電機的三路霍爾信號
你的意思是分別根據3路霍爾信號控制電機嗎?如果是的話,是控制轉速還是轉向,你要說明白。
我的思路是:用3個IO口測霍爾信號,根據IO口的電平分別判斷運行方式即可
㈥ 用單片機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);
}