找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2026|回复: 27
打印 上一主题 下一主题
收起左侧

想制作一个轮子转动的速度表 用单片机控制

  [复制链接]
跳转到指定楼层
楼主
ID:95922 发表于 2022-3-11 20:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
摩托车速度表坏了,想用51单片机做一个速度表,就单一功能的速度表。
前轮周长1.84米,轮子碟杀片刚好像编码盘11线,用一个5V接近开关做脉冲信号,定时器1做计数器,定时器0做定时器
其它程序都写好了,就是每小时多少公里这算法难倒我了,不知道要怎么去算了。。。。。
比如定时器1秒,计数器有多少个脉冲,然后怎么去算,学历太低不会算了,有木有大神帮帮忙。自己瞎写了一段算法,结果试验速度快了好多。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:997011 发表于 2022-3-12 06:03 | 只看该作者
1.84*P/1000*3600/T
回复

使用道具 举报

板凳
ID:997011 发表于 2022-3-12 06:29 | 只看该作者
上述公式必需在脉冲数P足够大也就是T足够大的前题下计算出的时速时速才会准确。所以最好用5V接近开关产生的脉冲间隔时间来推导出时速来。
回复

使用道具 举报

地板
ID:161164 发表于 2022-3-12 08:41 | 只看该作者
以下是从旧贴中记下的转速计算方法
取之于51Hei,还之于51Hei

高转速脉冲计数,
低转速测量脉冲的周期,
两种结合就是固定采样时间内计数N个脉冲+脉冲周期,
比如采用一个外部中断源,
当脉冲下降沿开始计时100毫秒,
计数脉冲的个数N。
100ms时间到,
再计时T到下一个脉冲的下降沿。
那么总的脉冲数N+1个,
总的周期100ms+T.。

假设一圈有18个脉冲
那么转速rps =(N+1)/(0.1+T)/18
回复

使用道具 举报

5#
ID:8222 发表于 2022-3-12 08:48 | 只看该作者
这转速这么慢的,还是测周期再换成转速吧。
回复

使用道具 举报

6#
ID:8222 发表于 2022-3-12 08:55 | 只看该作者
前轮周长1.84米,近时速36公里计,每秒10米,相当于转5圈。如果采样时间为1秒,测量圈数可能是4圈,误差20%,如果速度更慢,误差更大。如果加大采样时间,又不能实时显示。最好还是测量脉冲周期,这样精度高,更新速度快。
回复

使用道具 举报

7#
ID:879348 发表于 2022-3-12 11:22 | 只看该作者
没必要自己做,买一个转速表
回复

使用道具 举报

8#
ID:401564 发表于 2022-3-12 14:35 | 只看该作者
如果你是想把你车子的速度表搞好,楼上有人说,买个码表就完事了
如果你有这个自己动手的爱好,那就搞下去
先设定一个阈值,速度低于多少是不进行运算的,不然,你动一下轮子,就给你一个时速0.8公里出来
不知道你这个接近开关有没有抖动,如果有的话,要去抖动,我没有用过,所以不知道
如果脉冲出现的频率比较慢.不要周期采样,而采样几个脉冲,计算时间
比如一秒3-10圈,那么,你就计算收集到5圈的总时长,来进行计算
回复

使用道具 举报

9#
ID:47286 发表于 2022-3-12 20:00 | 只看该作者
11个一圈太少了 通常的ABS靶盘都是43个或更多 只有11个分下来误差会很大 因为触发计算不能每秒一次 一个是间隔时间太长 另外是速度区间大 低速时反应迟钝 高速时会溢出 所以一般是以n个毫秒采集触发次数再转换成1s的值 你只是测车轮还好点 我测发动机转速 从0~8000转更头疼
回复

使用道具 举报

10#
ID:401564 发表于 2022-3-12 20:15 | 只看该作者
dzbj 发表于 2022-3-12 20:00
11个一圈太少了 通常的ABS靶盘都是43个或更多 只有11个分下来误差会很大 因为触发计算不能每秒一次 一个是 ...

速度表是不需要太精密了,单车的码表才一个干簧管,一千多公里下来,跟GPS误差十几公里而已
回复

使用道具 举报

11#
ID:95922 发表于 2022-3-12 20:57 | 只看该作者
lwq1947 发表于 2022-3-12 06:29
上述公式必需在脉冲数P足够大也就是T足够大的前题下计算出的时速时速才会准确。所以最好用5V接近开关产生的 ...

脉冲间隔怎么算,是不是还用定时器?怎么推导,不会写公式。
回复

使用道具 举报

12#
ID:95922 发表于 2022-3-12 21:05 | 只看该作者
论坛大神还是很多,怪我学的不精大多数其实都不怎么明白!!!
如果用测周期的方法应该怎么写程序,那位大神简单的写几段让我学习学习
回复

使用道具 举报

13#
ID:624769 发表于 2022-3-12 21:24 | 只看该作者
老来所学 发表于 2022-3-12 20:57
脉冲间隔怎么算,是不是还用定时器?怎么推导,不会写公式。

不知道你用的什么单片机,大多数单片机都有 PCA/CCP  一般就算是 89C51都有 CAP捕获功能,用那个直接捕获,比外部中断+定时器要可靠和简单的多。

另外,不知道你是什么摩托车,大多摩托车的码表本来就是脉冲驱动的,你是码表坏,脉冲应该好的,为什么不直接接那个,反而要装接近开关呢? 我没摩托车驾照,就没有买摩托车,所以没有机会祸祸。但是我的汽车,和电平车,我都是直接从发动机和电机取脉冲的,比自己加装好多了。

一个脉冲就是轮子旋转1格的距离,就是你行使的距离,两个脉冲之间的间隔时间就是你这个长度的位移耗费的时间,  距离 / 时间  = 速度       当然,距离要换算成 公里  时间要换算成 小时。
当然,最好是  把 x公里 / y小时  变成     3.6  *  x米/  y秒    最好是: 3600 *  x毫米  /  y微秒    这样计算会简单点省事一点。
回复

使用道具 举报

14#
ID:95922 发表于 2022-3-12 22:51 | 只看该作者
本帖最后由 老来所学 于 2022-3-12 23:35 编辑
188610329 发表于 2022-3-12 21:24
不知道你用的什么单片机,大多数单片机都有 PCA/CCP  一般就算是 89C51都有 CAP捕获功能,用那个直接捕获 ...

一个脉冲就是轮子旋转1格的距离,就是你行使的距离,两个脉冲之间的间隔时间就是你这个长度的位移耗费的时间,  距离 / 时间  = 速度
两个脉冲的间隔时间的程序已经写好了
例如两个脉冲间隔时间为25毫秒,距离是184毫米,我要怎么转换成公里/小时
这个不会算,学习不好。还有就是数码管1秒刷新一次该怎么写

回复

使用道具 举报

15#
ID:624769 发表于 2022-3-13 11:20 来自手机 | 只看该作者
老来所学 发表于 2022-3-12 22:51
一个脉冲就是轮子旋转1格的距离,就是你行使的距离,两个脉冲之间的间隔时间就是你这个长度的位移耗费的 ...

3600 * 184毫米/25000微秒= 26.5公里/小时
你这摩托车,速度有点慢啊……
回复

使用道具 举报

16#
ID:95922 发表于 2022-3-13 14:10 | 只看该作者
188610329 发表于 2022-3-13 11:20
3600 * 184毫米/25000微秒= 26.5公里/小时
你这摩托车,速度有点慢啊……

大神,你这算法是不是正确的?25毫秒只是一个假设。
回复

使用道具 举报

17#
ID:624769 发表于 2022-3-13 14:40 来自手机 | 只看该作者
老来所学 发表于 2022-3-13 14:10
大神,你这算法是不是正确的?25毫秒只是一个假设。

算法是没有问题的,3600常量 × 长度(毫米)÷ 时间(微秒)= 时速(公里/时)
带入刚才你的 184毫米 25000微秒 就是 26.5

不过,大多时候会用:36000常量 × 长度(毫米)÷ 时间(微秒)
得到265,显示的时候加个小数点,那么就是整型计算了,效率高很多。
回复

使用道具 举报

18#
ID:95922 发表于 2022-3-13 15:08 | 只看该作者
188610329 发表于 2022-3-13 14:40
算法是没有问题的,3600常量 × 长度(毫米)÷ 时间(微秒)= 时速(公里/时)
带入刚才你的 184毫米 25 ...

谢谢大神了。
还是想问一下两个脉冲周期的程序怎么写简单点,我用定时器0作计数器,定时器1作定时器,现在越写越乱了,完全搞不懂了
回复

使用道具 举报

19#
ID:624769 发表于 2022-3-13 15:31 | 只看该作者
老来所学 发表于 2022-3-13 15:08
谢谢大神了。
还是想问一下两个脉冲周期的程序怎么写简单点,我用定时器0作计数器,定时器1作定时器,现 ...

你用的什么单片机? 最好是用“捕获” 89C51 系列的话 就是T2 定时器, 但凡比他高一档的基本都有专门的 PCA/CCP 用来捕获。

实在没有的话, 一般是 外部中断 + 定时器     外部中断下降沿触发。记录定时器的值,下一次外部中断再触发再读取定时器,得到两个脉冲之间的时间。然后就能计算了。

但是,实际使用时,最好是累计16个脉冲计算时速,比较准确。同时,收到第17个脉冲的时候,抛弃第1个脉冲,用第2~17 的脉冲计算新的时速,以此类推,这样时速的变化会比较平滑。
回复

使用道具 举报

20#
ID:1010121 发表于 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;
    }
}
回复

使用道具 举报

21#
ID:95922 发表于 2022-3-13 16:01 | 只看该作者
188610329 发表于 2022-3-13 15:31
你用的什么单片机? 最好是用“捕获” 89C51 系列的话 就是T2 定时器, 但凡比他高一档的基本都有专门的  ...

89C51不是只有T0和T1定时器吗,怎么会有T2呢。
我现在用T0作外部计数器,T1作定时器,第一个脉冲开定时器,第二个脉冲关定时器,中间就是时间,然后用你的公式可以计算出时速了(只是在开发板了试验了下)。
然后还有个问题,数码管始终显示两个脉冲的速度,外部输入的脉冲停止了还是显示当前的速度,我想要显示速度1秒,然后再显示下一个速度,试验了一下午没成功,不知道怎么写了。
回复

使用道具 举报

22#
ID:95922 发表于 2022-3-13 16:01 | 只看该作者
join_gu 发表于 2022-3-13 15:40
用中断做,
arduino代码
volatile unsigned long lasttime;

不好意思,你这个实在是看不懂
回复

使用道具 举报

23#
ID:624769 发表于 2022-3-13 17:20 | 只看该作者
老来所学 发表于 2022-3-13 16:01
89C51不是只有T0和T1定时器吗,怎么会有T2呢。
我现在用T0作外部计数器,T1作定时器,第一个脉冲开定时 ...

首先,89C51是有 T2 定时器的,比如说, AT89C51, 在手册的第13页, AT89C51RC.pdf (516.12 KB, 下载次数: 2) 又比如说,STC89C51, 在手册的第216页,http://www.51hei.com/bbs/dpj-82368-1.html
都有对T2定时器,以及捕获功能的介绍。


然后,你如果要脉冲停止后,不显示,这上面有个思路的问题,严格来讲,判断速度,就是判断两个脉冲之间的时间,除去开机没有发生脉冲,当有了一个脉冲之后,后面过多久时间才会再出现脉冲,这是不可知的,往大了说,过个百年,再次发生下一个脉冲,依然是可以计算速度的,只是小数点比较长,所以,你就需要定一个时间,比如1秒,或者3秒,10秒,没有接收到下一个脉冲,就认为停止了,或者说,约等于0时速。
回复

使用道具 举报

24#
ID:624769 发表于 2022-3-13 17:41 | 只看该作者
dzbj 发表于 2022-3-12 20:00
11个一圈太少了 通常的ABS靶盘都是43个或更多 只有11个分下来误差会很大 因为触发计算不能每秒一次 一个是 ...

一般用混合测算法比较合理,比较快的时候,用脉冲数除以 固定周期,比如100ms, 比较慢的时候,用固定数量脉冲所代表的距离 去除以发生这些脉冲所,耗费的时间。
回复

使用道具 举报

25#
ID:95922 发表于 2022-3-13 21:21 | 只看该作者
188610329 发表于 2022-3-13 17:20
首先,89C51是有 T2 定时器的,比如说, AT89C51, 在手册的第13页, 又比如说,STC89C51, 在手册的第216 ...

思路也是这个思路,就是感觉没法下手了,学习单片机是网上下载教程学了个皮毛,再想学精一点有点难了
回复

使用道具 举报

26#
ID:486153 发表于 2022-3-13 21:23 | 只看该作者
霍尔测速?编码器?
回复

使用道具 举报

27#
ID:1010121 发表于 2022-3-16 22:29 | 只看该作者
老来所学 发表于 2022-3-13 16:01
不好意思,你这个实在是看不懂

就是设置3号端口监听中断。
电平变化就执行中断代码,也就是计数器。计数时,计算一下上一次的中断时间,这样就可以计算出转速了。
我马达的转速监测就这么写的,没有问题。
回复

使用道具 举报

28#
ID:885416 发表于 2022-3-17 14:39 来自手机 | 只看该作者
最最最简单的,就是看你什么输入信号了,比如,会有个上升沿,弄个上升沿中断,上升沿中断里弄个变量++,每5s查看变量的值,变量增加了多少就是按你的计算方法算走了多少距离,让后有每5s的距离了,代表上个5s走了这么远,速度就是距离除以时间5s
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表