hiro yamamoto works

マイコンハード、ソフトを作ったりしています。
お家や現場のお困りごと解決に!
内容利用は自己責任でお願いします。

タコメーターの回路をマイコンで置き換える(関係資料スケッチ)終

2023-09-13 16:50:32 | ナレッジ_knowledge

※日本精機製タコメータが動かない※
電解コンデンサのショート不良可能性あり。基板中央付近の円筒形470μF6.3Vを、
テスタ抵抗レンジで数Ωなら可能性高いので交換してみて。<br /><br />私のスキルではこの程度のコードしか書けません。
ワーニングMid,Hi LEDのデジタル入出力接続の説明を書き足しました。

/*202308 アナログタコメーターが動かなくなった相談を受ける。
  マイクロコントローラでメーター基板の置き換えをするべく着手
  イグニッションパルスのたち下がり間隔の時間を計測しエンジン回転数を算出
  アナログタコメータをanalogWrite(PWM)で振らせる
  ①map関数で変換する・・・回転数と目盛りが合わない
  ②回転数ごとにif文でPWM値を割り当てる
  ワーニング(設定回転数を超えたことをLED表示)を表示できるようにする。
  Mid 12,000rpm Hi 13,000rpmを仮に設定
ワーニングLEDの接続
Mid,Hi共に LEDアノードを3V3(3.3V)、カソードをMidは9へ、Hiは10へデジタル入出力に接続
*/

uint32_t warningMidPrevious = 0;
uint32_t warningHiPrevious = 0;

//デバック用
//1回転2パルス 計算上 2142uS->≒14005rpm 2100uS->≒14286rpm
//const long interval = 2142;//pulseWidth/2 uS interval at which to blink (milliseconds)

uint32_t pulseTime, lastTime;

//uint16_t rpm_h = 14000;//map関数使用時
//uint16_t rpm_l = 4500;//800
//const uint8_t PWM_full = 255;
//const uint8_t PWM_emp = 0;

uint32_t pulseWidth = 0;
uint32_t tacho_PWM = 0;
uint32_t rpm = 0;

bool warningMidLedState = HIGH;
bool warningHiLedState = HIGH;
uint16_t warningMid_rpm = 12000;
uint16_t warningHi_rpm = 13000;
uint32_t count = 0;
uint32_t lastCount = 0;
uint32_t reset_pre_t = 0;//previous time

void setup() {
  Serial.begin(115200);
  //while(!Serial);
  //pinMode(ledPin, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(9, OUTPUT); //warning Mid Led
  pinMode(10, OUTPUT); //warning Hi Led

  //interrupt attached to IRQ 1 = pin3(Arduino UNO)
  //0はXIAO SAMD21デジタル入出力D0
  attachInterrupt(0, cycleTimeToRPM, FALLING);//digital input D1 XIAO RP2040

  digitalWrite(9, HIGH);//ワーニングMid表示 LEDを消しておくため
  digitalWrite(10, HIGH);//ワーニングHi表示 LED
}
/*割り込み
  Seeed Studio XIAO SAMD21のすべてのピンは割り込みをサポートしていますが、
  5ピンと7ピンの2つのピンを同時に使用することはできません。*/
  
void loop() {

  //ワーニング表示LED
//ワーニングMid,Hi共に LEDアノードを3V3(3.3V)、カソードをMidは9へ、Hiは10へデジタル入出力に接続
  if (rpm >= warningMid_rpm) {//warningMid_rpm
    uint32_t warningMidCurrent = millis();
    if (warningMidCurrent - warningMidPrevious >= 100) { //点滅用
      warningMidPrevious = warningMidCurrent;
      if (warningMidLedState == LOW) {
        warningMidLedState = HIGH;
      } else {
        warningMidLedState = LOW;
      }
      digitalWrite(9, warningMidLedState);
    }
  } else {
    digitalWrite(9, HIGH);
  }
  if (rpm >= warningHi_rpm) {//warningHi_rpm
    uint32_t current = millis();
    if (current - warningHiPrevious >= 100) { //点滅用
      warningHiPrevious = current;
      if (warningHiLedState == LOW) {
        warningHiLedState = HIGH;
      } else {
        warningHiLedState = LOW;
      }
      digitalWrite(10, warningHiLedState);
    }
  } else {
    digitalWrite(10, HIGH);
  }
  //D0へ入力されるパルスが止まった時tacho_PWM値が止まる直前の値のままになる
  //ワーニングも点滅したままになる
  //Detects rotation stoppage and resets meters and warnings by
  //comparing counter changes in external interrupt functions at regular intervals
  //外部割り込み関数のカウンタ変化を一定間隔で比較することで、
  //回転停止を検出してメーターとワーニングをリセットする

  //uint32_t reset_pre_t = 0;//previous time
  uint32_t reset_cur_t = millis();
  if (reset_cur_t - reset_pre_t >= 100) { //パルス停止をチェックする間隔
    reset_pre_t = reset_cur_t;
    if (count == lastCount) { //外部割り込み発生するたびにインクリメントされるカウンタの、
      //前回値と今回値が同じ時はパルス停止と判断してPWM値を0にしてメータを0へ戻す。
      //rpmを0にしてワーニングLEDを消す。
      tacho_PWM = 0;
      analogWrite(6, tacho_PWM);
      rpm = 0;
    }
    lastCount = count;
  }
}

//Engine RPM from cycle time.イグニッションパルスが入力され、外部割り込み発生で実行される関数
void cycleTimeToRPM() {
  count++;//パルス停止の検出に使うカウンタ
  //used to measure time between pulses.
  lastTime = pulseTime;
  pulseTime = micros();//マイクロ秒

  //uint32_t pulseWidth = 0; //uint32_t tacho_PWM = 0; //uint32_t rpm = 0;
  pulseWidth = pulseTime - lastTime;
  rpm = (60 * 1000000) / pulseWidth;//60秒をマイクロ秒に直して 回転数を算出する
  rpm /= 2; // エンジン種類により1回転2パルスの時使う
  //T(Sec)=60/N(rpm)
  //60/pulseWidth(Sec)=N(rpm)
  
  //map関数を使う場合の説明
  //map関数を使ってパルス幅数値をanalogWrite用数値(PWM)変換する
  //PWM波のデューティ比を変えることで出力電圧を変化させ、メーターの振れ角を変える
  //12V 直列(100Ω,680Ω並列)87.2Ωメーター並列470uFにてanalogWrite値255でフルスケ
  //12,000rpm超え表示域(特に13,000以上)で上下を繰り返すと指示値が500ぐらいばらつく
  //uint16_t rpm_h = 14000;//uint16_t rpm_l = 4500;//800

  /*if ((rpm > rpm_l) && (rpm < rpm_h)) { //map変換前にrpmをrpm_l〜rpm_hの範囲に制限する
    //map関数構文 map(value, fromLow, fromHigh, toLow, toHigh); // すべてlong型
    tacho_PWM = map(rpm, rpm_l, rpm_h, PWM_emp, PWM_full);//回転数(RPM)をPWM値に変換する
    } else if (rpm <= rpm_l) {
    tacho_PWM = 17;
    } else if (rpm >= rpm_h) {
    tacho_PWM = 255;
    }*/
  //2,500〜4,000 500rpm step  4,000〜10,000 200rpm step
  //10,000〜14,000rpm 100rpm step
  if (rpm >= 14000) tacho_PWM = 255;//回転数ごとにメーター指示値をPWM値で調整
  else if (rpm >= 13900 && rpm < 14000) tacho_PWM = 253;//100rpm step
  else if (rpm >= 13800 && rpm < 13900) tacho_PWM = 250; 
  else if (rpm >= 13700 && rpm < 13800) tacho_PWM = 246;
  else if (rpm >= 13600 && rpm < 13700) tacho_PWM = 242;
  else if (rpm >= 13500 && rpm < 13600) tacho_PWM = 238;
  else if (rpm >= 13400 && rpm < 13500) tacho_PWM = 234;
  else if (rpm >= 13300 && rpm < 13400) tacho_PWM = 231;
  else if (rpm >= 13200 && rpm < 13300) tacho_PWM = 225;
  else if (rpm >= 13100 && rpm < 13200) tacho_PWM = 221;
  else if (rpm >= 13000 && rpm < 13100) tacho_PWM = 218;
  else if (rpm >= 12900 && rpm < 13000) tacho_PWM = 215;
  else if (rpm >= 12800 && rpm < 12900) tacho_PWM = 212;
  else if (rpm >= 12700 && rpm < 12800) tacho_PWM = 208;
  else if (rpm >= 12600 && rpm < 12700) tacho_PWM = 206;
  else if (rpm >= 12500 && rpm < 12600) tacho_PWM = 204;
  else if (rpm >= 12400 && rpm < 12500) tacho_PWM = 201;
  else if (rpm >= 12300 && rpm < 12400) tacho_PWM = 199;
  else if (rpm >= 12200 && rpm < 12300) tacho_PWM = 196;
  else if (rpm >= 12100 && rpm < 12200) tacho_PWM = 193;
  else if (rpm >= 12000 && rpm < 12100) tacho_PWM = 191;
  else if (rpm >= 11900 && rpm < 12000) tacho_PWM = 188;
  else if (rpm >= 11800 && rpm < 11900) tacho_PWM = 185;
  else if (rpm >= 11700 && rpm < 11800) tacho_PWM = 183;
  else if (rpm >= 11600 && rpm < 11700) tacho_PWM = 181;
  else if (rpm >= 11500 && rpm < 11600) tacho_PWM = 177;
  else if (rpm >= 11400 && rpm < 11500) tacho_PWM = 175;
  else if (rpm >= 11300 && rpm < 11400) tacho_PWM = 172;
  else if (rpm >= 11200 && rpm < 11300) tacho_PWM = 169;
  else if (rpm >= 11100 && rpm < 11200) tacho_PWM = 167;
  else if (rpm >= 11000 && rpm < 11100) tacho_PWM = 165;
  else if (rpm >= 10900 && rpm < 11000) tacho_PWM = 162;
  else if (rpm >= 10800 && rpm < 10900) tacho_PWM = 160;
  else if (rpm >= 10700 && rpm < 10800) tacho_PWM = 158;
  else if (rpm >= 10600 && rpm < 10700) tacho_PWM = 156;
  else if (rpm >= 10500 && rpm < 10600) tacho_PWM = 153;
  else if (rpm >= 10400 && rpm < 10500) tacho_PWM = 151;
  else if (rpm >= 10300 && rpm < 10400) tacho_PWM = 149;
  else if (rpm >= 10200 && rpm < 10300) tacho_PWM = 147;
  else if (rpm >= 10100 && rpm < 10200) tacho_PWM = 145;
  else if (rpm >= 10000 && rpm < 10100) tacho_PWM = 143; //100rpm step
  else if (rpm >= 9800 && rpm < 10000) tacho_PWM = 137;//200rpm step
  else if (rpm >= 9600 && rpm < 9800) tacho_PWM = 132;
  else if (rpm >= 9400 && rpm < 9600) tacho_PWM = 128;
  else if (rpm >= 9200 && rpm < 9400) tacho_PWM = 124;
  else if (rpm >= 9000 && rpm < 9200) tacho_PWM = 122;
  else if (rpm >= 8800 && rpm < 9000) tacho_PWM = 118;
  else if (rpm >= 8600 && rpm < 8800) tacho_PWM = 114;
  else if (rpm >= 8400 && rpm < 8600) tacho_PWM = 110;
  else if (rpm >= 8200 && rpm < 8400) tacho_PWM = 106;
  else if (rpm >= 8000 && rpm < 8200) tacho_PWM = 102;
  else if (rpm >= 7800 && rpm < 8000) tacho_PWM = 99;
  else if (rpm >= 7600 && rpm < 7800) tacho_PWM = 95;
  else if (rpm >= 7400 && rpm < 7600) tacho_PWM = 92;
  else if (rpm >= 7200 && rpm < 7400) tacho_PWM = 88;
  else if (rpm >= 7000 && rpm < 7200) tacho_PWM = 85;
  else if (rpm >= 6800 && rpm < 7000) tacho_PWM = 82;
  else if (rpm >= 6600 && rpm < 6800) tacho_PWM = 79;
  else if (rpm >= 6400 && rpm < 6600) tacho_PWM = 75;
  else if (rpm >= 6200 && rpm < 6400) tacho_PWM = 72;
  else if (rpm >= 6000 && rpm < 6200) tacho_PWM = 69;
  else if (rpm >= 5800 && rpm < 6000) tacho_PWM = 66;
  else if (rpm >= 5600 && rpm < 5800) tacho_PWM = 63;
  else if (rpm >= 5400 && rpm < 5600) tacho_PWM = 61;
  else if (rpm >= 5200 && rpm < 5400) tacho_PWM = 58;
  else if (rpm >= 5000 && rpm < 5200) tacho_PWM = 55;
  else if (rpm >= 4800 && rpm < 5000) tacho_PWM = 52;
  else if (rpm >= 4600 && rpm < 4800) tacho_PWM = 50;
  else if (rpm >= 4400 && rpm < 4600) tacho_PWM = 47;
  else if (rpm >= 4200 && rpm < 4400) tacho_PWM = 45;
  else if (rpm >= 4000 && rpm < 4200) tacho_PWM = 42;
  else if (rpm >= 3500 && rpm < 4000) tacho_PWM = 37;//500rpm step
  else if (rpm >= 3000 && rpm < 3500) tacho_PWM = 33;
  else if (rpm >= 2500 && rpm < 3000) tacho_PWM = 26;
  else if (rpm < 2500) tacho_PWM = 18;

  analogWrite(6, tacho_PWM);
  Serial.print(pulseWidth); // デバック 計測したパルス幅
  Serial.print(" , "); // デバック
  Serial.print(tacho_PWM); // デバック PWM値
  Serial.print(" , "); // デバック
  Serial.println(rpm); // デバック 回転数
  
}

 



最新の画像もっと見る

コメントを投稿