0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于PIC微控制器的數(shù)字車速表和里程表電路

科技觀察員 ? 來(lái)源:circuitdigest ? 作者:阿斯文斯·拉吉 ? 2023-01-25 15:06 ? 次閱讀

測(cè)量車輛或電機(jī)的速度/轉(zhuǎn)速一直是我們嘗試的迷人項(xiàng)目。因此,在本項(xiàng)目中,我們將使用工業(yè)就緒的PIC微控制器構(gòu)建一個(gè)。我們將使用一塊磁鐵和一個(gè)霍爾傳感器來(lái)測(cè)量速度。還有其他方法/傳感器可以測(cè)量速度,但是,使用霍爾傳感器很便宜,也可用于任何類型的電機(jī)/車輛。通過(guò)做這個(gè)項(xiàng)目,我們還將提高我們學(xué)習(xí)PIC16F877A的技能,因?yàn)樵擁?xiàng)目涉及中斷和定時(shí)器的使用。在該項(xiàng)目結(jié)束時(shí),您將能夠計(jì)算任何旋轉(zhuǎn)物體所覆蓋的速度和距離,并將其顯示在 16x2 LCD 屏幕上。讓我們從這個(gè)帶有PIC的數(shù)字車速表和里程表電路開始。

所需材料:

  1. PIC16F877A
  2. 7805 穩(wěn)壓器
  3. 霍爾效應(yīng)傳感器 (US1881/04E)
  4. 16*2液晶顯示屏
  5. 一小塊磁鐵
  6. 連接線
  7. 電容器
  8. 面包板。
  9. 電源

計(jì)算速度和覆蓋距離:

在我們實(shí)際開始構(gòu)建電路之前,讓我們了解如何使用霍爾傳感器和磁鐵來(lái)計(jì)算車輪的速度。

霍爾傳感器是一種可以根據(jù)磁鐵的極性檢測(cè)磁鐵存在的設(shè)備。我們將一小塊磁鐵貼在車輪上,并將霍爾傳感器放置在其附近,以便每次車輪旋轉(zhuǎn)時(shí),霍爾傳感器都會(huì)檢測(cè)到它。然后,我們使用PIC微控制器上的定時(shí)器和中斷來(lái)計(jì)算車輪完全旋轉(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ì)算車輛的速度,我們必須知道車輪的半徑。在我們的項(xiàng)目中,我們使用了半徑僅為3厘米的小玩具輪。但是, 我們假設(shè)車輪的半徑為30厘米 (0.3米),以便我們可以可視化讀數(shù)。

該值也乘以 0.37699,因?yàn)槲覀冎?速度 = (RPM(直徑 * Pi)/ 60)。 公式簡(jiǎn)化為

v= radius_of_wheel * rpm * 0.37699;

一旦我們計(jì)算出速度,我們還可以使用類似的方法計(jì)算覆蓋的距離。通過(guò)我們的霍爾和磁鐵布置,我們知道輪子旋轉(zhuǎn)了多少次。我們還知道車輪的半徑,使用它我們可以找到車輪的周長(zhǎng),假設(shè)車輪的半徑為 0.3m(R),周長(zhǎng) PiRR 的值將為 0.2827。這意味著每次霍爾傳感器與磁體相遇時(shí),車輪都會(huì)覆蓋 0.2827 米的距離。

Distance_covered = distance_covered + circumference_of_the_circle

因?yàn)椋F(xiàn)在我們知道這個(gè)項(xiàng)目將如何工作,讓我們繼續(xù)我們的電路圖并開始構(gòu)建它。

電路圖和硬件設(shè)置:

1.png

這個(gè)車速表和里程表項(xiàng)目的電路圖非常簡(jiǎn)單,可以構(gòu)建在面包板上。如果您一直遵循PIC教程,那么您還可以重用我們用于學(xué)習(xí)PIC微控制器的硬件。在這里,我們使用了與PIC微控制器一起為L(zhǎng)ED閃爍構(gòu)建的相同 性能板 ,如下所示:

用于PIC微控制器的PERF包教程

PIC16F877A MCU 的引腳連接如下表所示。

S.No: 引腳編號(hào) 引腳名稱 已連接到
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)目后,如下圖所示

使用PIC的數(shù)字車速表和里程表電路

如您所見(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)行模擬即可。您將能夠注意到液晶屏工作,如下所示。

使用PIC模擬的速度表和里程表電路

為了檢查車速表和里程表是否正常工作,我已將霍爾傳感器更換為邏輯狀態(tài)設(shè)備。在仿真過(guò)程中,您可以單擊邏輯狀態(tài)按鈕來(lái)觸發(fā)中斷,并檢查所覆蓋的速度和距離是否如上所示得到更新。

對(duì) PIC16F877A 進(jìn)行編程

如前所述,我們將借助PIC16F877A微控制器中的定時(shí)器和中斷來(lái)計(jì)算車輪完全旋轉(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í)間,外部中斷確定車輪何時(shí)完成一次完整旋轉(zhuǎn)。有了這些數(shù)據(jù),在每次外部中斷期間計(jì)算車輪覆蓋的速度和距離。

計(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í)為單位獲得速度和以米為單位的距離,如下面的視頻所示。

液晶車速表和里程表電路

/*
Speedometer and Odometer for PIC16F877A
* Code by: B.Aswinth Raj
* Dated: 27-07-2017
* More details at: www.CircuitDigest.com
*/
#define _XTAL_FREQ 20000000
#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7
#include
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
int speed =0;
int milli_sec=0;
int rpm=0;
int c1,c2,c3;
int d1,d2,d3;
int distance;
//LCD Functions Developed by Circuit Digest.
void Lcd_SetBit(char data_bit) //Based on the Hex value Set the Bits of the Data Lines
{
if(data_bit& 1)
D4 = 1;
else
D4 = 0;
if(data_bit& 2)
D5 = 1;
else
D5 = 0;
if(data_bit& 4)
D6 = 1;
else
D6 = 0;
if(data_bit& 8)
D7 = 1;
else
D7 = 0;
}
void Lcd_Cmd(char a)
{
RS = 0;
Lcd_SetBit(a); //Incoming Hex value
EN = 1;
__delay_ms(4);
EN = 0;
}
void Lcd_Clear()
{
Lcd_Cmd(0); //Clear the LCD
Lcd_Cmd(1); //Move the curser to first position
}
void Lcd_Set_Cursor(char a, char b)
{
char temp,z,y;
if(a== 1)
{
temp = 0x80 + b - 1; //80H is used to move the curser
z = temp>>4; //Lower 8-bits
y = temp & 0x0F; //Upper 8-bits
Lcd_Cmd(z); //Set Row
Lcd_Cmd(y); //Set Column
}
else if(a== 2)
{
temp = 0xC0 + b - 1;
z = temp>>4; //Lower 8-bits
y = temp & 0x0F; //Upper 8-bits
Lcd_Cmd(z); //Set Row
Lcd_Cmd(y); //Set Column
}
}
void Lcd_Start()
{
Lcd_SetBit(0x00);
for(int i=1065244; i<=0; i--) NOP();
Lcd_Cmd(0x03);
__delay_ms(5);
Lcd_Cmd(0x03);
__delay_ms(11);
Lcd_Cmd(0x03);
Lcd_Cmd(0x02); //02H is used for Return home -> Clears the RAM and initializes the LCD
Lcd_Cmd(0x02); //02H is used for Return home -> Clears the RAM and initializes the LCD
Lcd_Cmd(0x08); //Select Row 1
Lcd_Cmd(0x00); //Clear Row 1 Display
Lcd_Cmd(0x0C); //Select Row 2
Lcd_Cmd(0x00); //Clear Row 2 Display
Lcd_Cmd(0x06);
}
void Lcd_Print_Char(char data) //Send 8-bits through 4-bit mode
{
char Lower_Nibble,Upper_Nibble;
Lower_Nibble = data&0x0F;
Upper_Nibble = data&0xF0;
RS = 1; // => RS = 1
Lcd_SetBit(Upper_Nibble>>4); //Send upper half by shifting by 4
EN = 1;
for(int i=2130483; i<=0; i--) NOP();
EN = 0;
Lcd_SetBit(Lower_Nibble); //Send Lower half
EN = 1;
for(int i=2130483; i<=0; i--) NOP();
EN = 0;
}
void Lcd_Print_String(char *a)
{
int i;
for(i=0;a[i]!='\\0';i++)
Lcd_Print_Char(a[i]); //Split the string using pointers and call the Char function
}
/*****End of LCD Functions*****/
/****Interrupt function ****/
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;
}
}
/****End of Interrupt Function****/
int main()
{
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 with external freq and 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
Lcd_Start();
while(1)
{
c1 = (speed/100)%10;
c2 = (speed/10)%10;
c3 = (speed/1)%10;
d1 = (distance/100)%10;
d2 = (distance/10)%10;
d3 = (distance/1)%10;
if (milli_sec>1000)
{
speed=0;
}
Lcd_Set_Cursor(1,1);
Lcd_Print_String("Speed(km/hr): ");
Lcd_Print_Char(c1+'0');
Lcd_Print_Char(c2+'0');
Lcd_Print_Char(c3+'0');
Lcd_Set_Cursor(2,1);
Lcd_Print_String("Dist_Cov(m): ");
Lcd_Print_Char(d1+'0');
Lcd_Print_Char(d2+'0');
Lcd_Print_Char(d3+'0');
}
return 0;
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • PIC微控制器
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    7370
  • 車速表
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    8277
  • 里程表
    +關(guān)注

    關(guān)注

    1

    文章

    15

    瀏覽量

    9841
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    采用ATmega16的里程表檢測(cè)儀電路設(shè)計(jì) — 電路圖天天讀(35)

    變頻控制速度,實(shí)現(xiàn)了對(duì)不同調(diào)速比的里程表的檢測(cè)。該里程表檢測(cè)儀的系統(tǒng)電路簡(jiǎn)單可靠,用它來(lái)檢測(cè)里程表
    發(fā)表于 10-30 11:01 ?4057次閱讀
    采用ATmega16的<b class='flag-5'>里程表</b>檢測(cè)儀<b class='flag-5'>電路</b>設(shè)計(jì) — <b class='flag-5'>電路</b>圖天天讀(35)

    奧迪100 2.2E里程表不計(jì)程時(shí),車速無(wú)規(guī)律擺動(dòng)的檢修方法

    的具有一定頻率的電信號(hào)變?yōu)橛杏梅讲妷盒盘?hào),以控制車速電路和驅(qū)動(dòng)里程表步進(jìn)電機(jī)。速度出現(xiàn)無(wú)規(guī)律抖動(dòng)是因?yàn)楸M管傳感
    發(fā)表于 02-25 11:42

    電動(dòng)自行車速度與里程表設(shè)計(jì)

    電動(dòng)自行車速度與里程表設(shè)計(jì)
    發(fā)表于 08-16 14:11

    納智捷汽車里程表調(diào)

    納智捷汽車里程表調(diào)Q.Q2622492007 電.話***汽車里程表主要分為兩種:1.機(jī)械(目前主要在摩托車上有)2.液晶電子表(目前
    發(fā)表于 04-26 16:48

    誰(shuí)有單片機(jī)液晶屏設(shè)計(jì)車速里程表、轉(zhuǎn)速的的設(shè)計(jì)

    誰(shuí)有單片機(jī)液晶屏設(shè)計(jì)車速里程表、轉(zhuǎn)速的的設(shè)計(jì),幫幫忙,有的給我發(fā)一份,非常感謝!QQ596916131
    發(fā)表于 05-13 08:54

    車速自動(dòng)監(jiān)測(cè)及里程表測(cè)控系統(tǒng)的設(shè)計(jì)制作

    車速自動(dòng)監(jiān)測(cè)及里程表測(cè)控系統(tǒng)的設(shè)計(jì)制作
    發(fā)表于 05-05 09:35

    什么是車速里程表信號(hào)裝置?速比該怎么計(jì)算?

    車速里程表是由指示汽車行駛速度的車速和記錄汽車所行駛過(guò)距離的里程計(jì)組成的。目前有機(jī)械式和電子式兩種。
    發(fā)表于 09-25 08:21

    里程表傳感壞了癥狀

      里程表傳感又叫轉(zhuǎn)速傳感,一般安裝在變速箱輸出軸旁邊,主要是用來(lái)檢測(cè)電控汽車輪胎的轉(zhuǎn)速,將檢測(cè)到的信號(hào)輸送到ECU,從而控制自動(dòng)變速
    發(fā)表于 06-28 16:34

    汽車車速里程表工作原理是什么?

    轉(zhuǎn)自: http://www.gzweix.com/article/sort0253/sort0487/info-287379.html新型汽車車速里程表信號(hào)采集與處理研究來(lái)源:汽車電器作者:佚名
    發(fā)表于 08-30 07:18

    輕型客車里程表電路

    輕型客車里程表電路圖 該里程表與時(shí)速是電子、機(jī)械一體化組合新型儀表。機(jī)車速度探測(cè)機(jī)構(gòu)輸出的脈沖信號(hào)
    發(fā)表于 11-08 15:19 ?2360次閱讀
    輕型客車<b class='flag-5'>里程表</b><b class='flag-5'>電路</b>圖

    車速里程表原理及速比的計(jì)算方法

    車速里程表與水溫一起,成為汽車用組合儀表上最重要的兩個(gè)儀表。車速里程表有機(jī)械式和電子式兩種,右圖所示為磁感應(yīng)式
    發(fā)表于 05-27 15:15 ?75次下載
    <b class='flag-5'>車速</b><b class='flag-5'>里程表</b>原理及速比的計(jì)算方法

    電子式里程表設(shè)計(jì)

    本設(shè)計(jì)介紹一種基于單片機(jī)的智能電子里程表。該電子式里程表是一種數(shù)字式儀表,主要由車速里程表
    發(fā)表于 10-12 17:42 ?0次下載

    車速里程表信號(hào)裝置及速比的計(jì)算分析

    制成方頭,經(jīng)過(guò)軟軸和變速上的里程表被動(dòng)齒輪連接在一起。里程表被動(dòng)齒輪旋轉(zhuǎn)帶動(dòng)軟軸內(nèi)鋼絲旋轉(zhuǎn),鋼絲帶動(dòng)車速里程表的驅(qū)動(dòng)軸旋轉(zhuǎn),使
    發(fā)表于 11-21 15:20 ?1次下載
    <b class='flag-5'>車速</b><b class='flag-5'>里程表</b>信號(hào)裝置及速比的計(jì)算分析

    電子車速里程表的單片機(jī)實(shí)現(xiàn)方案解析

    介紹了一個(gè)基于單片機(jī)的電子式轉(zhuǎn)速里程表實(shí)現(xiàn)方案,討論了里程計(jì)數(shù)的原理和轉(zhuǎn)速指示原理,給出了用單片機(jī)AT89C2051和LM1819驅(qū)動(dòng)設(shè)計(jì)的汽車轉(zhuǎn)速里程表的具體
    發(fā)表于 12-07 11:26 ?2次下載
    電子<b class='flag-5'>車速</b><b class='flag-5'>里程表</b>的單片機(jī)實(shí)現(xiàn)方案解析

    汽車、摩托車用電子車速里程表行業(yè)標(biāo)準(zhǔn)

    汽車、摩托車用電子車速里程表行業(yè)標(biāo)準(zhǔn)
    發(fā)表于 09-29 18:02 ?1次下載