FC2ブログ

    記事一覧

    arduinoで進角制御5

    本日のアップは自分用のアップです。
    まず、現時点でのNSR50系エンジン用の遅角CDI用の回路図。


    回路図の疑問点。
    ・arduinoからの出力用のフォトカプラは必要ないかも・・・。考えた時には回路を分離できノイズの問題を軽減できると期待したけど、GNDを共有しているので、あまり意味がないように感じる。
    ・遅角制御用のボリュームは、セッティングの時には役立つが、実用運転が始まると故障の原因になりそう。
    対策は、セッティングが出たらアナログ値を調べてプログラムで固定する。


    //以下は今回のプログラム、このプログラムはNSR用のため他の車種では合わないと思います。
    const int enPin1 = 7;
    int inpin =12;

    unsigned long us;
    unsigned long ptime;

    void setup() {
      DDRD = DDRD | B01111110 ;//ポートを直接制御する文
      pinMode(enPin1, INPUT);
      pinMode(inpin,OUTPUT);
     }

    void loop() {
      int val0;
      int val1;
      int val2;
      int val3;
      int val4;
      int val5; 
      val0=analogRead(0);
      val1=analogRead(1);
      val2=analogRead(2);
      val3=analogRead(3);
      val4=analogRead(4);
      val5=analogRead(5);
     
       us=pulseIn(enPin1,LOW);//NSR50ではLOWにする。

        if(us>3750){ //
      ptime=((us/45)*(val0/22));
      delayMicroseconds(ptime);
      digitalWrite(inpin, HIGH);
       delayMicroseconds(5);
    digitalWrite(inpin, LOW);
    PORTD = B00000100;
        }
    else if(us<=3750&&us>3000){
     ptime=((us/45)*(val1/22));
      delayMicroseconds(ptime);
      digitalWrite(inpin, HIGH);
       delayMicroseconds(5);
    digitalWrite(inpin, LOW);
    PORTD = B00001000;
    }
    else if(us<=3000&&us>2500){
     ptime=((us/45)*(val2/22));
      delayMicroseconds(ptime);
      digitalWrite(inpin, HIGH);
       delayMicroseconds(5);
    digitalWrite(inpin, LOW);
    PORTD = B00010000;
    }
    else if(us<=2500&&us>2144){
     ptime=((us/45)*(val3/22));
      delayMicroseconds(ptime);
      digitalWrite(inpin, HIGH);
       delayMicroseconds(5);
    digitalWrite(inpin, LOW);
    PORTD = B00100000;
    }
    else if(us<=2144&&us>1875){
     ptime=((us/45)*(val4/22));
      delayMicroseconds(ptime);
      digitalWrite(inpin, HIGH);
       delayMicroseconds(5);
    digitalWrite(inpin, LOW);
    PORTD = B00000010;
    }
    else if(us<=1875){
     ptime=((us/45)*(val5/22));
      delayMicroseconds(ptime);
      digitalWrite(inpin, HIGH);
       delayMicroseconds(5);
    digitalWrite(inpin, LOW);
    PORTD = B01000000;
    }
    }

    //今回のプログラムで大きな変更は、調整可能ボリュームのLEDを点灯するプログラムをdigitalWriteを使用せず、PORTD = B00000100;で直接ピンを制御したこと。
    これにより、高回転時のプログラム遅延を減らすことが出来た。

    次回以降、改善したい部分は、今回は自作CDIの特徴のおかげで、遅角する必要があったので、比較的簡単に制御できたが、できれば一周前の信号から最適な点火タイミングを出せるようにしたい。
    プログラム中delayMicrosecondsを多用しているがもっと減らしてプログラムのスリム化をしたい。

    今回は、ほぼ独り言なので、公開しなくてもと思いましたが、一応アップしておきます。
    スポンサーサイト



    コメント

    コメントの投稿

    非公開コメント

    プロフィール

    engine太郎

    Author:engine太郎
    FC2ブログへようこそ!

    エンジン太郎カウンター