КПК (Карманный Путевой Компьютер): Схемотехника GPS логгера

Мой хобби проект — это GPS логгер. В комментариях даже предложили называть его «Путевой компьютер», т.к. логгирование это только небольшая часть всех возможностей устройства. Многое уже реализовано, но бОльшую часть еще только предстоит сделать.

В прошлых статьях я описывал переход с ардуино на STM32, STMCube/HAL, немного рассуждал про билд систему, бутлоадер, строил композитное USB устройство и прокачивал его скорость. Все это делалось на макетке на основе платы Blue Pill STM32F103CB и ежика из проводов. Пора устройству обрести форму, как электронную (схему), так и физическую (корпус).

0gettjt59u77r2mjpz73hyfn7sc.jpeg

Вопросы, которые мне предстояло решить на этом этапе очень сильно взаимосвязаны. Выбирая компоненты для проекта нужно примерно представлять в какой корпус их можно затолкать. И наоборот корпус нужно делать под компоненты, которые есть в наличии и платы, которые, опять же, нужно делать с прицелом на корпус. В общем клубок взаимосвязанных вопросов. Можно, конечно, взять коробку побольше и натолкать туда все что угодно, но ведь хотелось что нибудь компактное и легкое.

Прежде чем начать сразу хочу отметить, что это не финальный вариант устройства. Скорее всего в схеме найдутся ошибки, что-нибудь будет работать не так как задумано, в комментариях укажут на более правильные решения, какие-то подходы будут переосмыслены. Я думаю что второй или даже третьей версии устройства не избежать. Поэтому буду рад Вашим конструктивным комментариям.

Под катом многабукав, но будет инженерненько.

Компоненты


Начнем, пожалуй, с компонентов и периферии. По пути заодно прикинем количество ног микроконтроллера, которые потребуются для подключения этого зоопарка, а также параметры питания.

  • Основным компонентом GPS логгера, разумеется, будет GPS приемник. В моем случае это довольно навороченный Beitian BN-880 на базе микросхемы UBlox M8N. В модуле встроен также компас на микросхеме HMC5883L.

    Подключение: 2 контакта UART для GPS и 2 контакта I2C для компаса
    Питание: от 2.7В
    Потребление: 50 мА

    • Также заказал модуль Beitial BN-220. В нем нет компаса, но зато антенна более компактная (20×20 мм против 30×30). Правда пока неясно как это скажется на качестве приема. Нужно тестировать. Зато, судя по даташиту, этот модуль может работать от 1.4В, что должно позитивно сказаться на времени работы устройства.
    • Тут на самом деле все как-то мутно. Вроде бы BN-880 построен на базе UBlox M8N, тогда как BN-220 на базе U-blox M8030-KT. Но в некоторых источниках проскакивает что это, вроде бы, одно и тоже. Точнее M8N это модуль, а M8030-KT это чипсет внутри. Меня же в этой неразберихе волнует вопрос питания — M8N заявлен от 2.7В, тогда как M8030-KT от 1.4В.
    • В качестве альтернативы у меня также валяется модуль SIM868. в котором на борту помимо GPS есть ещё GSM/GPRS модуль и Bluetooth. Пока пугает своей навороченностью и сложностью подключения. Нужно будет сначала с отладочной платой поиграться.
  • Основным отличием устройства от «просто черного ящика» является наличие дисплея. В первых прототипах я подключал дисплей по I2C, но загрузка шины получалась около 25%. Но дело даже не в процентном соотношении, а в том, что пересылка экранного буфера занимает около 25 мс, во время которых нельзя общаться с другими устройствами на шине. Это может быть проблемой, поэтому нужно либо выносить дисплей на отдельную шину I2C, или рассмотреть вариант подключения по SPI

    Подключение: 2 провода I2C или 3 провода SPI (дисплей write-only, поэтому линия MISO не используется, зато используется отдельный сигнал Data/Command)
    Питание: от 3В
    Потребление: 25 мА

  • Для управления устройством у меня будут использоваться 2 кнопки, которые занимают 2 ноги процессора, соответственно
  • В оригинальном устройстве (Holux M241, с которого я изначально копировал функционал) нельзя было посмотреть трек в произвольный момент времени. Нужно было обязательно подключать устройство к компьютеру и сливать данные специальной программой. Как мне кажется, возможность посмотреть трек на мобильном телефоне или планшете в любой момент будет весьма востребована. Для этого я приобрел Bluetooth модуль HM-13. Этот модуль выбран потому, что он умеет SPP в добавок к BLE.

    Подключение: 2 провода UART, 1 провод статуса (подключено/не подключено)
    Питание: 2.5V — 3.9V
    Потребление: 50 мА (хотя тут же рядом в даташите приводится цифра 13 мА. Возможно это пиковое и среднее значение)

  • Как мне подсказали, нет смысла держать приемник включенным, если ты просто присел отдохнуть или зашел пообедать в кафе. Поэтому я решил добавить акселерометр MMA8452 и по нему определять находится ли устройство в состоянии покоя или мы куда-то движемся.

    Подключение: 2 провода I2C, 1 провод на прерывание
    Питание от 2В до 3.6В с каким-то микроскопическим потреблением

  • GPS трек будет записываться на SD карту. Я уже пробовал использовать карту в режиме SPI и это, мягко говоря, медленно. Особенно на запись. Правильный режим для SD карты — SDIO

    Подключение: 6 проводов
    Питание: от 1.8В
    Потребление неизвестно, но думаю не больше 20 мА

  • Для экономии электроэнергии есть смысл отключать питание тех устройств, которые в данный момент не используются. Так возле каждого потребителя я поставлю по транзистору, которым буду управлять отдельным сигналом микроконтроллера

    Подключение: 5 сигналов, по одной ноге на потребителя (GPS, Bluetooth, акселерометр, SD карта, дисплей)

  • Двухцветный светодиод для отображения статуса (как же без моргающего светодиода?). Можно было бы и трехцветный поставить, но пока не вижу необходимости.

    Подключение: 2 контакта
    Потребление: 10 мА

  • Помимо Блютуса будет реализован более классический механизм сливания треков — через USB. Для этого будет задействовано 4 линии — дифференциальная пара для данных, 1 пин для детектирования, что устройство воткнули в USB, и еще один пин для логического подключения (зачем нужны эти 2 пина я расскажу ниже)
  • Аппетит приходит во время еды. Раз уж я начал в свое устройство мечты пихать все подряд, то почему бы не добавить пищалку? Ну или вибромотор. Пока не придумал юзкейс.

    Подключение: 1 провод

  • Устройство еще нужно будет запитать. Пока на меня смотрит микросхема PT1502 в качестве зарядника литиевой батареи и контроллера питания. Для связи с микросхемой нужно будет задействовать 2 провода: один для управления питанием, другой для сигнала о севшей батарее. Еще ради интереса можно будет измерять напряжение батареи с помощью еще одной линии.
  • Разумеется, заряд литиевого аккумулятора неправильно измерять исходя из напряжения. Поэтому я добавил специальную микросхему-счетчик INA219

    Напряжение питания: 3–5В, рекомендуют 3.3В
    Подключение: 2 провода I2C

    Как будет видно ниже напряжение питания в 3В создает некоторый дискомфорт в подключении. Я бы предпочел, чтобы микросхема-счетчик питалась от 2.7В или ниже. Но перебрав несколько вариантов исходя из цены/корпуса/доступности я так и не нашел ничего на 2.7В. Буду благодарен за подсказку.

  • Осталось только предусмотреть отладочный интерфейс SWD (3 провода) и отладочный UART (еще 2 провода)

Меня всегда интересовал вопрос, а зачем нужны контроллеры с большим количеством портов, а сам с легкостью насчитал 39 лап, нужных для моего функционала. И это не считая кварцев, ресета, и питания. Причем есть идеи чем занять еще с десяток (например, дисплей можно было бы подключать через параллельный интерфейс Intel 8080 или Motorola 6800).

Можно, конечно, I2C port externder«ы прикрутить, чтобы уменьшить количество используемых ног. Но во-первых это дополнительные компоненты на плате, во-вторых сильно усложняется программная часть, а в-третьих все равно в маленьких микроконтроллерах мало памяти, а там где памяти достаточно, там и портов тоже хватает. Так что не вижу смысла все усложнять — пусть будет 39 линий.

Питание


С напряжением питания пока не все так ясно. Можно, наверное, все устройства запитать от 3.3В и на этом успокоиться. Но мы же, все таки, мобильное устройство собрались делать, а значит нужно подумать об экономии электроэнергии. А значит нужно постараться выбрать напряжение питания поменьше. Чуть ниже я прикину какой именно экономии можно попробовать добиться.

Вот данные по всем устройствам в табличке — в таком виде удобнее выбирать домен питания к которому подключать то или иное устройство.


Из таблички легко видеть, что часть устройств могут работать от достаточно низких напряжений (от 1.8В). Другие могут комфортно работать от 2.7В. Наконец, оставшиеся устройства ниже 3В работать не могут. Пищалке, по хорошему, вообще 5В нужно, но у меня она будет питаться от самого большого напряжения — от батарейки, сколько бы на ней ни было.

С питанием дисплея пока не до конца понятно. В описании дисплейных модулей с али указан диапазон 3 — 5В, тогда как в даташите на контроллер матрицы SSD1309 указан диапазон 1.65 — 3.3В. Я предполагаю, что 3В нужно чтобы раскачать повышающий преобразователь на плате дисплейного модуля, тогда как логике достаточно 1.65В. Как будет видно из рассуждений про компоновку есть смысл отказаться от дисплейного модуля и подключить дисплей напрямую, что позволит запитать дисплей от домена 2В.

Примерно такие же рассуждения у меня и про GPS — в разных источниках указано разное напряжение питания. Пока у меня нет понимания какой модуль я буду использовать в итоге, потому пускай приемник поболтается в домене 2.7В.

С SD картой вообще не ясно. Спецификация мутно говорит о том, что вообще-то карта должна питаться от 3.3В, но современные карты достаточно умны и могут понять, что их воткнули в низковольтное устройство и могут переключиться на питание от 1.8В. Но механизм выбора питания до конца не очень понятный. Запитаю я карту от 2В и посмотрим что выйдет. Не получится — будет работать от 3В.

Итак, вырисовывается 4 шины питания — 2В, 2.7В, 3В и батарейка. Хотелось бы всех жрущих и постоянно работающих потребителей (а это контроллер и GPS) посадить на самую низковольтовую шину, но на данный момент я пока не определился с модулем GPS (а значит и с его питанием — 2 или 2.7В), а значит нужно будет некое универсальное решение. Попробую развести плату так, чтобы можно было легко либо одно, либо другое напряжение подать.

Откуда же взять столько разных напряжений? Еще на ранних этапах проекта я присмотрел микросхемку PT1502 даже уже успел попробовать в другом проекте. Помимо заряднинка для литиевой батареи в этой микросхеме есть аж 3 источника питания — один импульсный и 2 линейных понижатора. Вот, правда, на одном из них не регулируется напряжение и составляет 3В — попробую от него запитать INA219. Оставшиеся 2 источника питания проблемы не составляет, т.к. там напряжение можно выбирать.

Прикинуть потребление пока не очень получается. В даташитах указано пиковое потребление — этого достаточно, чтобы рассчитать мощность ключевых транзисторов, но недостаточно, чтобы прикинуть необходимую емкость батареи. Так что пока батарею буду подбирать исходя из доступного места в корпусе, а там уже измерю реальное потребление.

Может возникнуть вопрос, а как согласовывать устройства с разным рабочим напряжением? Давайте разбираться.

  • Все коммуникационные ноги микроконтроллеры отмечены как Five Volt Tolerant (кроме UART2 на ножках PA2/PA3), а значит если там появится 3.3В от самого высоковольтного устройства ничего плохого не произойдет
  • Акселерометр хотя и запитывается от 2В, может быть потенциально подключен параллельно с высоковольтными устройствами на шине. Эта проблема легко решается — у микросхемы MMA8452Q можно отдельно запитать коммуникационные выводы от другого питания (по самому «высоковольтному» устройству на шине)
  • SD карту попробую запитать от того же напряжения, что и микроконтроллер, а значит ничего согласовывать не нужно.
  • GPS и Bluetooth должны без проблем скушать «низкое» напряжение от микроконтроллера. Тоже самое касается и других «высоковольтных» устройств

Наконец, пару слов о том, зачем же я так борюсь за понижение напряжения питания. Фишка в импульсном DC-DC преобразователе, который может обменять вольты на амперы (если не брать во внимание потери самого преобразователя, разумеется). Если быть точнее, то обменять более высокое напряжение с низким током на низкое напряжение и более высоким током. Нас в данном случае больше интересует обратные рассуждения — если запитать низковольтную нагрузку через DC-DC, то потребляемый ток этой всей конструкции вместе с преобразователем будет ниже, чем потребляемый ток самой нагрузки. Ну, а поскольку емкость батареи измеряется в мАч, то уменьшение потребляемого тока приведет увеличению времени автономной работы.

Посчитаем?
Один знакомый предположил, что поскольку КПД преобразователя как правило около 90%, то вполне возможно усложнение схемы в виде DC-DC себя не окупит и можно обойтись обычной КРЕНкой. Давайте прикинем. Я провел пару ооочень грубых рассчетов, чтобы понять, а действительно ли DC-DC преобразователь тут уместен.

Вот табличка с расчетами. Пускай батарейка 900 мАч линейно разряжается с 4.1 до 3.5В (что в общем случае не соответствует истине). КПД DC-DC преобразователя я поставил 90% (среднее значение из даташита). Разряжать будем током 100 мА. Я хотел сравнить время работы устройства от линейного источника питания с импульсным.

Очевидно, что линейный источник разрядит батарею 900 мАч током 100 мА за 9 часов. А вот с импульсным источником устройство протянет гораздо дольше — 9.3 часа при целевом напряжении 3.3В, 11.4 часа при 2.7В, и целых 15 часов при напряжении 2В. Разумеется, расчеты ну оооочень грубые, но даже так видно, что с импульсным источником долгоживучесть аккумулятора существенно возрастает.

Микроконтроллер


К вопросу выбора микроконтроллера я подошел вдумчиво — долго игрался с конфигуратором, взвешивая все за и против каждого из вариантов. Мне очень понравились микроконтроллеры STM32, поэтому смотреть в сторону других контроллеров без особой необходимости не вижу смысла. Тем более что в линейке STM32 есть контроллеры на любой вкус и под любую периферию. Опыт полученный на предыдущих этапах моего проекта позволяет сузить выбор контроллера исходя из списка периферии, уже написанной программной обвязки, а также возможностей, которые я бы хотел реализовать в будущем.

Так, совершенно очевидно, что 20 кб памяти моего STM32F103CB однозначно мало — очень не хватает буферов приличного размера для общения SD картой и USB. Многое из задуманного функционала я еще даже не начинал реализовывать, а занято уже больше 19 кб. А вот с мощи для обработки, как оказалось, особо то и не нужно. Если все общение с периферией затолкать в DMA, то на долю центрального процессора остается всего пару процентов.

Прикинув список того, что мне нужно от контроллера я насчитал следующее:

  • >= 128 кб флеша (сейчас занято около 50к)
  • >= 40 кб памяти (сейчас занято 19к)
  • >= 40 ног GPIO (см. рассуждения выше)
  • >= 40МГц (особо много не нужно, главное чтобы потребление было поменьше)
  • DMA (уж больно понравилось)
  • >= 2x I2C, >= 3x UART, >= 1 SPI
  • SDIO (флешка через SPI работает очень медленно)
  • Честный USB Full Speed, лучше High Speed
  • Доступность (возможность купить пару штук за адекватную цену)
  • Из пожеланий еще нативная поддержка параллельных LCD интерфейсов (обычно реализуется в виде модуля доступа к внешней памяти FSMC)


Микроконтроллеров у STMicroelectornics просто пруд пруди — на любой вкус, цвет и кошелек. Сначала я пробовал при выборе контроллера исходить из серии. Линейки L0 и F0 слишком слабые и мало памяти, S7 и H7 наоборот слишком навороченные, в L4 нет SDIO (UPD: SDIO есть, просто они его не упомянули на титульной странице серии). Среди остальных серий можно подобрать что нибудь исходя из моих нужд, благо у меня нет особо специфичных требований.

Серия STM32WB подкупает наличием Bluetooth, но корпус VFQFPN68 несколько охлаждает желание использовать его в хобби проектах. Да и в розничной продаже таких контроллеров не нашел.

Я целился на корпус LQFP64 — достаточный по количеству ног, но при этом не очень большой и можно запаять в домашних условиях. Хорошо, что есть конфигуратор CubeMX в котором можно фильтрами выбрать то, что нужно.

Остановил свой выбор на контроллере STM32F103RB по трем причинам. Во-первых я уже хорошо изучил серию F103 на примере платы Blue Pill. В целом контроллер STM32F103CB меня полностью устраивал, только памяти было маловато. Во-вторых у меня уже есть бутлоадер и низкоуровневый код по этот контроллер, тогда как под другие придется переделывать. Ну и в-третьих, примерно год назад я на радостях уже купил 3шт STM32F103RB. Тогда я не делал детальное исследование доступных контроллеров, а просто подобрал контроллер потолще из линейки F103. Не выкидывать же его теперь :)

Как я уже отметил, у меня нет особо специфичных требований по периферии или производительности. Но если упрусь во что нибудь, то на примете у меня уже есть контроллеры из линейки F4 (если понадобится что нибудь помощнее), или L152RD, если нужно будет что нибудь с потреблением решать (UPD: еще L433RC присмотрел). Что радует, у STM32 почти все контроллеры pin-to-pin совместимы, и F4 и L1/L4 можно будет впаять практически без переделки платы. Можно даже несколько плат с разными МК собрать и сравнивать потребление.

Пару слов про корпус и компоновку


С деталюшками определились. Пора рисовать схему, потом трассировать плату, а потом пытаться уместить ее в корпус. Или нет? Признаться я сначала как раз и пошел этим путем, но потом пришел к выводу, что все нужно делать в обратном порядке. Ну или как минимум одновременно.

Я бы хотел получить компактное устройство. А для этого нужно точно понимать размер доступного пространства, чтобы в свою очередь понимать где расположить плату и ее размер, батарею какого размера можно будет уместить, где расставлять кнопки, экран, разъем USB и другие внешние компоненты, а также прикинуть как крепить компоненты и можно ли удобно проложить провода между ними. Начинать разводить плату без понимания всех этих штук попросту бессмысленно. Вот и получается, что нужно сначала заняться корпусом и компоновкой, а потом уже переходить к схеме.

Также в процессе рисования корпуса мне несколько раз пришлось пересматривать выбор компонентов. Так изначально я думал использовать дешевый дисплей 128×64 размером 0.96» (размер рабочей области 21.7×11.2 мм), но этот дисплей выглядел совершенно микроскопическим на фоне корпуса гораздо большего размера. Далее был заказан дисплей 1.3» (рабочая область 29.4×14.7 мм), но существенно лучше не стало. Далее я обзавелся дисплеем 1.54» (35×17.5 мм) — с ним выглядит более-менее нормально. На данный момент это основной рабочий вариант.

По прикидкам лучше смотрелся бы дисплей 1.8»-2», но эти уже идут цветные и бОльшего разрешения, а соответственно экранный буфер будет достаточно большим для моего контроллера (35 кб вместо 1 кб). Ну и с впихиванием больших дисплеев в корпус также могут быть проблемы, т.к. посадочные крепления у таких модулей существенно больше чем активная область дисплея.

Пока я писал эту статью на али появились монохромные дисплеи 2.42» с тем же разрешением (128×64) и точно такой же обвязкой как у 1.54». Заказал себе на пробу такой — есть шанс воткнуть его в мой корпус без существенного увеличения устройства.

Еще одним существенным моментом на этапе работы над корпусом стало понимание, что покупной дисплейный модуль занимает слишком много места и существенно уменьшает пространство для основной платы. Поэтому я решил отказаться от готового дисплейного модуля, а вместо этого поместить дисплей и его обвязку к себе на плату. Количество деталей в схеме несколько увеличилось, но зато конструкция в целом заметно упростилась и стала более компактной.

Аналогичные размышления у меня и на тему GPS модуля. Он не то, чтобы большой, но как его ни поставь он или мешает, или антенна закрывается какой-нибудь батарейкой. Возможно будет хорошей идеей поместить начинку модуля к себе на плату, а антенну разместить где нибудь в другом месте.

Работа над корпусом также позволила определиться с размером и емкостью батареи. В доступный объем как раз нашлась батарея на 900 мАч — на нее и будем ориентироваться. Хотелось бы, чтобы мое устройство работало от батарейки часов 15–20, а значит потребление должно быть на уровне 45–60 мА.

На данный момент я не могу назвать работу над корпусом законченной. Во-первых по прежнему открыт вопрос выбора для некоторых компонентов (дисплей, GPS). Во-вторых не ясно заведется ли моя схема в принципе или нужно будет что нибудь кардинально менять. Ну и в-третьих, плата получается ну уж слишком компактной — я не уверен, что в силах такое развести, спаять и отладить. Потому в этой статье я все же сфокусируюсь на вопросах схемотехники, буду двигаться более простыми и понятными шагами, а про корпус расскажу в следующий раз. Вот вам для затравки парочка рендеров и фотографий.

4jffl-arvuselp1d93s5muqazqy.png

o2a9vejujirpcxe634dzikwqc0e.png

a9huka9xfxi-g0wegdzhb8ezonm.jpeg

aznlb21azpqtsfgoaim0occrvgc.jpeg

Схема


Вот теперь уже можно заняться электроникой. Я буду достаточно детально описывать схемотехнические решения. В первую очередь для таких же новичков в электронике как и я, а также в качестве конспекта самому себе. Опытные электронщики могут бегло просмотреть схемы и перемотать к следующему разделу.

Начнем с питания.

Аппарат будет запитан от литиевой батареи, а значит нужен контроллер заряда. Также некоторые компоненты имеют верхний предел по напряжению порядка 3.6В, тогда как на батарее может запросто оказаться больше 4В. Значит нужен понижающий источник питания. Как мы уже выяснили нам понадобится несколько разных напряжений.

Я уже упоминал что я буду использовать микросхему PT1502. Она удачно подходит, т.к. реализует контроллер заряда, 3 источника питания, а также схему включения устройства кнопкой. В микросхеме несколько функциональных блоков, которые на схеме для понятности я разделил. Сама схема представляет собой немного переработанную схему из даташита. Вот контроллер заряда литиевой батареи

7yp7skuez7vcdpdzr33f6rhtfk4.png

Резистор R3 задает ток заряда. По умолчанию это соответствует 470 мА. Возможно по результатам тестов я уменьшу номинал этого резистора до 510 Ом, что будет давать ток заряда около 900 мА (1C).

О текущем режиме заряда контроллер может сообщать ногой CHG_STAT. Причем сигналов он умеет давать аж 3 — заряжается, не заряжается, и уже зарядилось, но еще подключено к розетке. В первом варианте внутренний транзистор прижимает ногу к земле и это легко можно опознать контроллером. Во втором варианте транзистор полностью закрывается и нога переходит в высокоимпедансное состояние. С помощью подтяжки к питанию такой сигнал также легко считать контроллером.

А вот с третьим состоянием не все так просто. Там транзистор приоткрыт и через него течет ток 20 мкА. Для того, чтобы считать такое состояние мне подсказали подобрать подтяжку таким образом, чтобы на ноге оказалось примерно половина питания. Тогда можно будет с помощью АЦП легко детектировать такое состояние. Пользуясь законом Ома получаем R5 = 1В/20 мкА = 50к.

Как я уже сказал микросхема PT1502 это не просто зарядник, но еще и хитрый контроллер всего питания. Микросхема следит за напряжениями на схеме и с помощью сигнала RESET может управлять главным процессором (мол, рано тебе еще запускаться, питание еще не стабилизировалось).

21z3f1tkkpvqsph462qukz0_anu.png

Также микросхема может запустить прибор по нажатию кнопки (BTN1), а также по сигналу от микроконтроллера (PWR_HOLD) завершить работу и отключить питание. Ну, а чтобы сигнализировать процессору о том, что батарея на исходе предусмотрен сигнал BAT_LOW.

А это основной источник питания.

nb5xtc2txxl98wz1pfwgmzsr49u.png

Выходное напряжение задается напряжением на выводе BUCKFB и при батарейном питании настроено на 2В. Но с двухвольтовым питанием обнаружилась одна проблема — USB работать не будет. Т.е. батарейка заряжаться будет, а данные передавать не получится — микроконтроллер просто не сможет выдавать сигналы на шину USB достаточной амплитуды. Даташит рекомендует напряжение как минимум 2.7В, лучше 3.3В.

Чтобы не городить еще один источник питания и думать как переключаться между ними, я решил просто корректировать соотношение делителя R1/R4+R7. При таком включении импульсник работает постоянно. Как только устройство втыкают в USB, транзистор открывается и шунтирует R7. Соотношение задающих резисторов меняется и на выходе получаем 3.16В (можно будет еще поиграться с номиналами и дотянуть до 3.3В).

В микросхеме PT1502 имеются также 2 линейных регулятора.

1cs0tjf8eerkuske4_dyqithygm.png

К этим регуляторам у меня будут подключены либо мало потребляющие компоненты (INA219), либо короткоживущие (bluetooth), так что КПД этих источников не будет проблемой. Напряжение питания LDO2 можно настроить с помощью сигналов LDO2_SETx.

Поскольку по напряжениям питания у меня все еще есть открытые вопросы, я решил развести перемычки для выбора режима LDO2_SETx. Также чтобы иметь возможность измерять реальное потребление по соответствующей шине я также разведу перемычки JP1/JP2/JP3 на гребенку.

Заканчивая тему источников питания нужно упомянуть о питании дисплея. Чуть выше я писал, что во имя компактности мне пришлось отказаться от покупного дисплейного модуля и забрать дисплей с обвязкой к себе на плату. Этот дисплей требует специального повышающего преобразователя на 7–16В. Удобно что этот источник можно включать и выключать с помощью сигнала EN. Сама схема скопирована с даташита повышатора, точно такая же используется и в дисплейных модулях с али.

oibdzmvkie49fxcjamxcvszh9gw.png

PT1505
Перерывая интернет в поисках альтернатив на микросхему PT1502 я наткнулся на ее старшую сестру — микросхему PT1505. Это практически такой же контроллер питания, только с дополнительной повышайкой. С таким контроллером можно было бы сократить количество элементов на плате. К сожалению микросхемы PT1505 в продаже не нашел.

Кстати, буду благодарен если Вы знаете аналогичные контроллеры питания от других производителей.


Теперь немного о питании микроконтроллера. Микросхема большая и имеет 6 линий питания — 4 на цифровую часть, 1 аналоговое питания и одно для часов. Согласно даташиту на STM32F103 на всех линиях питания (может быть, кроме часовой) должно стоять по конденсатору 100нФ, и еще один общий на 4.7 мкФ.

А вот в даташите на STM32F4 сказано, что хотя микроконтроллеры практически совместимы по выводам, все же схемы питания у них несколько различаются. Так на двух выводах должны стоять конденсаторы по 2.2 мкФ между выводом и землей (а не между землей и питанием, как у F1). Поэтому пришлось учесть оба варианта и для конкретного микроконтроллера запаивать только часть конденсаторов.

vvaia45dk-cjpdj9jrypfecczug.png

Продолжая тему питания, нужно придумать как его измерять. Можно полагаться на сигнал BAT_LOW и попросить пользователя быстренько закруглиться если батарейка разряжена. Но это именно то, что мне не нравилось в оригинальном Holux M-241, т.к. этот сигнал появлялся слишком поздно и его легко было проворонить. Мне нужен какой нибудь более информативный показатель заряда батареи.

2r6l0gd1bdyewq--m8zij_nugxs.png

На всякий случай я поставил самый обыкновенный делитель для измерения напряжения батареи. Но в случае литиевых аккумуляторов это только информативный показатель и полагаться на него не стОит. Для более честных показаний по батарее в интернете предлагают использовать «кулон».

an3uncm2tjzd-pu3n6ns8vqnhz0.png

Эта маленькая микросхемка считает количество энергии, которое через нее прошло в или из батареи. Измерения производятся на шунте R10. Показания микросхемы можно считать через I2C. Микросхема умеет измерять напряжение на батарее, ток проходящий через резистор, а также перемножать одно на другое. К сожалению накапливать значение пробежавших мимо Ватт*Часов она не умеет, потому придется делать постоянный опрос.

Перейдем к цифровой части. Сердце всей системы — микроконтроллер STM32F103RB.

hmwsma-hii28gwjrskmvmfsytl4.png

Обвязка в виде двух кварцев взята с других схем, найденных в интернете (перепроверено в даташите). Мне не потребуется загрузка из оперативной памяти, а потому сигнал BOOT1 подтянут к земле. BOOT0 можно выбирать перемычкой для загрузки из основной флеш памяти или встроенного UART загрузчика (например для первичной прошивки устройства)

Дальше светодиод.

jabgahdeoppmxzipfiqu5mpd9dq.png

Поскольку основное напряжение питания будет меняться от 2 до 3.3В то светодиоды к нему подключать не стОит — будет сильно меняться яркость и потребляемый ток. Поэтому светодиоды у меня будут подключены к шине 2.7В, токоограничивающие резисторы рассчитаны соответственно. Поскольку микроконтроллер не сможет выдавать на своей ноге больше 2В при питании от батареи, то push-pull режим GPIO использовать нельзя. Только open-drain.

Про кнопку ресета рассказывать особо нечего.

6xeqise0ghoatscub44uzcykfoq.png

Поскольку на шине I2C будет сидеть трехвольтовое устройство (INA219), то и подтяжки также нужно делать к трем вольтам

xjyin76yz6g_sg7vo9t2s4eqrms.png

Разъем SWD также стандартен. Диод нужен, чтобы переключать питание между батарейкой и внешним питанием от программатора.

vls7pw9grlfznf3gfo1_yglclqw.png

Предвосхищая возгласы что так не делают и что такое подключение на самом деле не отключит батарейку. Да не отключит, но диод тут не для этого. Эта штука нужна чтобы иметь возможность запитать устройство от программатора, если батарея не подключена. А если подключена, то пусть от нее и работает. Ну и если батарея подключена, то нужно защитить сам программатор от 4.2В на батарее.

А вот на кнопках стОит остановиться подробнее.

ggdugivqqx7iqjimaqwkbsiehru.png

Дело в том, что первая кнопка будет не только кнопкой, но будет работать также и как включатель устройства — сигнал BTN1 подключен к микросхеме контроллера питания PT1502. Когда устройство выключено питание на микроконтроллер и другие потребители не подается. Именно по этому кнопка подключена не к питанию (VCC), а к батарее (BAT). По нажатии на эту кнопку PT1502 включит все источники питания и запустит микроконтроллер. После этого кнопка может работать как обычная кнопка. Для того, чтобы микроконтроллер не спалить высоким напряжением батареи я соорудил небольшой делитель напряжения, который загонит сигнал BTN1 в необходимые рамки (впрочем, можно и без этого — у микроконтроллера есть входы, толерантные к 5В)

Вторая кнопка ничем не примечательна. Внутри процессора будет включена подтяжка к земле, а кнопка будет подавать на линию единицу…

Плавно переходим к тяжелой периферии. USB

hjvntgq_-3sjzwjv03t0dqd--gg.png

Разъем USB будет торчать наружу устройства, а там может гулять статическое электричество. Оказывается есть специальные микросхемы (такие как STF202–22), которые охраняют микроконтроллеры от внешнего воздействия.

Но интересно тут другое. Внутри микросхемы STF202 спрятан резистор на 1.5к, который подключен между ногой VBUS и линией D+. Этот резистор нужен по спецификации USB — по нему хост узнает, что в него что-то воткнули. Во многих схемах этот резистор включен между питанием и линией D+ всегда. Как только хост видит такой резистор на линии D+ он сразу начинает общение с устройством. Это не всегда уместно, т.к. некоторые устройства могут быть сразу не готовы к коммуникации.

Это как раз мой случай. Для этого есть простая хитрость (подсмотренная тут). Можно включать и выключать этот резистор с помощью транзистора: хотим коммуникации — включаем резистор, хотим просто запитаться от USB — выключаем. Когда Вы втыкаете Ваш мобильник в USB он как правило спрашивает «что делать будем? Данные сливать или только заряжаться?» — в терминах электроники это как раз и идет речь о подключении подтягивающего резистора.

Но как узнать, что устройство воткнули в USB? Для этого я предусмотрел сигнал USB_PLUGGED, который снимается с простейшего делителя.

hxlru5qf7wv13uxeseybbyhhpdi.png

5В от USB можно было бы и напрямую на ногу микроконтроллера подавать — они же все таки толерантны к 5В. Но пусть уже будет через делитель.

Теперь акселерометр

-gt15jf_cub3nubnrpsbr5hiusa.png

Схема взята из даташита. Модуль подключен по I2C, но чтобы сигнализировать микроконтроллеру о том, что есть новости используется еще линия прерывания. Также, поскольку на той же шине I2C еще висит трехвольтовая INA219 то для согласования уровней коммуникационные ноги

© Habrahabr.ru