測量車輛或電機(jī)的速度/轉(zhuǎn)速一直是我們嘗試的迷人項(xiàng)目。因此,在本項(xiàng)目中,我們將使用工業(yè)就緒的PIC微控制器構(gòu)建一個。我們將使用一塊磁鐵和一個霍爾傳感器來測量速度。還有其他方法/傳感器可以測量速度,但是,使用霍爾傳感器很便宜,也可用于任何類型的電機(jī)/車輛。通過做這個項(xiàng)目,我們還將提高我們學(xué)習(xí)PIC16F877A的技能,因?yàn)樵擁?xiàng)目涉及中斷和定時器的使用。在該項(xiàng)目結(jié)束時,您將能夠計算任何旋轉(zhuǎn)物體所覆蓋的速度和距離,并將其顯示在 16x2 LCD 屏幕上。讓我們從這個帶有PIC的數(shù)字車速表和里程表電路開始。
所需材料:
計算速度和覆蓋距離:
在我們實(shí)際開始構(gòu)建電路之前,讓我們了解如何使用霍爾傳感器和磁鐵來計算車輪的速度。
霍爾傳感器是一種可以根據(jù)磁鐵的極性檢測磁鐵存在的設(shè)備。我們將一小塊磁鐵貼在車輪上,并將霍爾傳感器放置在其附近,以便每次車輪旋轉(zhuǎn)時,霍爾傳感器都會檢測到它。然后,我們使用PIC微控制器上的定時器和中斷來計算車輪完全旋轉(zhuǎn)所需的時間。
知道所花費(fèi)的時間后,我們可以使用以下公式計算 RPM,其中 1000/時間將給我們 RPS,進(jìn)一步將其乘以 60 將得到 RPM
rpm = (1000/timetaken) * 60;
其中(1000/時間)給出rps(每秒轉(zhuǎn)數(shù)),乘以60將rps轉(zhuǎn)換為rpm(每分鐘轉(zhuǎn)數(shù))。
現(xiàn)在要計算車輛的速度,我們必須知道車輪的半徑。在我們的項(xiàng)目中,我們使用了半徑僅為3厘米的小玩具輪。但是, 我們假設(shè)車輪的半徑為30厘米 (0.3米),以便我們可以可視化讀數(shù)。
該值也乘以 0.37699,因?yàn)槲覀冎?速度 = (RPM(直徑 * Pi)/ 60)。 公式簡化為
v= radius_of_wheel * rpm * 0.37699;
一旦我們計算出速度,我們還可以使用類似的方法計算覆蓋的距離。通過我們的霍爾和磁鐵布置,我們知道輪子旋轉(zhuǎn)了多少次。我們還知道車輪的半徑,使用它我們可以找到車輪的周長,假設(shè)車輪的半徑為 0.3m(R),周長 PiRR 的值將為 0.2827。這意味著每次霍爾傳感器與磁體相遇時,車輪都會覆蓋 0.2827 米的距離。
Distance_covered = distance_covered + circumference_of_the_circle
因?yàn)?,現(xiàn)在我們知道這個項(xiàng)目將如何工作,讓我們繼續(xù)我們的電路圖并開始構(gòu)建它。
電路圖和硬件設(shè)置:
這個車速表和里程表項(xiàng)目的電路圖非常簡單,可以構(gòu)建在面包板上。如果您一直遵循PIC教程,那么您還可以重用我們用于學(xué)習(xí)PIC微控制器的硬件。在這里,我們使用了與PIC微控制器一起為LED閃爍構(gòu)建的相同 性能板 ,如下所示:
PIC16F877A MCU 的引腳連接如下表所示。
S.No: | 引腳編號 | 引腳名稱 | 已連接到 |
---|---|---|---|
1 | 21 | RD2 | 液晶顯示器的 RS |
2 | 22 | RD3 | 液晶顯示器的E |
3 | 27 | RD4 | 液晶屏D4 |
4 | 28 | RD5 | 液晶屏D5 |
5 | 29 | RD6 | 液晶屏D6 |
6 | 30 | RD7 | 液晶屏D7 |
7 | 33 | RB0/INT | 3^RD^霍爾傳感器引腳 |
構(gòu)建項(xiàng)目后,如下圖所示
如您所見,我用兩個盒子將電機(jī)和一個霍爾傳感器放置在附近的位置。您可以將磁鐵固定在旋轉(zhuǎn)物體上,并完好無損地靠近它的霍爾傳感器,使其能夠檢測到磁鐵。
注意: 霍爾傳感器具有極性,因此請確保它正在檢測哪個極并相應(yīng)地放置它。
還要確保將上拉電阻與霍爾傳感器的輸出引腳一起使用。
模擬:
該項(xiàng)目的模擬是使用 Proteus 完成的。由于該項(xiàng)目涉及移動物體,因此無法使用仿真來演示整個項(xiàng)目,但可以驗(yàn)證LCD的工作。只需將十六進(jìn)制文件加載到模擬中并對其進(jìn)行模擬即可。您將能夠注意到液晶屏工作,如下所示。
為了檢查車速表和里程表是否正常工作,我已將霍爾傳感器更換為邏輯狀態(tài)設(shè)備。在仿真過程中,您可以單擊邏輯狀態(tài)按鈕來觸發(fā)中斷,并檢查所覆蓋的速度和距離是否如上所示得到更新。
對 PIC16F877A 進(jìn)行編程:
如前所述,我們將借助PIC16F877A微控制器中的定時器和中斷來計算車輪完全旋轉(zhuǎn)所需的時間。我們已經(jīng)在之前的教程中學(xué)習(xí)了如何使用計時器。我在本文末尾給出了該項(xiàng)目的完整代碼。此外,我在下面解釋了幾行重要內(nèi)容。
以下代碼行將端口 D 初始化為用于 LCD 接口的輸出引腳,將 RB0 初始化為輸入引腳,以將其用作外部引腳。此外,我們還使用OPTION_REG啟用了內(nèi)部上拉電阻,并將64設(shè)置為預(yù)售。然后,我們啟用全局和外設(shè)中斷以啟用定時器和外部中斷。要將RB0定義為外部中斷位,應(yīng)將INTE設(shè)為高電平。溢出值設(shè)置為 100,以便每 1 毫秒觸發(fā)計時器中斷標(biāo)志 TMR0IF。這將有助于運(yùn)行毫秒計時器以確定以毫秒為單位所花費(fèi)的時間:
TRISD = 0x00; //PORTD declared as output for interfacing LCD
TRISB0 = 1; //DEfine the RB0 pin as input to use as interrupt pin
OPTION_REG = 0b00000101; // Timer0 64 as prescalar // Also Enables PULL UPs
TMR0=100; // Load the time value for 1ms; delayValue can be between 0-256 only
TMR0IE=1; //Enable timer interrupt bit in PIE1 register
GIE=1; //Enable Global Interrupt
PEIE=1; //Enable the Peripheral Interrupt
INTE = 1; //Enable RB0 as external Interrupt pin
每次檢測到中斷時,都會執(zhí)行以下函數(shù)。我們可以根據(jù)自己的意愿命名函數(shù),所以我將其命名為 speed_isr()。 該程序處理兩個中斷,一個是定時器中斷,另一個是外部中斷。每當(dāng)發(fā)生定時器中斷時,標(biāo)志 TMR0IF 都會變高,為了清除和重置中斷,我們必須通過定義 TMR0IF=0 使其變低,如下面的代碼所示。
void interrupt speed_isr()
{
if(TMR0IF==1) // Timer has overflown
{
TMR0IF=0; // Clear timer interrupt flag
milli_sec++;
}
if (INTF==1)
{
rpm = (1000/milli_sec) * 60;
speed = 0.3 * rpm * 0.37699; // (Assuming the wheel radius to be 30cm)
INTF = 0; // clear the interrupt flag
milli_sec=0;
distance= distance+028.2;
}
}
同樣,當(dāng)發(fā)生外部中斷時,標(biāo)志 INTF 將變?yōu)楦唠娖?,這也應(yīng)通過定義 INTF=0 來清除。計時器中斷跟蹤所花費(fèi)的時間,外部中斷確定車輪何時完成一次完整旋轉(zhuǎn)。有了這些數(shù)據(jù),在每次外部中斷期間計算車輪覆蓋的速度和距離。
計算出速度和距離后,可以使用我們的LCD功能簡單地顯示在LCD屏幕上。如果您不熟悉 LCD,請參閱我們的 LCD 與 PIC16F877A MCU 接口教程。
工作說明:
準(zhǔn)備好硬件和軟件后,只需將代碼上傳到PIC16F877A即可。如果您是PIC的新手,那么您應(yīng)該閱讀一些有關(guān)如何將程序上傳到PIC16F877A微控制器的教程。
我使用可變鍋來調(diào)整電機(jī)的速度以進(jìn)行演示。您也可以使用相同的查找實(shí)時應(yīng)用程序。如果一切按預(yù)期工作,那么您應(yīng)該能夠以公里/小時為單位獲得速度和以米為單位的距離,如下面的視頻所示。
-
PIC微控制器
+關(guān)注
關(guān)注
0文章
17瀏覽量
7394 -
車速表
+關(guān)注
關(guān)注
0文章
14瀏覽量
8312 -
里程表
+關(guān)注
關(guān)注
1文章
15瀏覽量
9884
發(fā)布評論請先 登錄
相關(guān)推薦
評論