Например TDA7294

РадиоКот > Статьи

О разработке приложений на PSoC-4 фирмы Cypress

Автор: Сергей Безруков (aka Ser60), sergeilb60@mail.ru
Опубликовано 21.06.2016.
Создано при помощи КотоРед.

Теория

Это моя третья статья о работе с PSoC (Programmable System on Chip) фирмы Cypress. В первых статьях [1, 2] я рассказывал о разработке приложений для Bluetooth Smart модулей посредством системы PSoC Creator. Сейчас речь пойдёт об одном из семейств PSoC фирмы, не содержащих Bluetooth модуля. Помимо линейки ARM Cortex микроконтроллеров, унаследованных от фирмы Spansion после слияния с ней весной 2015, у Cypress имеется и свой богатый опыт разработки одночиповых программируемых систем. Мы рассмотрим семейство PSoC 4, которое содержит на борту массу аналоговых и цифровых блоков. На первый взгляд, PSoC мало чем отличается от микроконтроллеров (МК), у которых имеется аналогичная по функционалу периферия в виде всевозможных таймеров, АЦП, операционных усилителей, компараторов и пр. Однако, в МК периферия перед началом работы должна быть сконфигурирована процессором, в то время как у PSoC периферия конфигурируется независимо от процессора, хотя она также может быть изначально сконфигурирована и в любой момент переконфигурирована последним. Помимо этого, благодаря развитой системе аналоговых и цифровых мультиплексоров, большинство выводов периферии можно назначить практически на любые выводы корпуса, в то время как у МК для этого обычно имеется лишь несколько вариантов выбора. Это делает PSoC очень гибкой в использовании.

Полный комплект технической документации на PSoC с описанием всех регистров занимает около 5000 страниц текста (да, я не ошибся с нулями). Однако, разработка систем на PSoC происходит буквально играючи благодаря замечательной системе PSoC Creator с интуитивным графическим интерфейсом. Система доступна для бесплатного скачивания с вебсайта фирмы и свободна от всякого рода ограничений, таких как, например, размер кода. Бортовой МК в PSoC выполнен по архитектуре Cortex-M0 и имеет до 128Кб флеша и до 16Кб RAM в зависимости от модели. Максимальная частота тактирования его состаявляет 24 и 48мгц для моделей 41хх и 42хх, соответственно.

Для начального ознакомления с PSoC 4 фирма предлагает несколько недорогих демо-плат. Прежде всего, это платы CY8CKIT-049-4xxx по цене всего 4 USD.

PSoC на такой плате программируется через бутлоадер посредством USB-UART конвертера в левой части платы. Конвертер выполнен на основе чипа CY7C65211 [3]. При желании PSoC также можно запрограммировать через ARM-овский SWD интерфейс, задействовав 5 выводов в правом нижнем углу платы. После распайки штыревых коннекторов платы могут быть использованы совместно с беспаячной макеткой. Бутлоадер, как известно, предоставляет лишь возможность программирования чипа, но не позволяет производить внутрисхемную отладку его кода. Кроме того, к сожалению, бутлоадер загружен фабрично только в чипы, установленные на демо-платах. Для устранения этих недостатков у фирмы также имеются демо-платы CY8CKIT-043 с внутрисхемным программатором/отладчиком на борту с интерфейсом SWD, но стоимостью в 10 USD.

Обратите внимание на то, что программаторы/отладчики на этих платах могут быть легко отделены от основных плат и использованы также и для программирования/отладки PSoC чипов вне платы в устройстве пользователя. Помимо этих демо-плат имеется несколько других, более дорогих, но и с гораздо более развитым функционалом отпадочных плат, и с разъёмами, позволяющими использовать эти платы совместно с внешними шилдами для Arduino.

Стандартным штатным программатором/опладчиком для PSoC фирмы считается MiniProg3. Однако, отдельно он почему-то стоит около 90 USD, в то время как его можно получить почти вдвое дешевле в составе набора CY5672 наряду с несколькими другими интересными «штуками» в наборе. Отмечу, что проекты из PSoC Creator можно портировать в системы Keil MDK и IAR Workbench, и после установки плагина программировать PSoC универсальным инструментом ULINK. Однако, из-за специфики изделий первое программирование (или установку в чип бутлоадера) можно осуществить только с помощью MiniProg3 или SWD-программаторами на демо- или отладочных платах.

Время от времени у меня появляются мини-проекты с использованием сегментных ЖКИ, поэтому из всех блоков PSoC я решил сделать в статье упор на конфигурирование блока управления таким дисплеем. В PSoC реализован оригинальный метод генерирования управляющих сигналов для мультиплексного ЖКИ и управления его контрастом с помощью ШИМ. Очень приятно, что любой вывод корпуса помимо питания можно отрядить под управление ЖКИ. Это также касается общих выводов COM дисплея, что ощутимо упрощает разводку печатной платы. В тестовой схеме ниже PSoC управляет 4-значным ЖКИ, работающим в режиме мультиплекса 1:4. Выводы 1-4 ЖКИ предназначены для управляющих сигналов COM0 - COM3. Схема измеряет температуру воздуха с помошью I2C сенсора и отображает её на ЖКИ. Заметьте, что PSoC работоспособна в широком интервале питающих напряжений 1.71 – 5В.

Схема собрана на беспаячной макетке с целью тестирования на токопотребление. Измерение температуры производится сенсором с периодом в 5 сек.

Для этого проекта нам понадобятся 3 блока PSoC: блок контроллера ЖКИ, дефолтно тактируемый от системного генератора (в нашем проекте система тактируется на частоте 6 мгц), и блок интерфейса I2C для коммуникации с сенсором. Выберем их в правой панели каталога компонентов и перетащим мышкой на панель компоновки системы.

Перед настройкой LCD модуля полезно взглянуть на распиновку ЖКИ в его ДШ. Как следует из таблицы ниже, наш ЖКИ имеет 4 общих вывода (COM0 – COM3) и 8 сегментных (выводы 5 – 12). В столбцах таблицы для каждого вывода ЖКИ указано какой из четырёх подключённых к нему сегментов работает в паре с каким общим выводом.

Кликнув 2 раза на иконку LCD выставим в открывшемся окне нужное число общих и сегментных выводов и тактирование от низкочастотного генератора частотой 32 кгц, чтобы ЖКИ работал при погружении МК в режим глубокого сна. Нижние два параметра следует подобрать в зависимости от конкретной модели ЖКИ экспериментально. Чем больше частота кадров, тем более глубокой получается регулировка контраста ЖКИ. Токопотребление при этом вырастает незначительно.

Далее нажимаем на закладку Display Helpers и нажатием на зелёную стрелку переносим опцию 7 Segment для нашего дисплея из окна Helpers в окно Selected helpers. Затем нажимаем несколько раз на зелёный “+” в Helper Function Configuration и добиваемся появления четырёх восьмёрок по числу разрядов применённого ЖКИ. Наш ЖКИ имеет 8 сегментных выводов (выводы 5 – 12 в таблице выше). Для каждого из них следует сформировать сигналы управления на выводах PSoC, которые обозначены как Seg0 – Seg7. Предположим, что вывод Seg0 у PSoC будет обслуживать сегменты на выводе 5 у ЖКИ. Согласно таблице выше, во время фаз COM0 – COM3 вывод 5 управляет, соответственно, сегментами 1D, 1E, 1G, 1F левой цифры. Перенесём мышкой соответствующие сегменты в указанном порядке в строку Seg0 в таблицу Pixel mapping table. Аналогично заполним остальные строки. При этом конфигуратор автоматически заменит дефолтные названия сегментов PIXm в таблице на имена типа H7SEGn_A, где n – номер цифры, считаемой слева направо.

Отмечу, что конфигуратор назначает свои имена только стандартным сегментам A – F и не переименовывает сегменты десятичных точкек и других спецсимволов, отображаемых ЖКИ. В программе для управления такими символами следует использовать дефолтные имена сегментов PIXm из таблицы. Далее нажимаем на закладку Pins конфигуратора выводов корпуса PSoC и выбираем на каких его выводах мы хотим получить сигналы COM0 – COM3 и Seg0 – Seg7, а также заодно выберем выводы под I2C интерфейс.

Далее кликаем на закладку Clocks в нижней части этого окна, затем на Edit Clock и устанавливаем частоту тактирования системы 6мгц. Настройки I2C модуля можно не производить, положившись на его дефолтные установки, в частности тактирование линии I2C на частоте 100кгц.

Теперь можно скомпилировать проект через меню Build. В результате получим массу автосгенерированного кода настроек периферии. Таким образом, мы вплотную подошли к более «интеллектуальной» части работы – написанию кода приложения. Как видно из кода, в данном случае программа практически состоит из вызова API функций работы с модулями. В строках 7-13 мы разрешаем прерывания и конфигурируем таймер Watchdog0 на пробуждение чипа каждую секунду. Далее в строках 15-21 инициализируем блоки I2C и контроллера ЖКИ и индицируем десятичную точку и символ C на дисплее. В главном while(1) цикле при пробуждении из сна считаем число пробуждений с помощью переменной updateCnt и по её обнулению читаем в строках 29-35 температуру из сенсора, производим запрос на новое её измерение, и показываем её текущее значение на дисплее. При этом API работы с ЖКИ даже сами разбивают показываемое на дисплее число на составляющие его цифры и отображают их в разрядах ЖКИ, определяемых параметрами (см. детали в ДШ).

Приведу также код драйвера сенсора температуры TMP112. Первая его функция служит для посылки в сенсор запроса за производство нового измерения, а вторая – для чтения из него значения температуры. Благодаря ёмким именам API функций PSoC код этот написан почти что на «человеческом» языке и в комментариях вряд-ли нуждается.

Следует сказать несколько слов про драйвер ЖКИ. Он может работать в двух режимах: Digital correlation и PWM. В обоих случаях он генерирует чисто цифровые сигналы на сегментных и общих выводах ЖКИ. В первом режиме (наш случай) драйвер тактируется от низкочастотного генератора и может работать когда PSoC находится в режиме глубокого сна. Эпюры напряжений для этого режима на одном из общих и сегментных выводах ЖКИ, работающим в мултиплексном режиме 1:4, показаны на левой картинке ниже. На правой картинке эти-же эпюры показаны с бóльшим разрешением. Как видно, на осциллограммах отсутствуют привычные в подобных случаях ступенчатые аналоговые сигналы с 4-мя уровнями напряжений.

Этот режим особенно хорошо подходит для ЖКИ выполненных по технологии STN (Super Twisted Nematic). Такие дисплеи, по сравнению с их TN собратьями, как правило, более качественные и обеспечивают лучший контраст. Большинство недорогих ЖКИ дисплеев выполнено по технологии TN, в том числе и наш, и контраст изображения на них ниже. При использовании драйвера PSoC с TN дисплеями несколько уменьшается угол их обзора, что особенно заметно на ЖКИ малых размеров. Однако, в любом случае параметры обзора ЖКИ получаются приемлимыми для большинства приложений. Ниже для сравнения показан контраст на TN ЖКИ модели Varitronix VIM-404, работающим в режиме с мультиплексом 1:3 под управлением того-же драйвера PSoC.

Контраст изображения получается ощутимо лучшим при работе драйвера в режиме PWM, где для фильтрации импульсов при формировании аналоговых уровней на выводах ЖКИ используются его межэлектродные ёмкости и даже последовательно включаемые с сегментами резисторы. К сожалению, такой режим возможен только при тактировании драйвера от высокочастотного генератора системы, что не позволит погрузить её в режим глубокого сна с работающим при этом дисплеем. Таким образом, более высокое качество изображения получается за счёт повышенного токопотребления.

Практика: Fridge Processor

Идея описываемого ниже устройства принадлежит моей дочери и имеет громкое название процессора для холодильника. По сути оно представляет собой счётчик времени для длительности хранения продуктов в холодильнике. Несколько таких счётчиков позволят оценить пригодность к пище разных находящихся в нём продуктов. Время показывается в формате HH:MM, если оно находится в диапазоне 0 - 24 часов, и в формате DD|HH (с тремя вертикальными точками вместо черты) для диапазона 1 – 99 дней.

Помимо счёта времени прибор имеет режим термометра, что удобно для проверки работы холодильника (но не морозильной камеры, т.к. используемый ЖКИ не предназначен для работы при низких отрицательных температурах). Нижний предел измерения температуры устройством -9.9°С. Схема прибора аналогична показанной выше. Изменения коснулись инвертирования выводов ЖКИ, введения кнопки переключения режимов, и коммутации питания сенсора температуры с вывода МК. Этим достигается экономия порядка 1.2 мкА (более 50%) среднего токопотребления схемы. Устройство питается от литиевой батареи CR2032, потребляемый ток в режиме таймера с работающей индикацией около 2 мкА. Размеры устройства 32×21×8 мм.

Переключение прибора между режимами таймера и термометра осуществляется кратковременным нажатием на кнопку. Длительное (более 4 сек) нажатие кнопки в режиме таймера приводит к его обнулению, а в режиме термометра к переключению между шкалами Цельсия и Фаренгейта. Таким образом, отсчёт времени производится устройством в любом случае, даже если оно находится в режиме термометра. Однако, в режиме показа времени на ЖКИ измерение температуры не производится. Ниже показан монтаж прибора на двух платах, сложенных сэндвичем. На нижней плате закреплён только держатель батареи. Все остальные детали схемы установлены на верхней плате. При программировании чипа программатор временно подпаивается к контактным площадкам на верхней плате. Платы изготовлены из фольгированного текстолита толщиной 0.8 мм.

Поскольку эта модель PSoC не имеет встроенного генератора для работы с часовым кристаллом, а частота внутреннего низкочастотного генератора ILO нормируется в широких пределах и подвержена влиянию температуры, для повышения точности отсчёта времени производится периодическая подстройка частоты ILO с помощью встроенного высокочастотного генератора. Точность фабричной установки частоты высокочастотного генератора гарантируется производителем в пределах ±2% во всём температурном диапазоне работы системы. Для реализации подстройки использован специальный модуль PSoC – ILO Trim. Точнее, вместо изменения частоты генератора ILO изменяется коэффициент делителя его частоты для получения секундных импульсов. Программно это осуществляется одной строчкой кода вызова API функции ILO_Trim_Compensate(). Параметром этой функции является желаемое число циклов делителя (в нашем случае 32000 для номинальной частоты ILO 32кгц), а возвращаемой ей значение – фактическое число циклов делителя, которое следует загрузить в соответствующий регистр счётчика. Проще не бывает! Частота 3мгц автоматически подаётся на вход этого блока только на время вычисления коэффициента компенсации, производимого с периодом 1 мин. Гарантируемая при этом точность ±10% достаточна для нашего приложения. Для реализации устройства задействованы следующие компоненты PSoC:

Измерение температуры в режиме термометра производится каждые 10 секунд. Для генерации этих интервалов задействованы Watchdog0 и Watchdog1, работающие в режиме таймеров. При этом 16-битный счётчик Watchdog0 программно сконфигурирован в качестве прескейлера для Watchdog1, а обнуление последнего производится каждые 10 секунд, что и определяет период измерения температуры. При обнулении генерируется прерывание, выводящее PSоC из режима глубокого сна.

Элементы показанные синим цветом на панели компонентов выше являются внешними для PSoC. Я их выбрал из каталога Off-Chip внешних компонентов системы PSoC Creator исключительно для наглядности. При замыкании кнопки PSoC производит определение знака изменения напряжения на выводе Button МК (этот вывод снабжён внутренним подтягивающим резистором) и формирует сигнал на входе модуля аппаратного прерывания Button_ISR. Для подaвления дребезга кнопки используется формирователь коротких временных интервалов на основе таймера Watchdog2, активизируемого по нажатию кнопки. Вывод PWR (от Power) сконфигурирован на коммутацию питания сенсора температуры.

В заключении пара замечаний. Несмотря на документацию, задействовать внутренние подтягивающие резисторы на линиях I2C этой модели PSoC не удаётся. Это известный разработчикам hardware bug, будем надеяться на его устранение в следующих ревизиях чипа. Далее, для достижения заявленного выше токопотребления необходимо перевести выводы SWD интерфейса PSoC (P3.2 и P3.3) из дефолтного режима отладки в режим GPIO. Это осуществляется в закладке System конфигуратора пинов, показанной выше.

В целом, система PSoC Creator является на мой взгляд самой простой для освоения из всех систем программирования ARM контроллеров, с которыми мне довелось иметь дело. Отрадно, что она доступна для свободного скачивания и в ней отсутствуют какие-либо ограничения на объём кода. На вебсайте фирмы имеются многосерийные видео по работе с ней, дополненные многочисленными руководствами в формате PDF, а также примерами программ работы с модулями. Широкий диапазон рабочих напряжений PSoC позволяет непосредственно использовать их в системах с питанием от 5В. В приведённом ниже архиве содержится полный проект firmware прибора и файл его плат для Eagle.

Литература

  1. Bluetooth Smart Broadcaster на RSoC фирмы Cypress
  2. Реалиазция стандартного GATT-BLE профиля на RSoC фирмы Cypress
  3. О USB–Serial конвертере на CY7C65211 и сенсоре давления LPS25H

Файлы:
Архив ZIP


Все вопросы в Форум.


ID: 2294

Как вам эта статья?

 Нравится
 Так себе
 Не нравится

Заработало ли это устройство у вас?

 Заработало сразу
 Заработало после плясок с бубном
 Не заработало совсем

34 2 3