wasdpkj 发表于 2012-12-1 19:45:35

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

本帖最后由 wasdpkj 于 2012-12-2 20:17 编辑


针对44E,


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

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

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

#define zt 1

int time=0;
int num;
int rpm;

void setup ()
{
attachInterrupt(zdpin,light,FALLING);                //中断
Serial.begin(57600);
}

void loop()
{

if(num!=0)
{
time++;
}

if(time>=1000)         //定时
{
rpm=num*60;
time=0;
num=0;
}

delayMicroseconds(100);
   
Serial.println(rpm);
}

void light()
{
num++;
}


第二种:

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

#define zt 1

int time=0;
int num;
int rpm;

int sta=0;

int a;
int b;
int c;
int d;
int e;
int f;

void setup ()
{
attachInterrupt(zdpin,light,FALLING);                //中断
Serial.begin(57600);
}

void loop()
{


switch(sta)       //6个周期取样赋值
{
case 0:a=num;break;
case 1:b=num;break;
case 2:c=num;break;
case 3:d=num;break;
case 4:e=num;break;
case 5:f=num;break;
}

sta++;
time++;

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

if(time>=1000)       //定时
{
rpm=10*(a+b+c+d+e+f);
time=0;
num=0;
}

delayMicroseconds(100);
      
Serial.println(rpm);
Serial.println("");

   
}

void light()
{
num++;
}



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

#define zdpin 0

int num;
int rpm;
long jishi=0;

void setup ()
{
attachInterrupt(zdpin,light,FALLING);                //?ж?
Serial.begin(57600);
}

void loop()
{   
if(millis()-jishi>=1000)
{
rpm=60*num;
num=0;
jishi=millis();
}
      
Serial.println(rpm);
Serial.println("");   
}

void light()
{
num++;
}

hp198969 发表于 2012-12-2 10:36:16

这个样子真的不真么靠谱。读取管脚的时间就要100ms,还有每个语句需要耗费的时间。建议使用millis(),这样子应该要靠谱一些

wasdpkj 发表于 2012-12-2 11:43:15

hp198969 发表于 2012-12-2 10:36 static/image/common/back.gif
这个样子真的不真么靠谱。读取管脚的时间就要100ms,还有每个语句需要耗费的时间。建议使用millis(),这样 ...

是100微秒,用了中断,这样也会有很大影响吗?
millis()不是很了解,我去看看
页: [1]
查看完整版本: 写了两种关于霍尔元件的转速程序