精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

測量車輛或電機的速度/轉速一直是我們嘗試的迷人項目。因此,在本項目中,我們將使用工業就緒的PIC微控制器構建一個。我們將使用一塊磁鐵和一個霍爾傳感器來測量速度。還有其他方法/傳感器可以測量速度,但是,使用霍爾傳感器很便宜,也可用于任何類型的電機/車輛。通過做這個項目,我們還將提高我們學習PIC16F877A的技能,因為該項目涉及中斷和定時器的使用。在該項目結束時,您將能夠計算任何旋轉物體所覆蓋的速度和距離,并將其顯示在 16x2 LCD 屏幕上。讓我們從這個帶有PIC的數字車速表和里程表電路開始。

所需材料:

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

計算速度和覆蓋距離:

在我們實際開始構建電路之前,讓我們了解如何使用霍爾傳感器和磁鐵來計算車輪的速度。

霍爾傳感器是一種可以根據磁鐵的極性檢測磁鐵存在的設備。我們將一小塊磁鐵貼在車輪上,并將霍爾傳感器放置在其附近,以便每次車輪旋轉時,霍爾傳感器都會檢測到它。然后,我們使用PIC微控制器上的定時器和中斷來計算車輪完全旋轉所需的時間。

用于車速表和里程表電路的霍爾傳感器板

知道所花費的時間后,我們可以使用以下公式計算 RPM,其中 1000/時間將給我們 RPS,進一步將其乘以 60 將得到 RPM

rpm = (1000/timetaken) * 60;

其中(1000/時間)給出rps(每秒轉數),乘以60將rps轉換為rpm(每分鐘轉數)。

現在要計算車輛的速度,我們必須知道車輪的半徑。在我們的項目中,我們使用了半徑僅為3厘米的小玩具輪。但是, 我們假設車輪的半徑為30厘米 (0.3米),以便我們可以可視化讀數。

該值也乘以 0.37699,因為我們知道 速度 = (RPM(直徑 * Pi)/ 60)。 公式簡化為

v= radius_of_wheel * rpm * 0.37699;

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

Distance_covered = distance_covered + circumference_of_the_circle

因為,現在我們知道這個項目將如何工作,讓我們繼續我們的電路圖并開始構建它。

電路圖和硬件設置:

1.png

這個車速表和里程表項目的電路圖非常簡單,可以構建在面包板上。如果您一直遵循PIC教程,那么您還可以重用我們用于學習PIC微控制器的硬件。在這里,我們使用了與PIC微控制器一起為LED閃爍構建的相同 性能板 ,如下所示:

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

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^霍爾傳感器引腳

構建項目后,如下圖所示

使用PIC的數字車速表和里程表電路

如您所見,我用兩個盒子將電機和一個霍爾傳感器放置在附近的位置。您可以將磁鐵固定在旋轉物體上,并完好無損地靠近它的霍爾傳感器,使其能夠檢測到磁鐵。

注意: 霍爾傳感器具有極性,因此請確保它正在檢測哪個極并相應地放置它。

還要確保將上拉電阻與霍爾傳感器的輸出引腳一起使用。

模擬

該項目的模擬是使用 Proteus 完成的。由于該項目涉及移動物體,因此無法使用仿真來演示整個項目,但可以驗證LCD的工作。只需將十六進制文件加載到模擬中并對其進行模擬即可。您將能夠注意到液晶屏工作,如下所示。

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

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

對 PIC16F877A 進行編程

如前所述,我們將借助PIC16F877A微控制器中的定時器和中斷來計算車輪完全旋轉所需的時間。我們已經在之前的教程中學習了如何使用計時器。我在本文末尾給出了該項目的完整代碼。此外,我在下面解釋了幾行重要內容。

以下代碼行將端口 D 初始化為用于 LCD 接口的輸出引腳,將 RB0 初始化為輸入引腳,以將其用作外部引腳。此外,我們還使用OPTION_REG啟用了內部上拉電阻,并將64設置為預售。然后,我們啟用全局和外設中斷以啟用定時器和外部中斷。要將RB0定義為外部中斷位,應將INTE設為高電平。溢出值設置為 100,以便每 1 毫秒觸發計時器中斷標志 TMR0IF。這將有助于運行毫秒計時器以確定以毫秒為單位所花費的時間:

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

每次檢測到中斷時,都會執行以下函數。我們可以根據自己的意愿命名函數,所以我將其命名為 speed_isr()。 該程序處理兩個中斷,一個是定時器中斷,另一個是外部中斷。每當發生定時器中斷時,標志 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;
        }
}

同樣,當發生外部中斷時,標志 INTF 將變為高電平,這也應通過定義 INTF=0 來清除。計時器中斷跟蹤所花費的時間,外部中斷確定車輪何時完成一次完整旋轉。有了這些數據,在每次外部中斷期間計算車輪覆蓋的速度和距離。

計算出速度和距離后,可以使用我們的LCD功能簡單地顯示在LCD屏幕上。如果您不熟悉 LCD,請參閱我們的 LCD 與 PIC16F877A MCU 接口教程

工作說明:

準備好硬件和軟件后,只需將代碼上傳到PIC16F877A即可。如果您是PIC的新手,那么您應該閱讀一些有關如何將程序上傳到PIC16F877A微控制器的教程。

我使用可變鍋來調整電機的速度以進行演示。您也可以使用相同的查找實時應用程序。如果一切按預期工作,那么您應該能夠以公里/小時為單位獲得速度和以米為單位的距離,如下面的視頻所示。

液晶車速表和里程表電路

/*
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;
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • PIC微控制器
    +關注

    關注

    0

    文章

    17

    瀏覽量

    7390
  • 車速表
    +關注

    關注

    0

    文章

    14

    瀏覽量

    8297
  • 里程表
    +關注

    關注

    1

    文章

    15

    瀏覽量

    9860
收藏 人收藏

    評論

    相關推薦

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

    變頻控制速度,實現了對不同調速比的里程表的檢測。該里程表檢測儀的系統電路簡單可靠,用它來檢測里程表
    發表于 10-30 11:01 ?4111次閱讀
    采用ATmega16的<b class='flag-5'>里程表</b>檢測儀<b class='flag-5'>電路</b>設計 — <b class='flag-5'>電路</b>圖天天讀(35)

    奧迪100 2.2E里程表不計程時,車速無規律擺動的檢修方法

    的具有一定頻率的電信號變為有用方波電壓信號,以控制車速電路和驅動里程表步進電機。速度出現無規律抖動是因為盡管傳感
    發表于 02-25 11:42

    電動自行車速度與里程表設計

    電動自行車速度與里程表設計
    發表于 08-16 14:11

    納智捷汽車里程表調

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

    誰有單片機液晶屏設計車速里程表、轉速的的設計

    誰有單片機液晶屏設計車速里程表、轉速的的設計,幫幫忙,有的給我發一份,非常感謝!QQ596916131
    發表于 05-13 08:54

    車速自動監測及里程表測控系統的設計制作

    車速自動監測及里程表測控系統的設計制作
    發表于 05-05 09:35

    什么是車速里程表信號裝置?速比該怎么計算?

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

    里程表傳感壞了癥狀

      里程表傳感又叫轉速傳感,一般安裝在變速箱輸出軸旁邊,主要是用來檢測電控汽車輪胎的轉速,將檢測到的信號輸送到ECU,從而控制自動變速
    發表于 06-28 16:34

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

    轉自: http://www.gzweix.com/article/sort0253/sort0487/info-287379.html新型汽車車速里程表信號采集與處理研究來源:汽車電器作者:佚名
    發表于 08-30 07:18

    輕型客車里程表電路

    輕型客車里程表電路圖 該里程表與時速是電子、機械一體化組合新型儀表。機車速度探測機構輸出的脈沖信號
    發表于 11-08 15:19 ?2394次閱讀
    輕型客車<b class='flag-5'>里程表</b><b class='flag-5'>電路</b>圖

    車速里程表原理及速比的計算方法

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

    電子式里程表設計

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

    車速里程表信號裝置及速比的計算分析

    制成方頭,經過軟軸和變速上的里程表被動齒輪連接在一起。里程表被動齒輪旋轉帶動軟軸內鋼絲旋轉,鋼絲帶動車速里程表的驅動軸旋轉,使
    發表于 11-21 15:20 ?1次下載
    <b class='flag-5'>車速</b><b class='flag-5'>里程表</b>信號裝置及速比的計算分析

    電子車速里程表的單片機實現方案解析

    介紹了一個基于單片機的電子式轉速里程表實現方案,討論了里程計數的原理和轉速指示原理,給出了用單片機AT89C2051和LM1819驅動設計的汽車轉速里程表的具體
    發表于 12-07 11:26 ?2次下載
    電子<b class='flag-5'>車速</b><b class='flag-5'>里程表</b>的單片機實現方案解析

    汽車、摩托車用電子車速里程表行業標準

    汽車、摩托車用電子車速里程表行業標準
    發表于 09-29 18:02 ?1次下載