Mengukur tegangan Vcc Arduino

Pengembangan perangkat arduino pintar salah satunya adalah mampu mendeteksi suplai tegangan utama-nya yati tegangan Vcc. Tujuannya adalah :

  1. mendeteksi secara dini kegagalan yang mungkin terjadi seperti kehilangan daya utama dan menyiapkan tenaga cadangan
  2. Menyimpan data-data penting kedalam EEPROM apabila ada indikasi tegangan akan drop

Cara mengukuran Vcc Arduino bisa dilakukan dengan dua cara :

Cara pertama

Menggunakan rangkaian pembagi tegangan sebagai input ke ADC yang menggunakan internal reference (1.1Volt)

resistor yang digunakan haruslah memiliki toleransi rendah / presisi tinggi (misal 1%).

skema pengukuran tegangan suplai arduino:

sketch / program menghitung tegangan catu daya arduino:

//pin
#define detektorBaterai A0

//Konstanta
#define resistorPlus 10000L
#define resistorGround 1000L
#define teganganReferesiAnalog 1.1

void setup() {
  Serial.begin(9600);
  Serial.println("Pengukuran tegangan Vcc Arduino");
  Serial.println("https://www.project.semesin.com");

  analogReference(INTERNAL1V1);
}

void loop() {
  uint16_t rawVcc = 0;
  for(int i=0;i<10;i++)
  {
    rawVcc += analogRead(detektorBaterai); 
  }
  rawVcc /= 10;
  
  double teganganPembagi = teganganReferesiAnalog * rawVcc / 1023;//Volt
  double teganganVcc = teganganPembagi * ((resistorPlus + resistorGround) / resistorGround);//Volt

  Serial.print("Tegangan Vcc = ");
  Serial.println(teganganVcc);

  delay(1000);
}

Cara kedua

Pengukuran tegangan internal bandgap (1.1V) untuk dibandingkan dengan nilain ADC dari tegangan bandgap ideal.

nilai ADC ideal tegangan bandgap adalah:

dengan menggunakan rumusan perbandingan :

metode ini tanpa komponen external dengan sketch:

//Konstanta
#define ADCBandgapIdeal 225.06
#define TeganganVccIdeal 5.0

void setup() {
  Serial.begin(9600);
  Serial.println("Pengukuran tegangan Vcc Arduino");
  Serial.println("https://www.project.semesin.com");
}

void loop() {
  uint16_t rawVcc = 0;
  for(int i=0;i<10;i++)
  {
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);//ADC channel bandgap
    ADCSRA |= _BV( ADSC );
    while( ( (ADCSRA & (1<<ADSC)) != 0 ) );
    rawVcc += ADC; 
  }
  rawVcc /= 10;
  
  double teganganVcc = ADCBandgapIdeal * TeganganVccIdeal / rawVcc;

  Serial.print("Tegangan Vcc = ");
  Serial.println(teganganVcc);

  delay(1000);
}

Leave a Reply

Your email address will not be published. Required fields are marked *