jak podłączyć potencjometr do Attiny2313
Kluczowe punkty:
• Rozwiązanie 1 = największa dokładność, najmniej problemów, ale wymaga układu scalonego i kilku pinów.
• Rozwiązanie 2 = najtańsze, wystarczy 1 kondensator, ale mniejsza precyzja i konieczność kalibracji.
• Rozwiązanie 3 = detekcja progowa lub iteracyjna, kompromis pomiędzy 1 i 2.
• Układ MCP3008 (10-bit, 8 kanałów, 5 V) – obsługa po SPI.
• Schemat połączeń:
ATtiny2313 MCP3008
----------- ----------
PB7 (SCK) <--> CLK
PB5 (MOSI) <--> DIN
PB6 (MISO) <--> DOUT
PB4 (dow.) <--> CS
VCC --> VDD, VREF
GND --> DGND, AGND
Potencjometr:
skrajny 1 -> GND
skrajny 2 -> VCC
suwak -> CH0
• Kod (avr-gcc, wycinek inicjalizacji SPI, tryb master 500 kHz):
void spi_init(void) {
DDRB |= (1<<PB5)|(1<<PB7)|(1<<PB4); // MOSI, SCK, CS jako wyjścia
DDRB &= ~(1<<PB6); // MISO jako wejście
SPCR = (1<<SPE)|(1<<MSTR); // SPI włączone, master
SPSR = (1<<SPI2X); // f_SCK = f_CPU/4
}
uint16_t mcp3008_read(uint8_t ch) {
PORTB &= ~(1<<PB4); // CS = 0
SPDR = 0b00000001; while(!(SPSR & (1<<SPIF)));
SPDR = (0b1000 | ch) << 4; while(!(SPSR & (1<<SPIF)));
uint8_t high = SPDR;
SPDR = 0x00; while(!(SPSR & (1<<SPIF)));
uint8_t low = SPDR;
PORTB |= (1<<PB4); // CS = 1
return ((high & 0x03) << 8) | low; // 10-bit
}
• Zalety: 10–12 bit, powtarzalność, możliwość wielu kanałów, prosta kalibracja.
• Wady: koszt ~10 zł, 4 piny SPI (można zbić do 3 używając sprzętowego SS jako CS).
• Teoria: stała czasowa \(\tau = R \cdot C\). Dla kondensatora \(C=100 nF\) i potencjometru 10 kΩ \(\tau \approx 1 ms\).
• Schemat (1 pin):
PB0 <--+--- suwak potencjometru
|
+---||--- GND C = 100 nF
potencjometr: 5V – suwak – GND (klasyczny dzielnik)
• Algorytm:
• Dokładność ~6–8 bit po filtracji medianowej.
• Zależność od temperatury, VCC oraz tolerancji \(C\). Należy wykonać kalibrację przy starcie (min/max).
• ATtiny2313 ma wejścia AIN0 (PB0) i AIN1 (PB1).
• Budujemy odniesienie Vref = VCC/2 (dzielnik 2×10 kΩ) na PB1.
• Potencjometr (suwak) na PB0.
• Procedura SAR-like:
• Regulacja kontrastu LCD, prędkości wentylatora PWM, proste nastawy analogowe – tu wystarczy podłączyć skrajne piny do VCC/GND, suwak do wejścia docelowego układu (nie do ATtiny).
• Nowe mikrokontrolery tinyAVR-1-series (ATtiny1614/1616/1624/1626) mają już 10-/12-bitowe ADC i są piny-kompatybilne w obudowie SOIC-14 lub TQFP-20 – często taniej niż ATtiny2313A, więc w nowych projektach rozważa się migrację.
• Coraz popularniejsze stają się kompaktowe 12-bitowe ADC w obudowach SOT-23 (np. MCP3221 – I²C, 1 kanał) – zajmują 1 pin SDA + 1 SCL.
• W hobbystycznych projektach Arduino-kompatybilnych dla tiny2313 często używa się biblioteki „TinyADC” implementującej metodę RC z autokalibracją.
• Próg logiczny wejścia CMOS \(\approx 0{,}6}\,V_{CC}\) przy temperaturze 25 °C, dlatego czas ładowania mierzony w metodzie RC odpowiada napięciu ≈3 V (dla 5 V zasilania). Jeśli chcesz liniowość, licznik możesz przeliczyć wzorem:
\[
R = -\frac{t}{C \cdot \ln!\left(1-\frac{V{\text{TH}}}{V{CC}}\right)}
\]
• Przy metodzie RC dodaj rezystor szeregowy 1 kΩ z pinem, aby chronić mikrokontroler, jeśli przypadkowo ustawisz pin OUT-HIGH podczas rozładowania.
• Brak szczególnych implikacji prawnych; pamiętaj jedynie o zgodności z normą EMC, jeśli projekt trafia na rynek.
• W systemach bezpieczeństwa (np. medycznych) metoda RC jest niewystarczająco pewna – należy stosować klasyczny ADC o udokumentowanej dokładności.
• Metoda RC przy 5 V i kondensatorze ceramicznym klasy X7R może dryfować o kilka % przy zmianie temperatury o 40 °C.
• Wielokanałowy odczyt RC wymaga multipleksowania – sumaryczny czas pomiaru rośnie liniowo z liczbą kanałów.
• Niektóre wersje ATtiny2313 (oznaczenie ATtiny2313V) mają ograniczone f_CPU do 10 MHz – przy niskich taktowaniach timer może mieć zbyt małą rozdzielczość dla RC, dobierz większy kondensator (220 nF).
• Porównaj nieliniowość metod RC i komparatora w funkcji temperatury – przydatne do projektów czujnikowych.
• Rozważ zastosowanie cyfrowego potencjometru (np. MCP41010) zamiast analogowego + ADC – uprościsz kalibrację.
• Jeśli projekt wymaga niskiego poboru mocy, zbadaj techniki Burst-Mode odczytu ADC oraz uśpienia MCP3008 między próbkami.
ATtiny2313 nie mierzy napięcia analogowego sam z siebie, dlatego:
• Chcesz dokładnie? – dołóż zewnętrzny ADC (MCP3008/ADS1115).
• Chcesz tanio i prosto? – zastosuj pomiar czasu ładowania RC, wystarczy kondensator i timer.
• Chcesz tylko próg lub histerezę? – wykorzystaj wbudowany komparator z prostym dzielnikiem napięcia.
Dobór metody zależy od wymagań dokładności, budżetu i dostępnych pinów. Jeśli potrzebujesz gotowego kodu lub pomocy przy konkretnej aplikacji – daj znać.