Go Down

Topic: arduino nano reset on its own (Read 240 times) previous topic - next topic

jumpin

hi,
i am making an buck converter using arduino nano. i uploaded the first code then power by battery and works fine. then after putting some code. the arduino now resets on its own
i attach the link of the video. and the code
https://photos.app.goo.gl/j1gUx7BWgLKGMpzX8

Code: [Select]
#include <LiquidCrystal_PCF8574.h>
#include <Wire.h>
LiquidCrystal_PCF8574 lcd(0x27); // set the LCD address to 0x27 for a 16 chars and 2 line display
int show = -1;

uint16_t PWM_MIN = 96;
uint16_t PWM_MAX = 150;
uint16_t PWM_DUTY = 120;
#define PWM_INC 1 //the value the increment to the pwm value for the ppt algorithm
#define AVG_NUM 20
#define SOL_AMPS_PIN A0
#define SOL_VOLTS_PIN A3
#define BAT_AMPS_PIN A1
#define BAT_VOLTS_PIN A2

#define SENSOR_SCALE 0.05 // 50mv per amper

double VOLTAGE_DIVIDER = 0.04912836767; //(r2/(r1+r2))
double VOLTAGE_REFERENCE = 4.096;       //external Vref
double SOL_AMPS = 0.0;
double SOL_VOLTS = 0.0;
double BAT_AMPS = 0.0;
double BAT_VOLTS = 0.0;
double SOL_WATTS = 0.0;
double OLD_SOL_WATTS = 0.0;
double OLD_SOL_VOLT = 0.0;

double OFFSET_SOLAR = 0.0;
double OFFSET_BATTERY = 0.0;
void setup() {
  // put your setup code here, to run once:
  TCCR1A = 0xB2;
  TCCR1B = 0x11;
  ICR1 = 160;
  DDRB = 0x06;
  OCR1A = 0;
  OCR1B = 0;
  int error;
  analogReference(EXTERNAL);
  analogRead(A0);
  analogRead(A1);
  analogRead(A2);
  analogRead(A3);
  Serial.begin(115200);

  Serial.println("Dose: check for LCD");
  Wire.begin();
  Wire.beginTransmission(0x27);
  error = Wire.endTransmission();
  Serial.print("Error: ");
  Serial.print(error);
  if (error == 0) {
    Serial.println(": LCD found.");
    show = 0;
    lcd.begin(16, 2); // initialize the lcd
  } else {
    Serial.println(": LCD not found.");
  }
  lcd.setBacklight(255);


  OFFSET_SOLAR = read_adc(SOL_AMPS_PIN);
  OFFSET_BATTERY = read_adc(BAT_VOLTS_PIN);
}

void loop() {
  read_data();
  if (SOL_WATTS > OLD_SOL_WATTS) {
    if (SOL_VOLTS > OLD_SOL_VOLT)
    {
      PWM_DUTY += PWM_INC;
    }
    else
    {
      PWM_DUTY -= PWM_INC;
    }
  }
  else {
    if (SOL_VOLTS > OLD_SOL_VOLT)
    {
      PWM_DUTY -= PWM_INC;
    }
    else
    {
      PWM_DUTY += PWM_INC;
    }
  }

  if (PWM_DUTY < PWM_MIN) {
    PWM_DUTY = 96;
  }
  if (PWM_DUTY > PWM_MAX) {
    PWM_DUTY = 150;
  }
  OLD_SOL_VOLT = SOL_VOLTS;
  OLD_SOL_WATTS = SOL_WATTS; // load old_watts with current watts value for next time
  OCR1A = PWM_DUTY - 10;
  OCR1B = PWM_DUTY;
  delay(100);
  lcd.setCursor(0, 0);
  lcd.print(SOL_WATTS);
  lcd.setCursor(0, 1);
  lcd.print(SOL_VOLTS);

}


void read_data(void)
{
  int temp_sol_amps = read_adc(SOL_AMPS_PIN);
  int temp_sol_offset = temp_sol_amps - OFFSET_SOLAR;
  if (temp_sol_offset < 0)
  {
    temp_sol_offset = 0;
  }

  int temp_bat_amps = read_adc(BAT_AMPS_PIN);
  int temp_bat_offset = temp_bat_amps - OFFSET_BATTERY;
  if (temp_bat_offset < 0)
  {
    temp_bat_offset = 0;
  }

  SOL_AMPS = (temp_sol_offset * (VOLTAGE_REFERENCE / 1023.0)) / 0.05; //input of solar amps
  //SOL_AMPS = read_adc(SOL_AMPS_PIN);                      //input of solar amps
  SOL_VOLTS = (read_adc(SOL_VOLTS_PIN) * (VOLTAGE_REFERENCE / 1023.0)) / VOLTAGE_DIVIDER; //input of solar volts
  BAT_AMPS = (temp_bat_offset * (VOLTAGE_REFERENCE / 1023.0)) / 0.05;                     //output of battery amps
  //BAT_AMPS = read_adc(BAT_AMPS_PIN);                       //output of battery amps
  BAT_VOLTS = (read_adc(BAT_VOLTS_PIN) * (VOLTAGE_REFERENCE / 1023.0)) / VOLTAGE_DIVIDER; //calculations of solar watts
  SOL_WATTS = SOL_AMPS * SOL_VOLTS;
}

int read_adc(int channel)
{
  int sum = 0;
  int temp;
  int i;
  for (i = 0; i < AVG_NUM; i++)
  { // loop through reading raw adc values AVG_NUM number of times
    temp = analogRead(channel); // read the input pin
    sum += temp;                // store sum for averaging
    delayMicroseconds(100);     // pauses for 50 microseconds
  }
  return (sum / AVG_NUM); // divide sum by AVG_NUM to get average and return it
}

BJHenry

Which part of the code did you put in that made the Nano reset itself? That's going to be be the first place to start looking.
Code by itself doesn't tell the whole story, can you share your schematic?

noob314

When use analogReference(EXTERNAL), VRef or other pins need to be connected properly and set some flags. Otherwise it may reset or even burn up. As long I remember. Other member will probably give you more details.


gilshultz

From your description you have inductors in your hardware design but no schematic.  It is possible they are giving you a transit that is causing your processor to reset.  However A relative simple way to narrow down the problem but can be time consuming is to use the delay(5000); statement placed at various parts of your code.  Start by making it the first statement in setup(), then go down line by line until it resets, then the line before is causing the problem. This response is to help you get started in solving your problem, not solve it for you.
Good Luck & Have Fun!
Gil

jumpin

hi  again


i found the problem of arduino nano.

OCR1A = PWM_DUTY - 10;

this line of code is causing the arduino nano to reset. and i dont know why.
then line is for low side mosfet minus 10 so will have a dead time for mosfet.
any recomendation for solution?
thank you..

Go Up