Jak sprawdzić czy bateria zasilająca naszą ATmegę328P wymaga doładowania, zwłaszcza gdy czujnik z procesorem jest poza domem? Najlepiej, żeby sprawdzał co jakiś czas napięcie baterii i przesyłał dane (na przykład przez sieć opartą o nRF24l01) do bazy. Aby tego dokonać potrzebujemy programu, który odczyta wartość napięcia, odnosząc je do wewnętrzego napięcia ~1.1V. Jak określić dokładną wartość napięcia referencyjnego pokazywałem w tym artykule.
Żródło-> https://arduino.stackexchange.com/questions/16352/measure-vcc-using-1-1v-bandgap
Skecz poniżej nie podaje dokładnych wartości napięcia, u mnie napięcie z baterii mierzone na wejściu, które wynosi 3.95 V program odczytuje jako 3.06, a graniczne dla działania ATmega328P 2.77 V jako 2.71. Nie w czym tkwi błąd, ale dla sprawdzenia niebezpiecznego dla ogniwa spadku napięcia to absolutnie wystarczy.
int readBandGap() {
ADMUX = (B01 << REFS0) // VCC
| (0 << ADLAR) // right-adjusted result
| (B011110 << MUX0) // 1.1V
;
// switch off any ADC conversion
ADCSRA &= ~(1 << ADEN);
// enable ADC
ADCSRA |= 1 << ADEN;
// start ADC
ADCSRA |= 1 << ADSC;
// wait until finished
while (bit_is_set(ADCSRA, ADSC));
// first read low, then high!
uint8_t low = ADCL;
uint8_t high = ADCH;
// switch off any ADC conversion
ADCSRA &= ~(1 << ADEN);
return (high << 8) | low;
}
void setup() {
Serial.begin(9600);
}
void loop() {
int value = readBandGap();
float vcc = 1.1 * 1023 / value;
Serial.print(value);
Serial.print(" ");
Serial.println(vcc);
delay(1000);
}
- https://arduino.stackexchange.com/questions/16352/measure-vcc-using-1-1v-bandgap
- https://jeelabs.org/2012/05/12/improved-vcc-measurement/
Mierzenie analogowe
Źródło -> Arduino. 65 praktycznych projektów – John Boxhall
Napięcie dostarczane przez typową nową baterię AA zwykle wynosi około 1,6 V i z czasem spada wraz ze zużyciem baterii. System budowany w ramach tego projektu będzie mierzył napięcie i prezentował stan baterii za pomocą diod LED. Stan baterii będzie odczytywany za pomocą funkcji analogRead() i konwertowany na wartość wyrażoną w woltach. Ponieważ maksymalne napięcie obsługiwane przez analogowy pin wejściowy wynosi 5 V, należy podzielić 5 przez 1024 (czyli liczbę możliwych wartości) — w ten sposób otrzymujemy wartość 0,0048. Oznacza to, że jeśli funkcja analogRead() zwróci na przykład wartość 512, należy pomnożyć tę liczbę przez 0,0048, zatem wskazanie pinu analogowego wyniesie 2,4576 V.
Szkic
void setup(){
analogReference(INTERNAL); // wskazuje wewnętrzne źródło napięcia 1,1 V jako napięcie referencyjne
Serial.begin(9600);
}
void loop()
{
int analogValue = analogRead(0);
float voltage = 0.0048*analogValue;
Serial.println(voltage);
delay(3000);
}
Poprawa precyzji pomiarów sygnału analogowego za pomocą napięcia referencyjnego
Jak wspomniałem przy okazji omawiania projektu nr 6, funkcja analogRead() zwraca wartość proporcjonalną do odczytanego napięcia, które może wynosić od 0 do 5 V. Górna granica (5 V) to tzw. napięcie referencyjne (ang. reference voltage), czyli maksymalne napięcie akceptowane na pinie analogowym płytki Arduino, dla którego funkcja analogRead() zwraca najwyższą możliwą wartość (równą 1023).
Aby podnieść precyzję pomiarów niższych napięć, należy obniżyć napięcie referencyjne. Jeśli napięcie referencyjne wynosi 5 V, funkcja analogRead() reprezentuje odczytany poziom za pomocą wartości od 0 do 1023. Gdyby jednak budowany system miał służyć na przykład do mierzenia napięcia, które nie przekracza 2 V, i gdyby także ten przedział napięcia był reprezentowany przez wartości z przedziału od 0 do 1023, precyzja pomiarów byłaby dużo wyższa.
Okazuje się, że można to osiągnąć, stosując zewnętrzne lub wewnętrzne napięcie referencyjne (obie techniki zostaną omówione w poniższych punktach).
Stosowanie zewnętrznego napięcia referencyjnego
Pierwsza metoda stosowania napięcia referencyjnego polega na użyciu pinu analogowego AREF (od ang. analog reference);
Nowe napięcie referencyjne można wprowadzić, łącząc odpowiednie źródło napięcia z pinami AREF i GND na płytce Arduino. W ten sposób można obniżyć napięcie referencyjne, ale nie można go podnieść, ponieważ napięcie referencyjne podłączone do płytki Arduino Uno nigdy nie może przekraczać 5 V. Jednym z najprostszych sposobów obniżenia napięcia referencyjnego jest utworzenie dzielnika napięcia złożonego z dwóch rezystorów
Najprostszym sposobem dzielenia napięcia jest dwukrotne obniżenie Vwe poprzez zastosowanie dwóch takich samych oporników R1 i R2, na przykład o wartości 10kΩ każdy. W takim przypadku warto zastosować rezystory z możliwie najniższym poziomem tolerancji (na przykład 1%) oraz sprawdzić rzeczywiste wartości rezystancji przy użyciu multimetru, a następnie potwierdzić wszystkie parametry za pomocą przytoczonego wzoru. Warto też umieścić kondensator 100 nF pomiędzy pinami AREF i GND, aby uniknąć zakłóceń na pinie AREF, które mogą powodować niestabilne wskazania analogowego pinu wejściowego.
W przypadku zastosowania zewnętrznego napięcia referencyjnego należy umieścić w funkcji void setup() w szkicu następujący wiersz:
analogReference(EXTERNAL); // wskazuje pin AREF jako źródło napięcia referencyjnego
Stosowanie wewnętrznego napięcia referencyjnego
Płytka Arduino Uno oferuje także wewnętrzne napięcie referencyjne na poziomie 1,1 V. Jeśli ten poziom napięcia jest wystarczający, nie ma potrzeby stosowania żadnych dodatkowych urządzeń. Wystarczy umieścić w ciele funkcji void setup() następujący kod:
analogReference(INTERNAL); // wskazuje wewnętrzne źródło napięcia 1,1 V jako napięcie referencyjne