jak włączyć i użyć w bacomie uref 1,1v w attiny13a?
• Ustaw źródło odniesienia ADC na 1,1 V poleceniem BASCOM:
Config Adc = Single , Prescaler = Auto , Reference = Internal1v1 'lub Internal
• Uruchom przetwornik: Start Adc
• Odczytuj pomiary: AdcVal = GetAdc(kanał)
i przeliczaj napięcie:
U = AdcVal * 1.1 / 1023
Kluczowe punkty
– bit REFS0 w rejestrze ADMUX = 1 → wewnętrzne 1,1 V
– odczekaj ≥1 ms po włączeniu referencji i odrzuć pierwszy pomiar
– rzeczywiste Uref ma tolerancję ±10 %, warto je skalibrować
Teoria
Przetwornik ADC w ATtiny13A może korzystać z trzech źródeł odniesienia: VCC, AREF (brak w obudowie 8-pin) lub stabilizowane wewnętrzne 1,1 V. Wybór odbywa się bitem REFS0 rejestru ADMUX. Przy REFS0=1 układ przełącza precyzyjny band-gap ~1,1 V, niezależny od wahań zasilania.
Implementacja w BASCOM-AVR
$regfile = "attiny13.dat"
$crystal = 9600000 'wewn. RC 9,6 MHz
Config Adc = Single , Prescaler = Auto , Reference = Internal1v1
Start Adc 'włączenie modułu
Dim AdcVal As Word
Dim Uin As Single
Do
AdcVal = GetAdc(0) 'kanał ADC0 = PB5
Uin = AdcVal * 1.1 / 1023
Waitms 500
Loop
• Prescaler = Auto dobiera dzielnik tak, by fCLK_ADC 50-200 kHz.
• Pierwszy pomiar po konfiguracji może być obarczony błędem – najlepiej go odrzucić.
Bezpośredni zapis do rejestrów (gdy używasz asemblera/planujesz optymalizację):
ADMUX = &B01000000 'REFS0=1, kanał 0
ADCSRA = &B10000111 'ADEN=1, preskaler /128
Rozpoczynasz konwersję ustawiając ADSC, czekasz aż bit spadnie do 0, odczytujesz ADCL/ADCH.
Zakres pomiarowy
0 – 1,1 V z rozdzielczością ≈1,07 mV/LSB. Dla wyższych napięć stosuj dzielnik rezystorowy lub przełącz Vref na VCC.
• Najnowsze wersje BASCOM (>2.0.8.8) akceptują słowa Internal
, Internal1v1
, a nawet 1100
jako parametr Reference.
• Popularne biblioteki „TinyCore” dla środowisk C/C++ również automatyzują przełączenie bitu REFS0, co pozwala portować kod między BASCOM a C bez zmian sprzętowych.
• W nowszych ATtiny (seria 0/1), Uref wzrosło do 1,024 V, a ADC ma wbudowaną fabryczną kalibrację w EEPROM – trend idzie w kierunku większej dokładności bez konieczności zewnętrznych komponentów.
• Stabilizacja band-gap: wg noty aplikacyjnej Atmela trzeba odczekać min. 60-110 µs, lecz w praktyce bezpieczne jest 0,5-1 ms.
• Kalibracja: zmierz multimetrem napięcie na pinie VCC→GND przy włączonym Vref (metoda „pomiaru wewnętrznego VCC”) lub zewnętrznie doprowadź 1,000 V i koryguj współczynnik w programie:
Const Vref_real = 1.091 : Uin = AdcVal * Vref_real / 1023
• Zużycie energii: wyłącz ADC gdy nie jest potrzebny (Stop Adc
lub ADEN=0
) – oszczędza ok. 230 µA przy 5 V.
• Brak specyficznych kwestii prawnych; należy jedynie przestrzegać deklaracji RoHS przy projektach komercyjnych.
• Używając dzielników do pomiaru napięć powyżej 1,1 V, należy zapewnić, że przekroczenie zakresu nie uszkodzi mikrokontrolera (warto rozważyć diodę Zenera lub bezpiecznik polimerowy).
• Test dokładności: podaj na wejście ADC stabilne napięcie odniesienia 0,55 V (½ Uref) z rezystorowego dzielnika i sprawdź, czy odczyt ≈512 ±10 LSB.
• Jeśli w projekcie odczytujesz napięcie baterii >3 V, zastosuj dzielnik 1:3 (np. 470 kΩ/1 MΩ), a wynik skaluj w oprogramowaniu:
Ubat = AdcVal * 1.1 / 1023 * 3
• Zawsze umieszczaj kondensator 100 nF przy pinie VCC-GND i 10 nF przy AREF (nawet jeśli nie jest wyprowadzony – dołącz do VCC).
• Tolerancja ±10 % Uref ogranicza absolutną dokładność bez kalibracji.
• Przy taktowaniu MCU >9,6 MHz prescaler może ustawić się na /128, co obniża szybkość pojedynczej konwersji (~104 µs); rozważ ręczny dobór preskalera.
• Nie każda wersja BASCOM obsługuje słowo Internal1v1
; w starych kompilatorach użyj Config Vref = Int
lub bezpośrednio modyfikuj ADMUX.
• Porównaj stabilność wewnętrznego band-gap z zewnętrznym wzorcem (np. REF192 1,2 V) i oceń wpływ temperatury.
• Sprawdź technikę „differential ADC with gain” dostępną w większych AVR-ach (ATmega) – może zastąpić dzielnik napięciowy.
• Rozważ migrację do nowych mikrokontrolerów AVR-DB lub PIC 16-Fxx, które oferują wbudowane LUT-y kalibracyjne.
Ustawienie wewnętrznego Uref 1,1 V w ATtiny13A sprowadza się do ustawienia REFS0=1 (lub komendy Reference = Internal1v1
) i uruchomienia ADC. Po krótkiej zwłoce odczytuj wartości przez GetAdc()
, przeliczaj je ze wzoru U = ADC * 1.1 / 1023
i kalibruj według zmierzonego rzeczywistego Uref, jeśli potrzebujesz większej precyzji. Dzięki temu uzyskasz pomiary niezależne od wahań VCC w zakresie 0-1,1 V z rozdzielczością ~1 mV.