找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2574|回復(fù): 27
打印 上一主題 下一主題
收起左側(cè)

想制作一個(gè)輪子轉(zhuǎn)動(dòng)的速度表 用單片機(jī)控制

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:95922 發(fā)表于 2022-3-11 20:32 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
摩托車速度表壞了,想用51單片機(jī)做一個(gè)速度表,就單一功能的速度表。
前輪周長(zhǎng)1.84米,輪子碟殺片剛好像編碼盤11線,用一個(gè)5V接近開關(guān)做脈沖信號(hào),定時(shí)器1做計(jì)數(shù)器,定時(shí)器0做定時(shí)器
其它程序都寫好了,就是每小時(shí)多少公里這算法難倒我了,不知道要怎么去算了。。。。。
比如定時(shí)器1秒,計(jì)數(shù)器有多少個(gè)脈沖,然后怎么去算,學(xué)歷太低不會(huì)算了,有木有大神幫幫忙。自己瞎寫了一段算法,結(jié)果試驗(yàn)速度快了好多。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:997011 發(fā)表于 2022-3-12 06:03 | 只看該作者
1.84*P/1000*3600/T
回復(fù)

使用道具 舉報(bào)

板凳
ID:997011 發(fā)表于 2022-3-12 06:29 | 只看該作者
上述公式必需在脈沖數(shù)P足夠大也就是T足夠大的前題下計(jì)算出的時(shí)速時(shí)速才會(huì)準(zhǔn)確。所以最好用5V接近開關(guān)產(chǎn)生的脈沖間隔時(shí)間來推導(dǎo)出時(shí)速來。
回復(fù)

使用道具 舉報(bào)

地板
ID:161164 發(fā)表于 2022-3-12 08:41 | 只看該作者
以下是從舊貼中記下的轉(zhuǎn)速計(jì)算方法
取之于51Hei,還之于51Hei

高轉(zhuǎn)速脈沖計(jì)數(shù),
低轉(zhuǎn)速測(cè)量脈沖的周期,
兩種結(jié)合就是固定采樣時(shí)間內(nèi)計(jì)數(shù)N個(gè)脈沖+脈沖周期,
比如采用一個(gè)外部中斷源,
當(dāng)脈沖下降沿開始計(jì)時(shí)100毫秒,
計(jì)數(shù)脈沖的個(gè)數(shù)N。
100ms時(shí)間到,
再計(jì)時(shí)T到下一個(gè)脈沖的下降沿。
那么總的脈沖數(shù)N+1個(gè),
總的周期100ms+T.。

假設(shè)一圈有18個(gè)脈沖
那么轉(zhuǎn)速rps =(N+1)/(0.1+T)/18
回復(fù)

使用道具 舉報(bào)

5#
ID:8222 發(fā)表于 2022-3-12 08:48 | 只看該作者
這轉(zhuǎn)速這么慢的,還是測(cè)周期再換成轉(zhuǎn)速吧。
回復(fù)

使用道具 舉報(bào)

6#
ID:8222 發(fā)表于 2022-3-12 08:55 | 只看該作者
前輪周長(zhǎng)1.84米,近時(shí)速36公里計(jì),每秒10米,相當(dāng)于轉(zhuǎn)5圈。如果采樣時(shí)間為1秒,測(cè)量圈數(shù)可能是4圈,誤差20%,如果速度更慢,誤差更大。如果加大采樣時(shí)間,又不能實(shí)時(shí)顯示。最好還是測(cè)量脈沖周期,這樣精度高,更新速度快。
回復(fù)

使用道具 舉報(bào)

7#
ID:879348 發(fā)表于 2022-3-12 11:22 | 只看該作者
沒必要自己做,買一個(gè)轉(zhuǎn)速表
回復(fù)

使用道具 舉報(bào)

8#
ID:401564 發(fā)表于 2022-3-12 14:35 | 只看該作者
如果你是想把你車子的速度表搞好,樓上有人說,買個(gè)碼表就完事了
如果你有這個(gè)自己動(dòng)手的愛好,那就搞下去
先設(shè)定一個(gè)閾值,速度低于多少是不進(jìn)行運(yùn)算的,不然,你動(dòng)一下輪子,就給你一個(gè)時(shí)速0.8公里出來
不知道你這個(gè)接近開關(guān)有沒有抖動(dòng),如果有的話,要去抖動(dòng),我沒有用過,所以不知道
如果脈沖出現(xiàn)的頻率比較慢.不要周期采樣,而采樣幾個(gè)脈沖,計(jì)算時(shí)間
比如一秒3-10圈,那么,你就計(jì)算收集到5圈的總時(shí)長(zhǎng),來進(jìn)行計(jì)算
回復(fù)

使用道具 舉報(bào)

9#
ID:47286 發(fā)表于 2022-3-12 20:00 | 只看該作者
11個(gè)一圈太少了 通常的ABS靶盤都是43個(gè)或更多 只有11個(gè)分下來誤差會(huì)很大 因?yàn)橛|發(fā)計(jì)算不能每秒一次 一個(gè)是間隔時(shí)間太長(zhǎng) 另外是速度區(qū)間大 低速時(shí)反應(yīng)遲鈍 高速時(shí)會(huì)溢出 所以一般是以n個(gè)毫秒采集觸發(fā)次數(shù)再轉(zhuǎn)換成1s的值 你只是測(cè)車輪還好點(diǎn) 我測(cè)發(fā)動(dòng)機(jī)轉(zhuǎn)速 從0~8000轉(zhuǎn)更頭疼
回復(fù)

使用道具 舉報(bào)

10#
ID:401564 發(fā)表于 2022-3-12 20:15 | 只看該作者
dzbj 發(fā)表于 2022-3-12 20:00
11個(gè)一圈太少了 通常的ABS靶盤都是43個(gè)或更多 只有11個(gè)分下來誤差會(huì)很大 因?yàn)橛|發(fā)計(jì)算不能每秒一次 一個(gè)是 ...

速度表是不需要太精密了,單車的碼表才一個(gè)干簧管,一千多公里下來,跟GPS誤差十幾公里而已
回復(fù)

使用道具 舉報(bào)

11#
ID:95922 發(fā)表于 2022-3-12 20:57 | 只看該作者
lwq1947 發(fā)表于 2022-3-12 06:29
上述公式必需在脈沖數(shù)P足夠大也就是T足夠大的前題下計(jì)算出的時(shí)速時(shí)速才會(huì)準(zhǔn)確。所以最好用5V接近開關(guān)產(chǎn)生的 ...

脈沖間隔怎么算,是不是還用定時(shí)器?怎么推導(dǎo),不會(huì)寫公式。
回復(fù)

使用道具 舉報(bào)

12#
ID:95922 發(fā)表于 2022-3-12 21:05 | 只看該作者
論壇大神還是很多,怪我學(xué)的不精大多數(shù)其實(shí)都不怎么明白。!
如果用測(cè)周期的方法應(yīng)該怎么寫程序,那位大神簡(jiǎn)單的寫幾段讓我學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

13#
ID:624769 發(fā)表于 2022-3-12 21:24 | 只看該作者
老來所學(xué) 發(fā)表于 2022-3-12 20:57
脈沖間隔怎么算,是不是還用定時(shí)器?怎么推導(dǎo),不會(huì)寫公式。

不知道你用的什么單片機(jī),大多數(shù)單片機(jī)都有 PCA/CCP  一般就算是 89C51都有 CAP捕獲功能,用那個(gè)直接捕獲,比外部中斷+定時(shí)器要可靠和簡(jiǎn)單的多。

另外,不知道你是什么摩托車,大多摩托車的碼表本來就是脈沖驅(qū)動(dòng)的,你是碼表壞,脈沖應(yīng)該好的,為什么不直接接那個(gè),反而要裝接近開關(guān)呢? 我沒摩托車駕照,就沒有買摩托車,所以沒有機(jī)會(huì)禍禍。但是我的汽車,和電平車,我都是直接從發(fā)動(dòng)機(jī)和電機(jī)取脈沖的,比自己加裝好多了。

一個(gè)脈沖就是輪子旋轉(zhuǎn)1格的距離,就是你行使的距離,兩個(gè)脈沖之間的間隔時(shí)間就是你這個(gè)長(zhǎng)度的位移耗費(fèi)的時(shí)間,  距離 / 時(shí)間  = 速度       當(dāng)然,距離要換算成 公里  時(shí)間要換算成 小時(shí)。
當(dāng)然,最好是  把 x公里 / y小時(shí)  變成     3.6  *  x米/  y秒    最好是: 3600 *  x毫米  /  y微秒    這樣計(jì)算會(huì)簡(jiǎn)單點(diǎn)省事一點(diǎn)。
回復(fù)

使用道具 舉報(bào)

14#
ID:95922 發(fā)表于 2022-3-12 22:51 | 只看該作者
本帖最后由 老來所學(xué) 于 2022-3-12 23:35 編輯
188610329 發(fā)表于 2022-3-12 21:24
不知道你用的什么單片機(jī),大多數(shù)單片機(jī)都有 PCA/CCP  一般就算是 89C51都有 CAP捕獲功能,用那個(gè)直接捕獲 ...

一個(gè)脈沖就是輪子旋轉(zhuǎn)1格的距離,就是你行使的距離,兩個(gè)脈沖之間的間隔時(shí)間就是你這個(gè)長(zhǎng)度的位移耗費(fèi)的時(shí)間,  距離 / 時(shí)間  = 速度
兩個(gè)脈沖的間隔時(shí)間的程序已經(jīng)寫好了
例如兩個(gè)脈沖間隔時(shí)間為25毫秒,距離是184毫米,我要怎么轉(zhuǎn)換成公里/小時(shí)
這個(gè)不會(huì)算,學(xué)習(xí)不好。還有就是數(shù)碼管1秒刷新一次該怎么寫

回復(fù)

使用道具 舉報(bào)

15#
ID:624769 發(fā)表于 2022-3-13 11:20 來自手機(jī) | 只看該作者
老來所學(xué) 發(fā)表于 2022-3-12 22:51
一個(gè)脈沖就是輪子旋轉(zhuǎn)1格的距離,就是你行使的距離,兩個(gè)脈沖之間的間隔時(shí)間就是你這個(gè)長(zhǎng)度的位移耗費(fèi)的 ...

3600 * 184毫米/25000微秒= 26.5公里/小時(shí)
你這摩托車,速度有點(diǎn)慢啊……
回復(fù)

使用道具 舉報(bào)

16#
ID:95922 發(fā)表于 2022-3-13 14:10 | 只看該作者
188610329 發(fā)表于 2022-3-13 11:20
3600 * 184毫米/25000微秒= 26.5公里/小時(shí)
你這摩托車,速度有點(diǎn)慢啊……

大神,你這算法是不是正確的?25毫秒只是一個(gè)假設(shè)。
回復(fù)

使用道具 舉報(bào)

17#
ID:624769 發(fā)表于 2022-3-13 14:40 來自手機(jī) | 只看該作者
老來所學(xué) 發(fā)表于 2022-3-13 14:10
大神,你這算法是不是正確的?25毫秒只是一個(gè)假設(shè)。

算法是沒有問題的,3600常量 × 長(zhǎng)度(毫米)÷ 時(shí)間(微秒)= 時(shí)速(公里/時(shí))
帶入剛才你的 184毫米 25000微秒 就是 26.5

不過,大多時(shí)候會(huì)用:36000常量 × 長(zhǎng)度(毫米)÷ 時(shí)間(微秒)
得到265,顯示的時(shí)候加個(gè)小數(shù)點(diǎn),那么就是整型計(jì)算了,效率高很多。
回復(fù)

使用道具 舉報(bào)

18#
ID:95922 發(fā)表于 2022-3-13 15:08 | 只看該作者
188610329 發(fā)表于 2022-3-13 14:40
算法是沒有問題的,3600常量 × 長(zhǎng)度(毫米)÷ 時(shí)間(微秒)= 時(shí)速(公里/時(shí))
帶入剛才你的 184毫米 25 ...

謝謝大神了。
還是想問一下兩個(gè)脈沖周期的程序怎么寫簡(jiǎn)單點(diǎn),我用定時(shí)器0作計(jì)數(shù)器,定時(shí)器1作定時(shí)器,現(xiàn)在越寫越亂了,完全搞不懂了
回復(fù)

使用道具 舉報(bào)

19#
ID:624769 發(fā)表于 2022-3-13 15:31 | 只看該作者
老來所學(xué) 發(fā)表于 2022-3-13 15:08
謝謝大神了。
還是想問一下兩個(gè)脈沖周期的程序怎么寫簡(jiǎn)單點(diǎn),我用定時(shí)器0作計(jì)數(shù)器,定時(shí)器1作定時(shí)器,現(xiàn) ...

你用的什么單片機(jī)? 最好是用“捕獲” 89C51 系列的話 就是T2 定時(shí)器, 但凡比他高一檔的基本都有專門的 PCA/CCP 用來捕獲。

實(shí)在沒有的話, 一般是 外部中斷 + 定時(shí)器     外部中斷下降沿觸發(fā)。記錄定時(shí)器的值,下一次外部中斷再觸發(fā)再讀取定時(shí)器,得到兩個(gè)脈沖之間的時(shí)間。然后就能計(jì)算了。

但是,實(shí)際使用時(shí),最好是累計(jì)16個(gè)脈沖計(jì)算時(shí)速,比較準(zhǔn)確。同時(shí),收到第17個(gè)脈沖的時(shí)候,拋棄第1個(gè)脈沖,用第2~17 的脈沖計(jì)算新的時(shí)速,以此類推,這樣時(shí)速的變化會(huì)比較平滑。
回復(fù)

使用道具 舉報(bào)

20#
ID:1010121 發(fā)表于 2022-3-13 15:40 | 只看該作者
用中斷做,
arduino代碼
volatile unsigned long lasttime;
volatile float motospeed;
volatile int motoready=0;
int MotoPin =3;
void setup() {
pinMode(MotoPin, INPUT);
attachInterrupt(digitalPinToInterrupt(MotoPin),motocount,RISING);
lasttime = millis();
}

void motocount(){
  int currmotostate;
  if(motoready==0){
    motoready=1;
    lasttime =millis();
  }else{
      currmotostate = digitalRead(MotoPin);
      if(currmotostate==1){
          calmoto(0);
      }
    }
  }
void loop() {

    calmoto(1);
}
void calmoto(int m){
    if(motoready ==0){
        return;
    }
   
    unsigned long curr;
    unsigned long currtmp;
    float motorate;
   
    currtmp = millis();
    curr = currtmp-lasttime;
    if(curr>0){
         motorate = 60000/curr;
         if(m==0){
            motospeed =motorate;
            lasttime =currtmp;
         }else{
            if(motorate < motospeed){
               motospeed =motorate;
               if(motospeed < 5){
                motospeed=0;
                motoready=0;
               }
            }
         }
    }else{
       motoready=0;
    }
}
回復(fù)

使用道具 舉報(bào)

21#
ID:95922 發(fā)表于 2022-3-13 16:01 | 只看該作者
188610329 發(fā)表于 2022-3-13 15:31
你用的什么單片機(jī)? 最好是用“捕獲” 89C51 系列的話 就是T2 定時(shí)器, 但凡比他高一檔的基本都有專門的  ...

89C51不是只有T0和T1定時(shí)器嗎,怎么會(huì)有T2呢。
我現(xiàn)在用T0作外部計(jì)數(shù)器,T1作定時(shí)器,第一個(gè)脈沖開定時(shí)器,第二個(gè)脈沖關(guān)定時(shí)器,中間就是時(shí)間,然后用你的公式可以計(jì)算出時(shí)速了(只是在開發(fā)板了試驗(yàn)了下)。
然后還有個(gè)問題,數(shù)碼管始終顯示兩個(gè)脈沖的速度,外部輸入的脈沖停止了還是顯示當(dāng)前的速度,我想要顯示速度1秒,然后再顯示下一個(gè)速度,試驗(yàn)了一下午沒成功,不知道怎么寫了。
回復(fù)

使用道具 舉報(bào)

22#
ID:95922 發(fā)表于 2022-3-13 16:01 | 只看該作者
join_gu 發(fā)表于 2022-3-13 15:40
用中斷做,
arduino代碼
volatile unsigned long lasttime;

不好意思,你這個(gè)實(shí)在是看不懂
回復(fù)

使用道具 舉報(bào)

23#
ID:624769 發(fā)表于 2022-3-13 17:20 | 只看該作者
老來所學(xué) 發(fā)表于 2022-3-13 16:01
89C51不是只有T0和T1定時(shí)器嗎,怎么會(huì)有T2呢。
我現(xiàn)在用T0作外部計(jì)數(shù)器,T1作定時(shí)器,第一個(gè)脈沖開定時(shí) ...

首先,89C51是有 T2 定時(shí)器的,比如說, AT89C51, 在手冊(cè)的第13頁, AT89C51RC.pdf (516.12 KB, 下載次數(shù): 2) 又比如說,STC89C51, 在手冊(cè)的第216頁,http://www.torrancerestoration.com/bbs/dpj-82368-1.html
都有對(duì)T2定時(shí)器,以及捕獲功能的介紹。


然后,你如果要脈沖停止后,不顯示,這上面有個(gè)思路的問題,嚴(yán)格來講,判斷速度,就是判斷兩個(gè)脈沖之間的時(shí)間,除去開機(jī)沒有發(fā)生脈沖,當(dāng)有了一個(gè)脈沖之后,后面過多久時(shí)間才會(huì)再出現(xiàn)脈沖,這是不可知的,往大了說,過個(gè)百年,再次發(fā)生下一個(gè)脈沖,依然是可以計(jì)算速度的,只是小數(shù)點(diǎn)比較長(zhǎng),所以,你就需要定一個(gè)時(shí)間,比如1秒,或者3秒,10秒,沒有接收到下一個(gè)脈沖,就認(rèn)為停止了,或者說,約等于0時(shí)速。
回復(fù)

使用道具 舉報(bào)

24#
ID:624769 發(fā)表于 2022-3-13 17:41 | 只看該作者
dzbj 發(fā)表于 2022-3-12 20:00
11個(gè)一圈太少了 通常的ABS靶盤都是43個(gè)或更多 只有11個(gè)分下來誤差會(huì)很大 因?yàn)橛|發(fā)計(jì)算不能每秒一次 一個(gè)是 ...

一般用混合測(cè)算法比較合理,比較快的時(shí)候,用脈沖數(shù)除以 固定周期,比如100ms, 比較慢的時(shí)候,用固定數(shù)量脈沖所代表的距離 去除以發(fā)生這些脈沖所,耗費(fèi)的時(shí)間。
回復(fù)

使用道具 舉報(bào)

25#
ID:95922 發(fā)表于 2022-3-13 21:21 | 只看該作者
188610329 發(fā)表于 2022-3-13 17:20
首先,89C51是有 T2 定時(shí)器的,比如說, AT89C51, 在手冊(cè)的第13頁, 又比如說,STC89C51, 在手冊(cè)的第216 ...

思路也是這個(gè)思路,就是感覺沒法下手了,學(xué)習(xí)單片機(jī)是網(wǎng)上下載教程學(xué)了個(gè)皮毛,再想學(xué)精一點(diǎn)有點(diǎn)難了
回復(fù)

使用道具 舉報(bào)

26#
ID:486153 發(fā)表于 2022-3-13 21:23 | 只看該作者
霍爾測(cè)速?編碼器?
回復(fù)

使用道具 舉報(bào)

27#
ID:1010121 發(fā)表于 2022-3-16 22:29 | 只看該作者
老來所學(xué) 發(fā)表于 2022-3-13 16:01
不好意思,你這個(gè)實(shí)在是看不懂

就是設(shè)置3號(hào)端口監(jiān)聽中斷。
電平變化就執(zhí)行中斷代碼,也就是計(jì)數(shù)器。計(jì)數(shù)時(shí),計(jì)算一下上一次的中斷時(shí)間,這樣就可以計(jì)算出轉(zhuǎn)速了。
我馬達(dá)的轉(zhuǎn)速監(jiān)測(cè)就這么寫的,沒有問題。
回復(fù)

使用道具 舉報(bào)

28#
ID:885416 發(fā)表于 2022-3-17 14:39 來自手機(jī) | 只看該作者
最最最簡(jiǎn)單的,就是看你什么輸入信號(hào)了,比如,會(huì)有個(gè)上升沿,弄個(gè)上升沿中斷,上升沿中斷里弄個(gè)變量++,每5s查看變量的值,變量增加了多少就是按你的計(jì)算方法算走了多少距離,讓后有每5s的距離了,代表上個(gè)5s走了這么遠(yuǎn),速度就是距離除以時(shí)間5s
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表