ATtiny85 cung cấp Flash 8 KB, SRAM 512 byte và sáu chân GPIO có thể sử dụng trong gói 8 chân, rất phù hợp với các thiết kế nhạy cảm về chi phí, nơi không gian bo mạch bị hạn chế và một vi điều khiển đầy đủ tính năng sẽ là quá mức cần thiết. Nó chạy trên điện áp 1.8-5.5 V, bao gồm ADC 10-bit với bốn kênh, và hỗ trợ giao tiếp nối tiếp điều khiển bằng phần mềm thông qua Giao diện Nối tiếp Đa năng. Dưới đây tôi sẽ trình bày về pinout, kiến trúc nội bộ, quy trình lập trình và những đánh đổi quan trọng khi bạn thực sự xây dựng với nó.
Những điểm nổi bật:
- Sáu chân GPIO chia sẻ các chức năng ADC, PWM và nối tiếp; Việc gán chân cẩn thận giúp tránh xung đột tài nguyên trong bố cục thực tế.
- Chân RESET có thể được cấu hình lại thành GPIO thông qua cầu chì, nhưng làm vậy sẽ khóa bạn vào lập trình điện áp cao - lên kế hoạch cho quy trình gỡ lỗi và sản xuất trước khi cam kết.
- USI yêu cầu bit-banging thủ công cho I²C và SPI; Nó hoạt động cho các thiết bị ngoại vi tốc độ thấp nhưng làm tăng độ phức tạp firmware so với các thiết bị ngoại vi phần cứng.
- Độ ổn định của ADC phụ thuộc vào chất lượng nguồn điện và nối đất; Chế độ ngủ giảm nhiễu ADC cải thiện rõ rệt kết quả khi có nhiễu cơ bản.
- GPIO cung cấp nguồn/thu tối đa 40 mA tuyệt đối theo bảng dữ liệu, nhưng hoạt động liên tục trên 20 mA mỗi chân sẽ làm tăng tốc độ suy giảm - luôn đệm các tải dòng điện cao ra ngoài.
Thông số kỹ thuật
| Tham số | Giá trị |
|---|---|
| CPU | AVR RISC 8-bit |
| Điện áp hoạt động | 1.8-5.5 V |
| Bộ nhớ Flash | 8 KB |
| SRAM | 512 byte |
| EEPROM | 512 byte |
| Chân GPIO | 6 |
| ADC | 10-bit, 4 kênh |
| Bộ hẹn giờ | Hai máy 8-bit |
| Tốc độ xung nhịp | Lên đến 20 MHz (bên ngoài), 8 MHz (RC nội bộ, mặc định) |
| Gói | PDIP-8, SOIC-8, TSSOP-8, QFN/MLF-20 |
| Dải nhiệt độ | -40 đến +125 °C |
| Giao diện nối tiếp | USI (có thể cấu hình phần mềm cho SPI hoặc I²C) |
| Phát hiện mất điện nhạt | Có |
| Bộ hẹn giờ Watchdog | Có |

Cấu hình Pin
| Ghim | Chức năng chính | Chức năng thay thế |
|---|---|---|
| 1 | PB5 (ĐẶT LẠI) | PCINT5, ADC0, dW (debugWIRE) |
| 2 | PB3 | PCINT3, XTAL1, CLKI, ADC3 |
| 3 | PB4 | PCINT4, XTAL2, CLKO, ADC2 |
| 4 | GND | Đất |
| 5 | PB0 | MOSI, DI, SDA, AIN0, OC0A, AREF, PCINT0 |
| 6 | PB1 | MISO, DO, AIN1, OC0B, OC1A, PCINT1 |
| 7 | PB2 | SCK, USCK, SCL, ADC1, T0, INT0, PCINT2 |
| 8 | VCC | Nguồn điện |

Mỗi chân GPIO đa kênh ít nhất ba chức năng. Theo kinh nghiệm, xung đột phổ biến nhất là giữa lập trình SPI (sử dụng PB0, PB1, PB2) và các thiết bị ngoại vi ứng dụng trên cùng các chân đó. Nếu mạch ứng dụng của bạn tải nặng các chân đó hoặc giữ chúng ở trạng thái cố định, lập trình của ISP có thể bị lỗi gián đoạn. Việc thêm điện trở nối tiếp (220-470 Ω) giữa ATtiny85 và các thành phần bên ngoài trên các đường SPI cho phép lập trình viên ghi đè mạch ứng dụng trong quá trình tải lên.
Chân 1 mặc định là RESET với pull-up bên trong. Cấu hình là GPIO (PB5) qua cầu chì RSTDISBL sẽ cho bạn thêm một chân I/O, nhưng bạn mất khả năng lập trình lại qua ISP tiêu chuẩn. Sau đó, cần lập trình song song điện áp cao (HVPP), điều này cần một lập trình viên chuyên biệt và làm tăng độ phức tạp cho quy trình sản xuất. Tôi đã thấy các nhóm tắt RESET để lấy chân thứ sáu, chỉ để phát hiện ra rằng cập nhật hiện trường trở nên không khả thi.
Sơ đồ khối và kiến trúc nội bộ

ATtiny85 sử dụng kiến trúc Harvard với Flash riêng biệt 8 KB cho lưu trữ chương trình và 512 byte SRAM cho dữ liệu chạy. Độ bền flash được đánh giá là 10.000 chu kỳ ghi/xóa mỗi trang; EEPROM được đánh giá ở mức 100.000 chu kỳ. Nếu ứng dụng của bạn thường xuyên ghi dữ liệu hiệu chuẩn hoặc ghi nhật ký, bạn sẽ đạt giới hạn EEPROM nhanh hơn mong đợi - phân phối ghi trên nhiều địa chỉ hoặc chuyển sang lưu trữ ngoài để có dữ liệu chu kỳ cao.
Hai bộ hẹn giờ 8-bit (Timer0 và Timer1) tạo ra PWM, đếm các sự kiện bên ngoài và kích hoạt ngắt. Timer0 đơn giản hơn và thường được dùng cho các chức năng PWM cơ bản hoặc độ trễ. Timer1 bao gồm chế độ PLL có thể tạo ra PWM tần số cao (lên đến 64 MHz trên PB1/PB4 với nguồn 5 V), rất hữu ích cho các ứng dụng như tạo sóng mang hồng ngoại hoặc điều chỉnh độ mờ tần số cao.
Bộ đếm thời gian watchdog có thể đặt lại chip nếu firmware bị treo, nhưng nó cũng hoạt động như một bộ hẹn giờ khoảng thời gian tiết kiệm năng lượng khi ở chế độ ngủ. Trong một thiết kế chạy bằng pin, chúng tôi sử dụng watchdog để đánh thức ATtiny85 mỗi 8 giây, đo một cảm biến và quay lại trạng thái ngủ - dẫn đến dòng điện trung bình dưới 10 μA.
Cấu hình nguồn điện và xung nhịp
ATtiny85 được trang bị cầu chì cho bộ dao động RC 8 MHz bên trong chia cho 8, tạo ra xung nhịp thực tế 1 MHz. Mặc định bảo thủ này hoạt động trên toàn bộ dải điện áp nhưng vẫn để lại hiệu suất. Đối với hoạt động 5 V, việc cấu hình lại cầu chì để chạy bộ dao động bên trong ở tốc độ tối đa 8 MHz rất đơn giản và không cần linh kiện bên ngoài.
Khi bạn cần thời gian chính xác - ví dụ như với UART với tốc độ baud tiêu chuẩn hoặc bộ đếm tần số - hiệu chuẩn nhà máy ±10% của bộ dao động bên trong không đủ chặt chẽ. Tinh thể ngoài 16 MHz hoặc 20 MHz cải thiện độ chính xác lên ±50 ppm nhưng bổ sung hai tụ điện và chiếm PB3/PB4. Sự đánh đổi này xứng đáng với các ứng dụng nặng về giao tiếp, nhưng sẽ đau đớn nếu bạn đã bị giới hạn bởi pin.
Phát hiện brown-out (BOD) ngăn CPU thực thi các lệnh không hợp lệ khi điện áp cung cấp giảm. Kích hoạt BOD ở 2,7 V hoặc 4,3 V sẽ thêm khoảng 20-25 μA vào dòng điện ngủ. Đối với thiết kế pin hướng tới giấc ngủ dưới microamp, bạn có thể cần tắt BOD và xử lý điều kiện điện áp thấp trong firmware - chấp nhận rủi ro lỗi thỉnh thoảng khi tắt nguồn.
Đặc điểm GPIO và giới hạn tải
Mỗi chân GPIO có thể cung cấp hoặc hấp thụ tối đa tuyệt đối 40 mA theo bảng dữ liệu của Microchip, nhưng đó là giới hạn phá hủy, không phải thông số vận hành. Dòng điện liên tục được khuyến nghị cho mỗi chân là 20 mA, và tổng dòng điện trên tất cả các chân nên giữ dưới 200 mA để tránh nguy cơ đất bị bật lại bên trong và bị kẹt.
Việc điều khiển đèn LED trực tiếp từ GPIO là điều phổ biến trong các dự án sở thích, nhưng điện áp và dòng điện tiến cần được cân nhắc kỹ lưỡng. Một đèn LED đỏ tiêu chuẩn với độ rơi 2 V tiến ở 20 mA trên nguồn 5 V cần điện trở tối thiểu 150 Ω. Tôi đã từng gỡ lỗi các bo mạch mà ai đó dùng 47 Ω "vì đèn LED quá mờ" - nó hoạt động được vài tiếng, rồi GPIO hỏng vĩnh viễn.
Đối với tải trên 20 mA - động cơ, rơ-le, solenoid hoặc thậm chí đèn LED công suất cao - hãy sử dụng MOSFET hoặc BJT bên ngoài. Một MOSFET kênh N 2N7002 có giá chỉ vài xu và chuyển đổi hàng trăm milliampe một cách sạch sẽ với điện trở cổng 10 kΩ. Cố gắng song song các chân GPIO để tăng dung lượng dòng điện không hiệu quả một cách đáng tin cậy; Sự khác biệt nhỏ về trở kháng chân gây ra chia sẻ dòng điện không đều và có thể gây hư hại.
Vận hành ADC và Quản lý tiếng ồn
ADC 10-bit chuyển đổi 0-VCC (hoặc tham chiếu nội bộ 1.1 V hoặc 2.56 V) thành các giá trị từ 0 đến 1023. Độ phân giải là 10 bit, nhưng số bit hiệu quả (ENOB) trong môi trường nhiễu có thể giảm xuống còn 8 hoặc thậm chí 7 bit nếu bạn không xử lý nhiễu nguồn điện.
Theo kinh nghiệm của tôi, có ba điều cải thiện sự ổn định của xạ thủ:
- Tách tụ gần chip. Tụ điện 100 nF và điện phân 10 μF song song, đặt trong phạm vi 5 mm với chân VCC và GND, cắt giảm nhiễu chuyển mạch tần số cao.
- Chế độ ngủ giảm nhiễu ADC. Dừng CPU trong quá trình chuyển đổi loại bỏ tiếng ồn chuyển đổi kỹ thuật số bên trong chip. Sự khác biệt có thể đo lường được: tôi đã thấy mức độ nhiễu giảm từ ±8 LSB xuống ±2 LSB chỉ bằng cách bật chế độ này.
- Nối đất analog hoặc nối đất sao riêng biệt. Nếu ADC chia sẻ đường về với các tải điều khiển bằng PWM, dòng đất từ PWM sẽ tạo nhiễu vào các phép đo của ADC. Chạy đường nối đất chuyên dụng về nguồn điện để làm tham chiếu ADC cải thiện kết quả rõ rệt.
ADC cũng hỗ trợ chế độ đầu vào vi sai với các độ lợi tùy chọn (1×, 8×, 20×, 32×) trên một số cặp chân nhất định. Điều này hiếm khi được tài liệu trong các hướng dẫn nhưng hoạt động tốt với các tín hiệu vi sai nhỏ như cầu nhiệt điện hoặc cầu cảm biến biến dạng. Độ lợi đi kèm với việc phạm vi đầu vào bị giảm và sai số lệch tăng lên, nên việc hiệu chuẩn trở nên quan trọng.
Giao tiếp nối tiếp qua USI
Giao diện Nối tiếp Toàn cầu (USI) là một khối phần cứng tối thiểu hỗ trợ các giao thức nối tiếp nhưng để phần lớn công việc cho firmware. Nó bao gồm thanh ghi dịch chuyển, bộ đếm và tạo xung nhịp cơ bản - đủ để bit-bang I²C hoặc SPI ở tốc độ thấp đến trung bình.
Khi USI hoạt động tốt:
- Đang nói chuyện với một cảm biến I²C duy nhất ở 100 kHz.
- Điều khiển màn hình SPI hoặc DAC trong đó ATtiny85 luôn là master.
- Tạo mẫu hoặc thiết kế khối lượng thấp nơi độ phức tạp firmware chấp nhận được.
Khi USI trở thành vấn đề:
- Các kịch bản đa master I²C hoặc kéo giãn đồng hồ; USI không xử lý những việc này một cách tự động.
- SPI tốc độ cao trên 1 MHz; Việc điều chỉnh thời gian trở nên khó khăn nếu không có phần cứng chuyên dụng.
- Ứng dụng mà bạn cũng cần UART - không có phần cứng UART, nên bạn cũng sẽ bị bit-bang, tiêu tốn chu kỳ CPU và làm phức tạp thời gian.
Tôi đã từng sử dụng thành công các thư viện I²C dựa trên USI như TinyWireM với các cảm biến như BMP280 và SSD1306 OLED. Nhưng tôi cũng đã dành hàng giờ để gỡ lỗi một trường hợp thiết bị I²C giữ SCL thấp (kéo giãn xung nhịp), mà thư viện không phát hiện được, khiến firmware bị treo. Bài học: hãy thử mã USI với các thiết bị ngoại vi thực tế của bạn sớm, không phải trên bàn làm việc với điều kiện lý tưởng.
Lập trình ATtiny85 với Arduino IDE

Lập trình ATtiny85 qua Arduino IDE đòi hỏi phải thêm định nghĩa bo mạch của bên thứ ba, như ATTinyCore của Spence Konde hoặc gói attiny cũ hơn của David Mellis. Các lõi này ánh xạ các hàm Arduino như 'digitalWrite()' và 'analogRead()' lên phần cứng ATtiny85.
Dây điện cho lập trình ISP:
| Chân ATtiny85 | Tín hiệu Lập trình viên ISP |
|---|---|
| 1 (ĐẶT LẠI) | RESET |
| 5 (PB0) | MOSI |
| 6 (PB1) | MISO |
| 7 (PB2) | SCK |
| 8 (VCC) | +5V (hoặc điện áp mục tiêu) |
| 4 (GND) | GND |
Bạn có thể sử dụng USBtinyISP, USBasp chuyên dụng hoặc bất kỳ bo mạch Arduino nào được cấu hình là "Arduino as ISP." Nếu sử dụng Arduino làm ISP, hãy đặt tụ 10 μF giữa RESET và GND trên Arduino để ngăn nó bị đặt lại khi tải lên.
Cài đặt bo mạch quan trọng:
- Chọn tốc độ xung nhịp chính xác (1 MHz, 8 MHz bên trong, hoặc 16 MHz bên ngoài).
- Chọn "Burn Bootloader" một lần để ghi cài đặt cầu chì - bước này không cài đặt bootloader (ATtiny85 không sử dụng), nhưng sẽ cấu hình cầu chì để phù hợp với đồng hồ bạn chọn.
- Sau khi thiết lập cầu chì, tải lên bản phác thảo qua "Phác thảo > Tải lên bằng Lập trình viên" hoặc đặt lập trình viên làm mặc định trong phần tùy chọn.
Số pin Arduino không khớp trực tiếp với pin vật lý. Ví dụ, chân số Arduino 0 tương ứng với PB0 (chân vật lý 5), và chân số Arduino 2 là PB2 (chân vật lý 7). Kiểm tra tài liệu lõi hoặc sơ đồ chân trước khi đi dây.
Mạch làm việc tối thiểu

Một mạch tối thiểu chỉ cần:
- VCC (chân 8) kết nối với nguồn 3.3 V hoặc 5 V.
- GND (chân 4) nối đất.
- Một tụ gốm 100 nF nằm giữa VCC và GND, đặt gần IC.
- Tùy chọn, một điện trở kéo lên 10 kΩ ở chế độ RESET (chân 1) nếu nguồn của bạn bị nhiễu - mặc dù điện trở kéo lên bên trong thường là đủ.
Một đèn LED với điện trở giới hạn dòng điện (220-470 Ω cho 5 V, tối thiểu 150 Ω cho 3.3 V) kết nối với PB0 (chân 5) cung cấp phản hồi hình ảnh. Bộ dao động RC 8 MHz bên trong chạy mặc định, nên không cần tinh thể ngoài.
Thiết lập này hoạt động ổn định cho các bài kiểm tra nhấp nháy, thử nghiệm PWM và phát triển firmware ban đầu. Đối với các ứng dụng sản xuất hoặc nhạy cảm với tiếng ồn, hãy thêm tụ điện số lượng lớn 10 μF song song với gốm 100 nF để xử lý các yêu cầu dòng điện thoáng qua.
Các vấn đề phổ biến và cách khắc phục thực tế
| Vấn đề | Nguyên nhân gốc rễ | Giải pháp |
|---|---|---|
| Tải lên của ISP thất bại với "chữ ký thiết bị không khớp" | Chọn sai chip trong IDE, hoặc cầu chì được đặt ở xung nhịp ngoài mà không có tinh thể | Xác minh lựa chọn bảng điều khiển; nếu cầu chì bị lỗi, hãy kết nối tín hiệu xung nhịp bên ngoài vào PB3 hoặc sử dụng HVPP để khôi phục |
| Chỉ số xạ thủ dao động hoặc nhảy ngẫu nhiên | Nhiễu nguồn điện, thiếu tụ ngắt kết nối, hoặc nối đất kém | Thêm tách 100 nF + 10 μF gần VCC/GND; bật chế độ Giảm Tiếng ồn ADC; Đường dẫn đất analog và kỹ thuật số riêng biệt |
| Giao tiếp I²C/SPI gián đoạn | Thời gian USI không chính xác, tốc độ xung nhịp không khớp, hoặc thiếu pull-ups ngoài (I²C) | Kiểm tra lại lựa chọn đồng hồ và thiết lập cầu chì; thêm 4,7 kΩ pull-up vào SDA/SCL để I²C; giảm tốc độ bus trong firmware |
| Chân GPIO ngừng phản hồi sau nhiều giờ chạy | Chân được điều khiển vượt quá giới hạn dòng điện hoặc bị tăng áp | Kiểm tra giá trị điện trở LED; đệm tải dòng cao với MOSFET; thêm bảo vệ tạm thời (diode hoặc TV) nếu chân kết nối với cáp ngoài |
| Mã chạy sai tốc độ hoặc thời gian không đúng | Cài đặt cầu chì xung nhịp không khớp với lựa chọn bo mạch Arduino IDE | Đốt bootloader (đặt cầu chì) sau khi thay đổi cài đặt xung nhịp; Xác minh tần số xung nhịp thực tế bằng bộ phân tích phạm vi hoặc logic |
Khi cầu chì RESET vô tình bị vô hiệu hóa:
Nếu bạn đặt cầu chì RSTDISBL và mất quyền truy cập ISP, lập trình viên tiêu chuẩn sẽ không hoạt động. Bạn cần một bộ lập trình song song điện áp cao (HVPP) như AVR Dragon (đã ngừng sản xuất nhưng có sẵn đã qua sử dụng) hoặc các thiết kế mã nguồn mở dựa trên Arduino. Điều này áp dụng 12 V cho chân RESET trong khi giữ các chân cụ thể ở trạng thái xác định, buộc chip chuyển sang chế độ lập trình bất kể cài đặt cầu chì. Nó có thể phục hồi được, nhưng gây phiền toái và tốn thời gian.
Khi nào nên sử dụng ATtiny85 (và khi nào không nên dùng)
Vừa vặn tốt:
- Các tác vụ điều khiển đơn giản: trình điều khiển LED, đầu đọc cảm biến, màn hình nhỏ.
- Thiết kế hạn chế không gian, trong đó gói 8 chân tiết kiệm diện tích bo mạch.
- Ứng dụng chạy bằng pin tận dụng chế độ ngủ (xuống đến ~0,1 μA khi tắt nguồn khi tắt watchdog).
- Thiết kế nhạy cảm với chi phí, nơi từng đồng xu trên mỗi đơn vị đều quan trọng khi sản xuất sản lượng.
Không vừa vặn:
- Ứng dụng yêu cầu nhiều thiết bị ngoại vi nối tiếp cùng lúc (UART + SPI + I²C) - độ phức tạp firmware tăng vọt.
- Yêu cầu giao tiếp tốc độ cao hoặc thời gian chặt chẽ - bị giới hạn bởi USI và thực thi một luồng.
- Các dự án mà tốc độ phát triển quan trọng hơn chi phí; chuyển sang ATmega328P hoặc STM32 sẽ mang lại cho bạn phần cứng UART, SPI, I²C và ít phiền toái hơn.
Tôi đã sử dụng ATtiny85 thành công trong các bộ điều khiển đèn LED, màn hình pin và bộ thu từ xa hồng ngoại. Nhưng tôi cũng đã bỏ dở giữa dự án khi yêu cầu mở rộng bao gồm cổng gỡ lỗi UART và ghi nhật ký flash SPI - những thứ đơn giản trên chip lớn hơn nhưng lại gây khó chịu trên ATtiny85.
Kết luận
ATtiny85 vẫn phù hợp với các thiết kế mà kích thước, chi phí và sức mạnh là những giới hạn chính, trong khi chức năng vẫn nằm trong giới hạn rõ ràng của nó. Sáu chân GPIO với các chức năng chia sẻ đòi hỏi phải gán chân cẩn thận, và USI điều khiển bằng phần mềm đòi hỏi nhiều công sức firmware hơn so với các thiết bị ngoại vi phần cứng. Hiệu suất ADC phụ thuộc nhiều vào thiết kế nguồn điện, và giới hạn dòng điện GPIO là có thật - vượt quá thì chân sẽ hỏng vĩnh viễn.
Hiểu rõ các thiết lập cầu chì, đánh đổi chốt RESET và quy trình lập trình của ISP trước khi cam kết thiết kế giúp tránh những bất ngờ tốn kém ở giai đoạn cuối. Với ứng dụng phù hợp, ATtiny85 mang lại khả năng điều khiển đáng tin cậy với diện tích tối thiểu. Đối với những vấn đề phức tạp hơn, hãy đánh giá xem gánh nặng firmware và giới hạn phần cứng có vượt trội hơn tiết kiệm chi phí hay không.