ここから本文です

書庫全体表示

パルスから回転数検出

CDIのパルス(CDI→タコメーターの波形)から回転数を検出するために、サンプルとして回路とスケッチを作ってみました。  
1 arduinoで可変抵抗から読み取った電圧を読み取り、その値を周波数とするデューティー比50%のパルスをtone関数で出力
2 このパルスをトランジスタとバッテリーを使って12Vにする。
3 フォトカプラを使ってarduinoに入力
4 回転数を計算しシリアル通信でPCに出力

回転数はパルスの1周期と10周期の時間で計算しています。これは実機で試してみてバラつきが少なければ1周期でいいかもしれません。


回路図はそのうち載せます....
イメージ 1

フォトカプラ TLP621−2
トランジスター 2SC1815

シリアルモニタの結果です。
input:実際の回転数 output:1周期での計算 mean:10周期での計算
イメージ 2


2000rpm以下の回転数だと正しい値が出ないようなので実機でテストするまでに直しておきます。
→tone関数だと31Hz(1860rpm)以下の周波数が生成できないことが原因でした。

以下プログラム

void setup(){
  Serial.begin(9600);
  pinMode(13,INPUT_PULLUP);
  pinMode(8,INPUT);
}

void loop(){
 unsigned long nowtime,beforetime1,beforetime2,beforetime3,
 beforetime4,beforetime5,beforetime6,beforetime7,beforetime8,
 beforetime9,lasttime,
 rpm1,rpm2,rpm3,rpm4,rpm5,rpm6,rpm7,rpm8,rpm9,rpm10,rpm11;
 int val,val2;
 int n=0;
 
 val2=analogRead(0);
 tone(8,val2);
 val2=val2*60;
 
 while(n==0) {
    val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1; 
    }
 }

 do{
    val=digitalRead(13);
 }while(val==1);
 
 nowtime=micros();  //パルスON
//1
n=0;
while(n==0) {
    val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 beforetime1=micros();  //パルスON
//2
n=0;
while(n==0) {
   val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 beforetime2=micros();  //パルスON
//3
n=0;
while(n==0) {
   val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 beforetime3=micros();  //パルスON
//4
n=0;
while(n==0) {
   val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 beforetime4=micros();  //パルスON
//5
n=0;
while(n==0) {
   val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 beforetime5=micros();  //パルスON
//6
n=0;
while(n==0) {
   val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 beforetime6=micros();  //パルスON
//7
n=0;
while(n==0) {
   val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 beforetime7=micros();  //パルスON
//8
n=0;
while(n==0) {
   val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 beforetime8=micros();  //パルスON
//9
n=0;
while(n==0) {
   val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 beforetime9=micros();  //パルスON
//10
n=0;
while(n==0) {
   val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 lasttime=micros();  //パルスON
 

 
 rpm1=60000000/(beforetime1-nowtime);
 rpm2=60000000/(beforetime2-beforetime1);
 rpm3=60000000/(beforetime3-beforetime2);
 rpm4=60000000/(beforetime4-beforetime3);
 rpm5=60000000/(beforetime5-beforetime4);
 rpm6=60000000/(beforetime6-beforetime5);
 rpm7=60000000/(beforetime7-beforetime6);
 rpm8=60000000/(beforetime8-beforetime7);
 rpm9=60000000/(beforetime9-beforetime8);
 rpm10=60000000/(lasttime-beforetime9);
 rpm11=60000000/((lasttime-nowtime)/10);
 
/*
 Serial.println(beforetime1-nowtime);
 Serial.println(beforetime2-beforetime1);
 Serial.println(beforetime3-beforetime2);
 Serial.println(beforetime4-beforetime3);
 Serial.println(beforetime5-beforetime4);
 Serial.println(beforetime6-beforetime5);
 Serial.println(beforetime7-beforetime6);
 Serial.println(beforetime8-beforetime7);
 Serial.println(beforetime9-beforetime8);
 Serial.println((lasttime-nowtime)/10);
*/
 Serial.print("input ");Serial.print(val2); Serial.print("rpm"); Serial.print("\n");
 Serial.print("output ");
 Serial.print(rpm1); Serial.print("rpm"); Serial.print("\t");
 Serial.print(rpm2); Serial.print("rpm"); Serial.print("\t");
 Serial.print(rpm3); Serial.print("rpm"); Serial.print("\t");
 Serial.print(rpm4); Serial.print("rpm"); Serial.print("\t");
 Serial.print(rpm5); Serial.print("rpm");Serial.print("\t");
 Serial.print(rpm6); Serial.print("rpm"); Serial.print("\t");
 Serial.print(rpm7); Serial.print("rpm"); Serial.print("\t");
 Serial.print(rpm8); Serial.print("rpm");Serial.print("\t");
 Serial.print(rpm9); Serial.print("rpm"); Serial.print("\t");
 Serial.print(rpm10); Serial.print("rpm"); Serial.print("\n");
 Serial.print("mean ");Serial.print(rpm11); Serial.print("rpm");Serial.print("\n");Serial.print("\n");
 Serial.flush();
 
delay(5000);
 
}

この記事に

顔アイコン

顔アイコン・表示画像の選択

絵文字
×
  • オリジナル
  • SoftBank1
  • SoftBank2
  • SoftBank3
  • SoftBank4
  • docomo1
  • docomo2
  • au1
  • au2
  • au3
  • au4
  • 名前
  • パスワード
  • ブログ

本文はここまでですこのページの先頭へ
みんなの更新記事