電子書籍の厳選無料作品が豊富!

raspberry pi2でロータリエンコーダから回転速度を算出するプログラムを作成しましたが、プログラムを実行してから数秒後に止まってしまいます。どうしたらよいでしょうか?
ちなみに2てい倍を使用しています。

#include<stdio.h>
#include<wiringPi.h>
#include<math.h>

double count = 0;

int en23=0;
int old_en23=0;
double dt =0.0;
unsigned long endTime = 0.0; //時間[μsec]

double vel=0;
double omega=0;
unsigned long startTime=0.0; //時間[μsec]
double N=0.0;

// 割り込み処理
void encoder23(void)
{
en23 = digitalRead(23);
if(en23 != old_en23)
{
if(digitalRead(23)== digitalRead(24)) count++;
else count--;
}
old_en23=en23;
}


int main(int argc,char *argv[])
{
wiringPiSetupGpio();

pinMode(23,INPUT); // GPIO23 input
pinMode(24,INPUT); // GPIO24 input

pullUpDnControl(23,PUD_UP); // Gpio23 pullup
pullUpDnControl(24,PUD_UP); // Gpio24 pullup

endTime = micros(); //時間[μsec]
while(1)
{
startTime=micros();//時間[μsec]

wiringPiISR(23,INT_EDGE_BOTH,&encoder23);
dt = ( startTime-endTime) * 0.000001; // μsec→sec
endTime =micros();//時間[μsec]
N =( count) /180.0; // kaitennsuu
vel= (double)(N/dt); // rps
omega=vel*2*M_PI; // rad/s


printf("vel%f\n",vel);
printf("N%f\n",N);
printf("count%f\n",count);
printf("omega%f\n",omega);
printf("dt%f\n",dt);

printf("Time%lu\n",startTime);
count=0;
dt=0.0;
N = 0.0;
}

}

A 回答 (1件)

>プログラムを実行してから数秒後に止まってしまいます。



「止まってしまう」というのがどういう状態なのか不明ですが……。
とりあえず気になるところを。

>wiringPiISR(23,INT_EDGE_BOTH,&encoder23);

「ループの中で」毎回設定する必要がありますか?

>count=0;

1ループの間に0に戻されますが、encoder23()の中での増減はどうなりますか?
あと、最適化で殺されませんか?
# 「ループの中では」常に0ですが、ループの外に追い出されていたりしませんか?

>dt = ( startTime-endTime) * 0.000001; // μsec→sec

無いとは思いますが、dtが0になったりしていませんか?
# 0になっていると、vel= (double)(N/dt);で死ぬかも知れません。

>en23 = digitalRead(23);
>if(digitalRead(23)== digitalRead(24)) count++;

同じく無いとは思いますが、2つのdigitalRead(23)の間で状態が変わることはありませんか?
# 回転方向の検出はこれでいいんでしょうか?
# http://startelc.com/H8/H8_51Encder1.html な情報もありますけど。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!