測(cè)量車(chē)輛或電機(jī)的速度/轉(zhuǎn)速一直是我們嘗試的迷人項(xiàng)目。因此,在本項(xiàng)目中,我們將使用工業(yè)就緒的PIC微控制器構(gòu)建一個(gè)。我們將使用一塊磁鐵和一個(gè)霍爾傳感器來(lái)測(cè)量速度。還有其他方法/傳感器可以測(cè)量速度,但是,使用霍爾傳感器很便宜,也可用于任何類(lèi)型的電機(jī)/車(chē)輛。通過(guò)做這個(gè)項(xiàng)目,我們還將提高我們學(xué)習(xí)PIC16F877A的技能,因?yàn)樵擁?xiàng)目涉及中斷和定時(shí)器的使用。在該項(xiàng)目結(jié)束時(shí),您將能夠計(jì)算任何旋轉(zhuǎn)物體所覆蓋的速度和距離,并將其顯示在 16x2 LCD 屏幕上。讓我們從這個(gè)帶有PIC的數(shù)字車(chē)速表和里程表電路開(kāi)始。
所需材料:
計(jì)算速度和覆蓋距離:
在我們實(shí)際開(kāi)始構(gòu)建電路之前,讓我們了解如何使用霍爾傳感器和磁鐵來(lái)計(jì)算車(chē)輪的速度。
霍爾傳感器是一種可以根據(jù)磁鐵的極性檢測(cè)磁鐵存在的設(shè)備。我們將一小塊磁鐵貼在車(chē)輪上,并將霍爾傳感器放置在其附近,以便每次車(chē)輪旋轉(zhuǎn)時(shí),霍爾傳感器都會(huì)檢測(cè)到它。然后,我們使用PIC微控制器上的定時(shí)器和中斷來(lái)計(jì)算車(chē)輪完全旋轉(zhuǎn)所需的時(shí)間。
知道所花費(fèi)的時(shí)間后,我們可以使用以下公式計(jì)算 RPM,其中 1000/時(shí)間將給我們 RPS,進(jìn)一步將其乘以 60 將得到 RPM
rpm = (1000/timetaken) * 60;
其中(1000/時(shí)間)給出rps(每秒轉(zhuǎn)數(shù)),乘以60將rps轉(zhuǎn)換為rpm(每分鐘轉(zhuǎn)數(shù))。
現(xiàn)在要計(jì)算車(chē)輛的速度,我們必須知道車(chē)輪的半徑。在我們的項(xiàng)目中,我們使用了半徑僅為3厘米的小玩具輪。但是, 我們假設(shè)車(chē)輪的半徑為30厘米 (0.3米),以便我們可以可視化讀數(shù)。
該值也乘以 0.37699,因?yàn)槲覀冎?速度 = (RPM(直徑 * Pi)/ 60)。 公式簡(jiǎn)化為
v= radius_of_wheel * rpm * 0.37699;
一旦我們計(jì)算出速度,我們還可以使用類(lèi)似的方法計(jì)算覆蓋的距離。通過(guò)我們的霍爾和磁鐵布置,我們知道輪子旋轉(zhuǎn)了多少次。我們還知道車(chē)輪的半徑,使用它我們可以找到車(chē)輪的周長(zhǎng),假設(shè)車(chē)輪的半徑為 0.3m(R),周長(zhǎng) PiRR 的值將為 0.2827。這意味著每次霍爾傳感器與磁體相遇時(shí),車(chē)輪都會(huì)覆蓋 0.2827 米的距離。
Distance_covered = distance_covered + circumference_of_the_circle
因?yàn)椋F(xiàn)在我們知道這個(gè)項(xiàng)目將如何工作,讓我們繼續(xù)我們的電路圖并開(kāi)始構(gòu)建它。
電路圖和硬件設(shè)置:
這個(gè)車(chē)速表和里程表項(xiàng)目的電路圖非常簡(jiǎn)單,可以構(gòu)建在面包板上。如果您一直遵循PIC教程,那么您還可以重用我們用于學(xué)習(xí)PIC微控制器的硬件。在這里,我們使用了與PIC微控制器一起為L(zhǎng)ED閃爍構(gòu)建的相同 性能板 ,如下所示:
PIC16F877A MCU 的引腳連接如下表所示。
S.No: | 引腳編號(hào) | 引腳名稱(chēng) | 已連接到 |
---|---|---|---|
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)目后,如下圖所示
如您所見(jiàn),我用兩個(gè)盒子將電機(jī)和一個(gè)霍爾傳感器放置在附近的位置。您可以將磁鐵固定在旋轉(zhuǎn)物體上,并完好無(wú)損地靠近它的霍爾傳感器,使其能夠檢測(cè)到磁鐵。
注意: 霍爾傳感器具有極性,因此請(qǐng)確保它正在檢測(cè)哪個(gè)極并相應(yīng)地放置它。
還要確保將上拉電阻與霍爾傳感器的輸出引腳一起使用。
模擬:
該項(xiàng)目的模擬是使用 Proteus 完成的。由于該項(xiàng)目涉及移動(dòng)物體,因此無(wú)法使用仿真來(lái)演示整個(gè)項(xiàng)目,但可以驗(yàn)證LCD的工作。只需將十六進(jìn)制文件加載到模擬中并對(duì)其進(jìn)行模擬即可。您將能夠注意到液晶屏工作,如下所示。
為了檢查車(chē)速表和里程表是否正常工作,我已將霍爾傳感器更換為邏輯狀態(tài)設(shè)備。在仿真過(guò)程中,您可以單擊邏輯狀態(tài)按鈕來(lái)觸發(fā)中斷,并檢查所覆蓋的速度和距離是否如上所示得到更新。
對(duì) PIC16F877A 進(jìn)行編程:
如前所述,我們將借助PIC16F877A微控制器中的定時(shí)器和中斷來(lái)計(jì)算車(chē)輪完全旋轉(zhuǎn)所需的時(shí)間。我們已經(jīng)在之前的教程中學(xué)習(xí)了如何使用計(jì)時(shí)器。我在本文末尾給出了該項(xiàng)目的完整代碼。此外,我在下面解釋了幾行重要內(nèi)容。
以下代碼行將端口 D 初始化為用于 LCD 接口的輸出引腳,將 RB0 初始化為輸入引腳,以將其用作外部引腳。此外,我們還使用OPTION_REG啟用了內(nèi)部上拉電阻,并將64設(shè)置為預(yù)售。然后,我們啟用全局和外設(shè)中斷以啟用定時(shí)器和外部中斷。要將RB0定義為外部中斷位,應(yīng)將INTE設(shè)為高電平。溢出值設(shè)置為 100,以便每 1 毫秒觸發(fā)計(jì)時(shí)器中斷標(biāo)志 TMR0IF。這將有助于運(yùn)行毫秒計(jì)時(shí)器以確定以毫秒為單位所花費(fèi)的時(shí)間:
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
每次檢測(cè)到中斷時(shí),都會(huì)執(zhí)行以下函數(shù)。我們可以根據(jù)自己的意愿命名函數(shù),所以我將其命名為 speed_isr()。 該程序處理兩個(gè)中斷,一個(gè)是定時(shí)器中斷,另一個(gè)是外部中斷。每當(dāng)發(fā)生定時(shí)器中斷時(shí),標(biāo)志 TMR0IF 都會(huì)變高,為了清除和重置中斷,我們必須通過(guò)定義 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ā)生外部中斷時(shí),標(biāo)志 INTF 將變?yōu)楦唠娖剑@也應(yīng)通過(guò)定義 INTF=0 來(lái)清除。計(jì)時(shí)器中斷跟蹤所花費(fèi)的時(shí)間,外部中斷確定車(chē)輪何時(shí)完成一次完整旋轉(zhuǎn)。有了這些數(shù)據(jù),在每次外部中斷期間計(jì)算車(chē)輪覆蓋的速度和距離。
計(jì)算出速度和距離后,可以使用我們的LCD功能簡(jiǎn)單地顯示在LCD屏幕上。如果您不熟悉 LCD,請(qǐng)參閱我們的 LCD 與 PIC16F877A MCU 接口教程。
工作說(shuō)明:
準(zhǔn)備好硬件和軟件后,只需將代碼上傳到PIC16F877A即可。如果您是PIC的新手,那么您應(yīng)該閱讀一些有關(guān)如何將程序上傳到PIC16F877A微控制器的教程。
我使用可變鍋來(lái)調(diào)整電機(jī)的速度以進(jìn)行演示。您也可以使用相同的查找實(shí)時(shí)應(yīng)用程序。如果一切按預(yù)期工作,那么您應(yīng)該能夠以公里/小時(shí)為單位獲得速度和以米為單位的距離,如下面的視頻所示。
-
PIC微控制器
+關(guān)注
關(guān)注
0文章
17瀏覽量
7430 -
車(chē)速表
+關(guān)注
關(guān)注
0文章
14瀏覽量
8334 -
里程表
+關(guān)注
關(guān)注
1文章
15瀏覽量
9903
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論