Arduinoのクラッシュと再起動

私は最近、A0、A1で測定されたフィードバック電圧を一定に保つためにデューティサイクルを変更するプログラムを作成しました。問題は、Arduinoが目標電流に近づくとかなり一定の間隔で衝突が始まることです。クラッシュすると、プログラムが再起動することが確認されました(ただし、もう一度クラッシュします)。

クラッシュ中のシリアル出力のサンプルを以下に示します。

Current A: 65   Current B: 67   PWM A: 174.98   PWM B: 236.00
Current A: 65   Current B: 67   PWM A: 174.98   PWM B: 235.96
Current A: 65   Current B: 67   PWM A: 174.98   PWM B: 235.92
Current A: 64   Current B: 67   PWM A: 175.00   PWM B: 235.88
Current A: 64   Current B: 66   PWM A: 250.00   PWM B: 285114740000000000000000000.00
Current A: 0    Current B: 0    PWM A: 1.30     PWM B: 0.00
Current A: 0    Current B: 0    PWM A: 2.60     PWM B: 1.30
Current A: 0    Current B: 0    PWM A: 3.90     PWM B: 2.60
Current A: 0    Current B: 0    PWM A: 5.20     PWM B: 3.90

そしてここに私のコードのすべてがあります:

#include 

//Program to run on the Vegetarium
//Written by Leon Teichroeb on 12/6/2016

//Hardware description:
//-Oscillator 2A and 2B for the two onboard driver circuits
//-Pin 13 is attached to the "heartbeat" LED
//-Channel A (3) and B (11) current measurements on A0 and A1

//Functionality:
//-Drive Channels at set current

float PWMA = 0;
float PWMB = 0;

int TARGETA = 65;
int TARGETB = 65;


void setup() {
  Serial.begin(115200);

  pinMode(3, OUTPUT);
  pinMode(11, OUTPUT);
  TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(CS20);
  OCR2A = (int)PWMA;
  OCR2B = (int)PWMB;
  digitalWrite(3, LOW);
  digitalWrite(11, LOW);

  delay(5000);
}

void loop() {
  int CURRENTA = analogRead(A0)/4;

  if(CURRENTA < TARGETA) {
    PWMA += (TARGETA - CURRENTA) * 0.020f;
    if(PWMA > 250) {
      PWMA = 250;
    }
  }
  if(CURRENTA > TARGETA) {
    PWMA += (TARGETA - CURRENTA) * 0.020f;
    if(PWMA < 5) {
      PWMA = 5;
    }
  }

  int CURRENTB = analogRead(A1)/4;

  Serial.println("Current A: " + (String)CURRENTA + "\t" + "Current B: " + (String)CURRENTB + "\t" + "PWM A: " + (String)PWMA + "\t" + "PWM B: " + (String)PWMB);
  //Serial.println("PWM A: " + (String)PWMA + "\t" + "PWM B: " + (String)PWMB);
  //Serial.print("freeMemory()=");
  //Serial.println(freeMemory());


  if(CURRENTB < TARGETB) {
    PWMB += (TARGETB - CURRENTB) * 0.020f;
    if(PWMB > 250) {
      PWMB = 250;
    }
  }
  if(CURRENTB > TARGETB) {
    PWMB += (TARGETB - CURRENTB) * 0.020f;
    if(PWMB < 5) {
      PWMB = 5;
    }
  }

  if(PWMA < 10) {
    digitalWrite(3, LOW);
  } else {
    analogWrite(3, (int)PWMA);
  }
  if(PWMB < 10) {
    digitalWrite(11, LOW);
  } else {
    analogWrite(11, (int)PWMB);
  }

  delay(40);
}

私の回路は、単純な7815電圧レギュレータを通してArduinoにも電力を供給します。アナログ入力は数ボルトを超えず、PWM出力は2つのロジックレベルMOSFETを駆動します。回路に関する詳細情報が必要な場合は、私にお知らせください!

編集:2つのフィードバックループのバグではないことがわかりました。なぜなら、両方とも自分自身で動作するからです。両方のフィードバックループを併用するとすぐにクラッシュします。私が知る限り、それらの間に共有変数やデータはありません

0
私はあなたのコードにひどく間違ったことは何も見えません。たぶん記憶の問題。 String なしで印刷してみましたか?次のようになります。 Serial.print( "Current A:"); Serial.print(CURRENTA); ... 面倒ですが、メモリにやさしいです。
追加された 著者 Sprogz,
285114740000000000000000000 はちょっと奇妙です。また、 PWM B:0.00 は上記のコードでは不可能と思われます。非常に奇妙な。 (7805の出力にいくつかのコンデンサを追加しましたか?)
追加された 著者 Al.,
私は間違いなくそれを試みることができますが、実際にこの問題をデバッグするためのシリアルコードを書いています。私もメモリの問題を疑っていましたが、MemoryFree.hを使用しても、私はまだ1500バイト以上の空きがあり、リークはありませんでした
追加された 著者 Alexander Johansen,
0.0 PWM信号は、デューティサイクルを下げる場合に限り5.0に制限されるので可能です。また、私は7805の出力に0.1uFのコンデンサを備えていますが、これは実験室用電源で駆動されています
追加された 著者 Alexander Johansen,

1 答え

私はついにそれを理解し、Arduinoは現在の保護モードに入ってリセットされました。 MOSFETを駆動するピンは、BUZ11の入力容量のためにレギュレーションが開始されたあと、あまりにも多くの電流を引き出していました。

この問題を解決するには、ゲートに直列に120オームの抵抗を追加するだけでした。これにより、起動と停止が遅くなり、電流の流れが少なくなりました。

1
追加された