Интерфейсы: аналоговый, I2C, SPI
Урок-обзор: какими способами датчик отдаёт показания контроллеру.
Интерфейс датчика — способ передачи показаний: либо аналоговым напряжением (через АЦП), либо цифровым кодом по шине (I2C, SPI).
Датчик мало измерить — результат нужно доставить контроллеру. Старые и простые датчики отдают аналоговое напряжение, которое вы сами оцифровываете. Современные содержат АЦП внутри и отдают готовые числа по цифровой шине. Разберём три самых ходовых варианта без кода — это про архитектуру.
Аналоговый выход
Датчик выдаёт напряжение, пропорциональное величине; вы заводите его на вход АЦП микроконтроллера и пересчитываете код в величину (разделы 3–4). Просто и дёшево, но провод ловит наводки, а точность ограничена вашим АЦП и опорным напряжением. Подходит для одного-двух близких датчиков.
I2C: две линии, много устройств
I2C — последовательная шина из двух проводов: SDA (данные) и SCL (тактирование). На одной паре проводов висят десятки устройств, каждое со своим адресом. Контроллер (master) обращается по адресу, устройство (slave) отвечает.
| Свойство | I2C |
| Проводов данных | 2 (SDA + SCL) |
| Адресация | по адресу устройства |
| Скорость | обычно 100–400 кбит/с |
| Плюс | много датчиков на двух проводах |
| Минус | медленнее SPI, нужны подтягивающие резисторы |
SPI: быстрее, но больше проводов
SPI — тоже последовательная шина, но с отдельными линиями: MOSI и MISO (данные в обе стороны), SCLK (такт) и отдельный сигнал выбора CS на каждое устройство. Нет адресации — вместо неё выбор устройства ножкой CS.
| Свойство | SPI |
| Проводов | 3 общих + по CS на устройство |
| Скорость | единицы–десятки Мбит/с |
| Выбор устройства | отдельной линией CS |
| Плюс | быстро, полнодуплексно |
| Минус | много проводов при многих устройствах |
Как работает под капотом
Цифровые шины переносят уже оцифрованное число, поэтому невосприимчивы к наводкам так, как аналоговый провод: помеха либо исказит бит (и это заметит контрольная сумма), либо нет. I2C экономит проводá ценой скорости и удобен, когда датчиков много, а данных мало (температура, давление). SPI выбирают, когда нужен поток данных побыстрее (дисплеи, быстрые АЦП, IMU с высокой частотой). Выбор интерфейса — это компромисс между числом проводов, скоростью и количеством устройств на шине.
Частые ошибки
- Вешать два устройства с одинаковым адресом на одну шину I2C — конфликт.
- Забыть подтягивающие резисторы на линиях I2C — шина не заработает.
- Гонять длинный аналоговый провод рядом с силовыми линиями — наводки испортят показания.
Итог
- Аналоговый выход прост, но чувствителен к наводкам и ограничен вашим АЦП.
- I2C — две линии и адресация, много датчиков на одной шине, но небыстро.
- SPI — быстрее и полнодуплексно, но требует отдельной линии выбора на каждое устройство.