极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10264|回复: 2

写了两种关于霍尔元件的转速程序

[复制链接]
发表于 2012-12-1 19:45:35 | 显示全部楼层 |阅读模式
本帖最后由 wasdpkj 于 2012-12-2 20:17 编辑


针对44E,


本人很菜,写了两种,后面一种尝试了多取样;

用串口监视,感觉后一种刷新率跟不上;另外总感觉这么计时不靠谱,希望高手指点。

  1. int zdpin=0;                //中断0,对应引脚UNO的D2

  2. #define zt 1

  3. int time=0;
  4. int num;
  5. int rpm;

  6. void setup ()
  7. {
  8.   attachInterrupt(zdpin,light,FALLING);                //中断
  9.   Serial.begin(57600);
  10. }

  11. void loop()
  12. {  
  13.   
  14.   if(num!=0)
  15.   {
  16.   time++;
  17.   }

  18.   if(time>=1000)         //定时
  19.   {
  20.   rpm=num*60;
  21.   time=0;
  22.   num=0;
  23.   }
  24.   
  25.   delayMicroseconds(100);
  26.      
  27.   Serial.println(rpm);
  28. }

  29. void light()
  30. {
  31.   num++;
  32. }
复制代码



第二种:

  1. int zdpin=0;                //中断0,对应引脚UNO的D2

  2. #define zt 1

  3. int time=0;
  4. int num;
  5. int rpm;

  6. int sta=0;

  7. int a;
  8. int b;
  9. int c;
  10. int d;
  11. int e;
  12. int f;

  13. void setup ()
  14. {
  15.   attachInterrupt(zdpin,light,FALLING);                //中断
  16.   Serial.begin(57600);
  17. }

  18. void loop()
  19. {
  20.   
  21.   
  22.   switch(sta)       //6个周期取样赋值
  23.   {
  24.   case 0:a=num;break;
  25.   case 1:b=num;break;
  26.   case 2:c=num;break;
  27.   case 3:d=num;break;
  28.   case 4:e=num;break;
  29.   case 5:f=num;break;
  30.   }
  31.   
  32.   sta++;
  33.   time++;

  34.   if(sta>=5)        //6个周期取样赋值
  35.   {
  36.   sta=0;
  37.   }

  38.   if(time>=1000)       //定时
  39.   {
  40.   rpm=10*(a+b+c+d+e+f);
  41.   time=0;
  42.   num=0;
  43.   }
  44.   
  45. delayMicroseconds(100);
  46.       
  47.   Serial.println(rpm);
  48.   Serial.println("");

  49.    
  50. }

  51. void light()
  52. {
  53.   num++;
  54. }
复制代码




听了1989的意见,用millis又写了一个函数

  1. #define zdpin 0

  2. int num;
  3. int rpm;
  4. long jishi=0;

  5. void setup ()
  6. {
  7.   attachInterrupt(zdpin,light,FALLING);                //?ж?
  8.   Serial.begin(57600);
  9. }

  10. void loop()
  11. {   
  12.   if(millis()-jishi>=1000)
  13.   {
  14.   rpm=60*num;
  15.   num=0;
  16.   jishi=millis();
  17.   }
  18.         
  19.   Serial.println(rpm);
  20.   Serial.println("");   
  21. }

  22. void light()
  23. {
  24.   num++;
  25. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2012-12-2 10:36:16 | 显示全部楼层
这个样子真的不真么靠谱。读取管脚的时间就要100ms,还有每个语句需要耗费的时间。建议使用millis(),这样子应该要靠谱一些
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-2 11:43:15 | 显示全部楼层
hp198969 发表于 2012-12-2 10:36
这个样子真的不真么靠谱。读取管脚的时间就要100ms,还有每个语句需要耗费的时间。建议使用millis(),这样 ...

是100微秒,用了中断,这样也会有很大影响吗?
millis()不是很了解,我去看看
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-4 14:08 , Processed in 0.038157 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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