Pengembangan perangkat arduino pintar salah satunya adalah mampu mendeteksi suplai tegangan utama-nya yati tegangan Vcc. Tujuannya adalah :
- mendeteksi secara dini kegagalan yang mungkin terjadi seperti kehilangan daya utama dan menyiapkan tenaga cadangan
- 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | //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" ); 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | //Konstanta #define ADCBandgapIdeal 225.06 #define TeganganVccIdeal 5.0 void setup() { Serial.begin(9600); Serial.println( "Pengukuran tegangan Vcc Arduino" ); } 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); } |