Как стать автором
Обновить

Модельно-ориентированное проектирование, или взятие Cortex M3 штурмом с помощью Matlab/Simulink

Программирование микроконтроллеровMatlab


Оправдание


Сразу же оговорюсь, что изучение микроконтроллеров я начал с КР580 в составе УМК с такими устрашающими характеристиками:
Тип применяемого МП — КР580ВМ80А.
Объем ОЗУ — 3 Кбайт.
Объем ПЗУ — 2 КБайт.
Возможность прерывания — 1 вектор.
Программное обеспечение — системная программа «Монитор».
Уровни входных и выходных сигналов совместимы с уровнями ТТЛ.

Масса изделия не более 9,6 кг!

Фото подобной техники найдено на просторах интернета, и меня на нем нет! Но атмосферу работы передает отлично!
Я имею общее понятие о ассемблере (в шестнадцатеричных кодах с аппаратной клавиатуры), регистрах и других вещах, в незнании которых винят людей сразу начавших писать на Си. Именно это близкое знакомство напрочь отбило впредь писать на ассемблере, но и у почитателей Си тоже есть за что меня пинать. Программировать микроконтроллеры на Си в этом топике я не буду. Точнее буду, но немного нестандартным образом.
Я хоть и работаю в сфере разработки программного обеспечения, но с самим программированием связан косвенно. Так что информация изложенная ниже предназначена скорее для начинающих в электронике и программировании, хотя и дает немалый шанс применить передовые технологии принятые на вооружение мировыми лидерами.

Ближе к делу


Вернуться к программингу микроконтроллеров меня заставила статья следующего вида:
MathWorks Tools Help Toyota Design for the Future
“MATLAB, Simulink, and Stateflow … have become the de facto standard at Toyota for simulation, data processing, and controls design. It would be impossible to list all of the applications for these tools at Toyota.”
Akira Ohata, Toyota
Если такая "небезызвестная" компания как Toyota выбирает для себя определенную стратегию развития новых продуктов, то этот путь не может быть не интересен общественности. Так что же такое модельно-ориентированное проектирование?
Цитата с сайта дистрибьютора Matlab.
Модельно-ориентированное проектирование (далее МОП) — эффективный и экономически выгодный способ разработки систем управления, обработки сигналов и изображений, построения систем связи, разработок в области мехатроники и создания встраиваемых систем. Применение этого подхода в компаниях Tesla, General Motors, Harman Becker, mainroland, Toyota и др. позволило увеличить качество продукции и уменьшить время разработки более чем в два раза.

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

Постановка задачи


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

Выбор цели


Под рукой старого доброго КР580 уже не было, и я занялся поисками другого камня.
В результате изучения довольно изменившегося рынка микропроцессорной техники мой выбор пал на stm32 vl Discovery с Cortex M3 (STM32F100RB) на борту.

Преимущества:
  1. Цена
  2. Наличие библиотеки Rapidstm32 для Simulink
  3. Отличные статьи на хабре и на простоэлектроникс
  4. Наличие встроенного программатора и отладчика ST-LINK
  5. Достаточно других преимуществ

Недостатки:
  1. Библиотека Rapidstm32 работает в полнофункциональном режие только с платами FiO Std за 80$
  2. ARM после КР580 оказался немного сложней, чем я себе представлял

Рассматривал вариант с Arduino, который с Matlab/Simulink тоже дружит. На youtuбе просто чудеса с этой связкой можно посмотреть. Сейчас изучаю методики уважаемого DI HALTа, надеюсь следующим шагом будет чисто свой девайс.

Программное обеспечение


  1. Matlab R2011a в составе:
    Simulink 7.3 or later
    Embeded coder
    Simulink coder
    Realtime workshop
    Stateflow и другие тулбоксы по желанию
  2. Библиотека Rapidstm32
  3. Microsoft .NET Framework 3.5 требует эта самая библиотека
  4. MDK-ARM Microcontroller Development Kit для компиляции кода, или другой удобный хабрачитателю пакет


Аппаратное обеспечение


  1. stm32 vl Discovery (не забываем почитывать manuals and datasheets)
  2. Шнур mini USB (в комплекте с платой его нет)
  3. Макетная плата
  4. Светодиоды
  5. Резисторы подстроечные

МОП


Настройка будущей модели


Создаем новую модель в Simulink, заходим в Simulation --> Configuration parameters и настраиваем все так, как показано ниже:




Строим модель

Выбираем из библиотеки Simulink нужные нам блоки, размещаем их удобно, соединяем связями.
У меня эта процедура заняла около двух минут с перерывами на чтение мануала.
Получится должно что-то вроде этого:

Кроме того, что выглядит это как наглядная диаграмма работы системы, так она еще и «живая»!

Далее дважды нажимаем Update diagram на панели инструментов окна модели. После первого нажатия выскочит злое окошко:

Говорят в нем о том, что так как мы не купили оригинальную плату FiO Std, то и полной версии библиотеки тоже не получим. То что частота будет ограничена 24 Мгц нам не страшно, частота нашего камня как раз такая и есть. Но вот другие ограничения довольно неприятны, поэтому насчет arduino я еще думаю…
После второго нажатия цветовая гамма отдельных блоков и связей изменится в соответствии с подобранным тактированием. Просмотреть карту тактирования можно по нажатию Ctrl+J:



После обновления диаграммы можно смело жать Ctrl+B и строить нашу модель. Так же это можно сделать из меню Tools --> Code Generation --> Build Model.
В результате построения мы должны увидеть в командном окне Matlab историю стройки с красивыми строками в конце:
*********************************************************************
RapidSTM32: Target built directory is: adcpwm_rapidstm32
RapidSTM32: Build completed at: 01-Oct-2011 22:52:36
*********************************************************************
### Successful completion of Real-Time Workshop build procedure for model: adcpwm

Но не все так гладко, как кажется! Прежде чем увидеть эти строки я долгое время смотрел на отчеты об ошибках типа:
### Real-Time Workshop build procedure for model: 'target' aborted due to an error.
Стучался на всевозможные форумы включая официальный портал пользователей Matlab. Закончилось все видеоконференцией с одним из разработчиков библиотеки. Уважаемый Krisada Sangpetchsong из Таиланда пофиксил баг в файле rapidstm32_exit_hook.p, и пообещал, что в новой версии библиотеки все будет исправлено. У меня этот файл лежал по пути С:\rapidstm32\rapidstm32, так как по умолчанию библиотека устанавливается в корень С:\.
В результате же удачной генерации кода, в папке с моделью должна появится еще одна папка имя_модели_rapidstm32 с исходниками Си кода.

Создаем проект в keil

Создать проект нужно в той самой папке, куда Matlab поместила наши исходники, и назвать его как-нибуть осмысленно. При создании нас спросят тип устройства, на что нужно ответить STM32F100RB.
Важно! После указания типа устройства будет вопрос о добавлении startup файла в новый проект. Здесь нужно ответить НЕТ, так как этот файл тоже уже создан из нашей модели.
В окне проекта в созданную группу New Gpoup из контекстного меню вызываем добавление файлов с расширением *.c и *.s.

При выделенном корне дерева проекта Target 1 вызываем настройки Target Options, и настраиваем каждую вкладку как показано ниже:









После этого жмем Build (F7) и наблюдаем в статусной строке:
"имя_нашего_проекта.axf" - 0 Error(s), 0 Warning(s).

Прошивка и отладка

Для того, чтобы прошить нашу плату, нужно нажать кнопку Download на панели инструментов Keil. Здесь я столкнулся со второй трудностью. Прошиваться плата не хотела и выдавала ошибку «NO ST-Link Detected». Решилась проблема заменой драйвера Keil\ARM\STLink\STLinkUSBDriver.dll на более старый, который можно найти здесь. После этого плата прошивается, и по Ctrl+F5 запускается отладка. Нажатие заветной кнопки Reset позволяет увидеть как реагирует демо-плата на вращение подстроечного резистора:


Выводы


Эта тема конечно не для одного топика, я и так затянул с финалом. Я сознательно не вдавался в подробности настройки блоков модели и схемные решения. Но то, что время создание прототипа изделия сокращается в разы думаю видно невооруженным глазом. С помощью Simulink и Stateflow (событийно-ориентированная разработка на основе теории конечных автоматов), буквально «на коленке» можно собрать крайне сложную систему управления. Ограничивают нас здесь лишь возможности аппаратного обеспечения и иметь понятие в моделировании, а время разработки уже не является решающим фактором.
Если тема интересна, могу порадовать еще парочкой топиков посвященных Model-based design.

Благодарю за внимание!

Источники информации


  1. Сайт Matlab
  2. Блоги пользователей Matlab
  3. Обучающий портал разработчиков Rapidstm32

Вложения


  1. Проект Keil
  2. Исходная модель Simulink


UPDATE 1:

Скриншот проверки работы логики модели перед генерацией кода:
Теги:MatlabSimulinkEmbeded coderSimulink coderrealtime workshopStateflowstm32stm32 vl discoveryCortex M3KeilRapidstm32Model-based design
Хабы: Программирование микроконтроллеров Matlab
Всего голосов 68: ↑63 и ↓5 +58
Просмотры36.2K

Похожие публикации

Программист микроконтроллеров (embedded)
до 80 000 ₽ГК «ЭКОМЕР»Новосибирск
C Разработчик (Embedded)
от 120 000 ₽Flipper Devices Inc.МоскваМожно удаленно
C++ Developer (Qt)
от 120 000 ₽Flipper Devices Inc.МоскваМожно удаленно

Лучшие публикации за сутки