Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Аппаратные средства цифрового управления мехатронными системами



Аппаратные средства цифрового управления мехатронными системами

Учебно-методические указания

Курск 2012



УДК 004.312

Составитель: Яцун А.С., Мальчиков А.В.

Рецензент:

Рассматриваются вопросы цифрового управления мехатронными устройствами. особое внимание уделяется принципам построения и особенностям импульстных регуляторов.

Предназначены для студентов, обучающихся по специальности «Мехатроника и робототехника», «Автоматизация и управление».

 

 

Текст печатается в авторской редакции.

 



Оглавление

1.     Роль вычислительной техники в управлении процессами. 5

2.     Основные теоретические принципы цифровых САУ.. 8

3.     Регуляторы и схемы регулирования современными мехатронными системами. 17

4. Аппаратные средства реализации цифровых САУ.. 27

4.1 Центральный процессор. 27

4.2 Микроконтроллер. 31

4.3 Программируемый логический контроллер. 35

4.4 Цифровой сигнальный процессор. 37

4.5 Программи́ руемая логи́ ческая интегра́ льная схе́ ма. 39

5.     Типовая структура современных МК. 41

5.1 Внешние сигналы микроконтроллера. Порты ввода/вывода. 41

5.2 Тактирование микроконтроллера. 46

5.3 Порты микроконтроллера. 47

6.     Периферийные устройства МК. Аппаратные функции МК. 51

6.1 Прерывание. 51

6.2 Таймеры.. 54

6.2 Устройства хранения информации. 61

6.3 Компаратор. 64

6.4. Аналого-цифровой преобразователь. 65

6.5 Цифро-аналоговый преобразователь. 67

6.6 Широтно-импульсная модуляция. 70

6.7. Интерфейсы связи. Сопряжение МК с компьютером через COM-порт. 73

7.     Принципы цифрового управление внешними устройствами. 90

7.1 Подключение семисегментных индикаторов. 90

7.2 Жидкокристаллический дисплей. 94

7.3 Управление нагрузкой постоянного тока. 96

7.4. Управление шаговым двигателем.. 107

7.5. Принципы управления сервоприводами. 109

7.6. Особенности специализированных контроллеров для управления прецизионными электроприводами. 112

Лабораторная работа 1. «Внешние сигналы МК. Работа с портами». 117

Лабораторная работа 2 ОРГАНИЗАЦИЯ ПРЕРЫВАНИЙ ПРИ РАБОТЕ МИКРОКОНТРОЛЛЕРА.. 128

Лабораторная работа 3: Дискретизация и квантование непрерывных сигналов. 135

Лабораторная работа 4: Аппаратная реализация широтно-импульсной модуляции на основе микроконтроллера Atmega16. 136

Лабораторная работа 5: ПОСТРОЕНИЯ ЦИФРОВОЙ СИСТЕМЫ УПРАВЛЕНИЯ С ПОМОЩЬЮ МОДУЛЯ FREEDUINO.. 148

Лабораторная работа 6: ОРГАНИЗАЦИЯ ШИМ УПРАВЛЕНИЯ С ПОМОЩЬЮ МОДУЛЯ FREEDUINO.. 159

Лабораторная работа 7: Обработка аналоговых сигналов с помощью микро-ЭВМ Freeduino 165

 





Основные теоретические принципы цифровых САУ

 

Термином «цифровые системы» обозначаются системы, в которых цифровой регулятор на базе компьютера применяется для управления непрерывным динамическим объектом. Благодаря значительному удешевлению высокопроизводительной элементной базы (микропроцессоров) и преимуществам цифровых регуляторов в сравнении с аналоговой техникой, системы этого класса составляют основу современных средств судовой автоматики. Поэтому освоение методов анализа и синтеза цифровых систем является необходимым для разработчика автоматизированных комплексов.

Цифровой компьютер

Рассмотрим подробно компьютер, входящий в состав замкнутой цифровой системы управления (рис. 4). Здесь и далее аналоговые сигналы обозначаются сплошными линиями, а дискретные (числовые последовательности) — точечными.

Рис. 4. Блок-схема цифрового компьютера

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

e[k] = e(kT) при целых k = 0, 1, K, образующие последовательность {e[k]}. Этот процесс называется квантованием. Таким образом, сигнал на выходе АЦП можно трактовать как последовательность чисел.

Вычислительная программа в соответствии с некоторым алгоритмом преобразует входную числовую последовательность{e[k]} в управляющую последовательность {v[k]}.

Цифро-аналоговый преобразователь (ЦАП) восстанавливает непрерывный сигнал управления по последовательности {v[k]}. Чаще всего ЦАП работает с тем же периодом, что и АЦП на входе компьютера. Однако для расчета очередного управляющего сигнала требуется некоторое время, из-за этого возникает так называемое вычислительное запаздывание. На практике принято это запаздывание относить к непрерывной части системы и считать, что АЦП и ЦАП работают не только синхронно (с одинаковым периодом), но и синфазно (одновременно).

Особенности цифровых систем

Очевидно, что основные характерные черты цифровых систем управления связаны с наличием компьютера (цифрового устройства) в составе системы. Главные преимущества цифровой управляющей техники сводятся к следующему:

• используется стандартная аппаратура;

• нет дрейфа параметров, характерного для аналоговых элементов;

• повышается надежность и отказоустойчивость;

• существует возможность реализации сложных законов

управления, в том числе логических и адаптивных;

• гибкость, простота перестройки алгоритма управления.

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

Таким образом, квантование в цифровых системах приводит к специфическим эффектам, которые можно считать их недостатками:

• между моментами квантования система фактически не управляется, это может привести к потере устойчивости;

• при квантовании по времени теряется информация о значениях измеряемых сигналов между моментами квантования;

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

Синтез цифровых САУ

Классические методы синтеза позволяют построить непрерывный регулятор, который описывается передаточной функцией или соответствующим дифференциальным уравнением. Для непосредственной реализации такого регулятора можно использовать различные аналоговые элементы, в том числе и электронные (RC-цепочки, операционные усилители и т.п.).

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

· отсутствует дрейф параметров элементов регулятора (их изменение со временем, при изменении давления, температуры и т.п.);

· компьютер позволяет реализовывать достаточно сложные алгоритмы управления, в том числе и адаптивные, что крайне трудно сделать на базе аналоговой техники;

· для перестройки алгоритма управления не требуется менять аппаратуру, а надо просто заменить программу обработки данных.

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

На цифровых компьютерах нельзя напрямую реализовать управляющее устройство, которое описывается дифференциальным уравнением в непрерывном времени. Задача переоборудования состоит в том, чтобы заменить спроектированный непрерывный регулятор цифровым устройством так, чтобы сохранить все существенные свойства непрерывной системы (устойчивость, качество, подавление постоянных возмущений).

Экстраполятор

Экстраполятором называют устройство, которое восстанавливает непрерывный сигнал управления по дискретной последовательности значений , поступающих с выхода цифрового фильтра в моменты времени . Обычно вычислительное запаздывание (время, необходимое на расчет очередного значения ) включают в модель объекта управления, поэтому считается, что цифровой фильтр выполняет обработку данных мгновенно.

В простейшем случае ЦАП, получив новый управляющий сигнал  от цифрового фильтра, просто удерживает (фиксирует) его в течение интервала квантования  (до получения следующего значения ). Такой экстраполятор называется фиксатором нулевого порядка (англ. zero - order hold, ZOH).

Фиксатор нулевого порядка

Фиксатор нулевого порядка восстанавливает сигнал по правилу

.

Здесь  – так называемое локальное время, прошедшее с момента последнего срабатывания импульсного элемента.

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

Существуют и более сложные экстраполяторы, учитывающие несколько последних значений последовательности , но они используются на практике крайне редко из-за проблем в реализации.

Цифровые фильтры

Цифровой фильтр – это устройство, преобразующее входную дискретную последовательность

в выходную

В реальных фильтрах для расчета очередного значения управляющей последовательности  в момент времени  используется конечное число прошлых значений входного и выходного сигналов, хранящихся в оперативной памяти:

Здесь – некоторая функция своих переменных и  – целое число, называемое порядком фильтра. Чаще всего используют линейные законы управления, которые описываются формулой

,

где  и  – вещественные числа. Уравнение такого вида называют линейным разностным уравнением регулятора. Оно аналогично дифференциальному уравнению непрерывной системы, но входной и выходной сигналы изменяются в дискретном времени, т.е., определены только в моменты времени .

Как и для линейных непрерывных систем, для описания линейных цифровых фильтров (линейных дискретных систем) можно использовать операторный метод. В литературе чаще всего используется оператор сдвига вперед

, .

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

.

Отношение

называется дискретной передаточной функцией цифрового фильтра. Таким образом, в операторной форме получаем .

Фактически задача переоборудования сводится к тому, чтобы заменить передаточную функцию  непрерывного регулятора дискретной передаточной функцией цифрового фильтра  так, чтобы сохранить все существенные свойства системы.

Метод Эйлера

, , , .

Метод обратных разностей

, , , .

преобразование Тастина

, , , .

Все регуляторы имеют тот же самый порядок (равный 1), что и непрерывный регулятор. Полученные дискретные регуляторы только приближенно заменяют непрерывный, фактически они всегда будут работать несколько хуже, чем .

ПД-регулятор будем переоборудовать с помощью преобразования Тастина (интегрирования методом трапеций), которое является наиболее точным из этих методов. В системе Matlab для этого можно использовать функцию c 2 d из пакета Control Toolbox:

> > Dpd = c2d ( Cpd, T, ' tustin ' )

Здесь Cpd – модель (например, передаточная функция) непрерывного ПД-регулятора, T –интервал квантования.

Теперь рассмотрим интегральный канал:

.

Используя рассмотренные выше методы переоборудования, получаем

метод Эйлера                             ,   

метод обратных разностей      ,   

преобразование Тастина .  

Как будет показано дальше, для переоборудования интегрального канала лучше использовать преобразование Эйлера.

Ниже показана схема цифрового регулятора с компенсацией насыщения:

 

Здесь сплошные линии обозначают непрерывные сигналы, а штриховые – дискретные (числовые последовательности). ИЭ обозначает импульсный элемент (АЦП), а блок Э – экстраполятор (ЦАП).

Алгебраические циклы

Пусть интегральный канал переоборудован по методу обратных разностей

,   

что соответствует разностному уравнению

       .  (*)      

Теперь построим выражение для сигнала . Учтем, что

и ,

где функция  задает нелинейность типа «насыщение»:

Объединяя эти формулы, получим разностное уравнение для вычисления :

.

В этой формуле значение , которое требуется рассчитать, входит и в правую часть! Это значит, что для вычисления  требуется не просто подставить в формулу известные значения, а решить нелинейное уравнение относительно . Такое явление называется алгебраическим циклом, его желательно избегать. Более того, в сложных случаях это уравнение может не иметь решения вообще. Система Matlab-Simulink выдает предупреждение в случае обнаружения алгебраического цикла (algebraic loop) при моделировании.

Для того, чтобы не было алгебраического цикла, правая часть разностного уравнения (аналогичного уравнению (*)) не должна зависеть от . Это будет в том случае, если передаточная функция  – строго правильная, т.е., степень ее числителя меньше степени знаменателя. Из всех рассмотренных вариантов переоборудования интегратора этому условию удовлетворяет метод Эйлера, который мы и будем использовать в работе. При попытке применить метод обратных разностей или преобразование Тастина возникает алгебраический цикл, потому что степени числителя и знаменателя передаточной функции  равны.



Центральный процессор

Центральный процессор (ЦП; англ. central processing unit, CPU, дословно — центральное вычислительное устройство) — исполнитель машинных инструкций, часть аппаратного обеспечения компьютера или программируемого логического контроллера, отвечающий за выполнение операций, заданных программами.

Современные ЦП, выполняемые в виде отдельных микросхем (чипов), реализующих все особенности, присущие данного рода устройствам, называют микропроцессорами. С середины 1980-х последние практически вытеснили прочие виды ЦП, вследствие чего термин стал всё чаще и чаще восприниматься как обыкновенный синоним слова «микропроцессор». Тем не менее, это не так: центральные процессорные устройства некоторых суперкомпьютеров даже сегодня представляют собой сложные комплексы больших (БИС) и сверхбольших интегральных схем (СБИС).

Изначально термин Центральное процессорное устройство описывал специализированный класс логических машин, предназначенных для выполнения сложных компьютерных программ. Вследствие довольно точного соответствия этого назначения функциям существовавших в то время компьютерных процессоров, он естественным образом был перенесён на сами компьютеры. Начало применения термина и его аббревиатуры по отношению к компьютерным системам было положено в 1960-е годы. Устройство, архитектура и реализация процессоров с тех пор неоднократно менялись, однако их основные исполняемые функции остались теми же, что и прежде.

Ранние ЦП создавались в виде уникальных составных частей для уникальных, и даже единственных в своём роде, компьютерных систем. Позднее от дорогостоящего способа разработки процессоров, предназначенных для выполнения одной единственной или нескольких узкоспециализированных программ, производители компьютеров перешли к серийному изготовлению типовых классов многоцелевых процессорных устройств. Тенденция к стандартизации компьютерных комплектующих зародилась в эпоху бурного развития полупроводниковых элементов, мейнфреймов и миникомпьютеров, а с появлением интегральных схем она стала ещё более популярной. Создание микросхем позволило ещё больше увеличить сложность ЦП с одновременным уменьшением их физических размеров. Стандартизация и миниатюризация процессоров привели к глубокому проникновению основанных на них цифровых устройств в повседневную жизнь человека. Современные процессоры можно найти не только в таких высокотехнологичных устройствах, как компьютеры, но и в автомобилях, калькуляторах, мобильных телефонах и даже в детских игрушках. Чаще всего они представлены микроконтроллерами, где помимо вычислительного устройства на кристалле расположены дополнительные компоненты (память программ и данных, интерфейсы, порты ввода/вывода, таймеры, и др.). Современные вычислительные возможности микроконтроллера сравнимы с процессорами персональных ЭВМ десятилетней давности, а чаще даже значительно превосходят их показатели.

 

Архитектура фон Неймана

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

Д. фон Нейман придумал схему постройки компьютера в 1946 году.

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

Этапы цикла выполнения:

1. Процессор выставляет число, хранящееся в регистре счётчика команд, на шину адреса, и отдаёт памяти команду чтения;

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

3. Процессор получает число с шины данных, интерпретирует его как команду (машинную инструкцию) из своей системы команд и исполняет её;

4. Если последняя команда не является командой перехода, процессор увеличивает на единицу (в предположении, что длина каждой команды равна единице) число, хранящееся в счётчике команд; в результате там образуется адрес следующей команды;

Снова выполняется п. 1.

Данный цикл выполняется неизменно, и именно он называется процессом (откуда и произошло название устройства).

Во время процесса процессор считывает последовательность команд, содержащихся в памяти, и исполняет их. Такая последовательность команд называется программой и представляет алгоритм работы процессора. Очерёдность считывания команд изменяется в случае, если процессор считывает команду перехода — тогда адрес следующей команды может оказаться другим. Другим примером изменения процесса может служить случай получения команды останова или переключение в режим обработки прерывания.

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

 

Конвейерная архитектура

Конвейерная архитектура (pipelining) была введена в центральный процессор с целью повышения быстродействия. Обычно для выполнения каждой команды требуется осуществить некоторое количество однотипных операций, например: выборка команды из ОЗУ, дешифрация команды, адресация операнда в ОЗУ, выборка операнда из ОЗУ, выполнение команды, запись результата в ОЗУ. Каждую из этих операций сопоставляют одной ступени конвейера. Например, конвейер микропроцессора с архитектурой MIPS-I содержит четыре стадии:

1. получение и декодирование инструкции (Fetch)

2. адресация и выборка операнда из ОЗУ (Memory access)

3. выполнение арифметических операций (Arithmetic Operation)

4. сохранение результата операции (Store)

После освобождения k-й ступени конвейера она сразу приступает к работе над следующей командой. Если предположить, что каждая ступень конвейера тратит единицу времени на свою работу, то выполнение команды на конвейере длиной в n ступеней займёт n единиц времени, однако в самом оптимистичном случае результат выполнения каждой следующей команды будет получаться через каждую единицу времени.

Действительно, при отсутствии конвейера выполнение команды займёт n единиц времени (так как для выполнения команды по прежнему необходимо выполнять выборку, дешифрацию и т. д.), и для исполнения m команд понадобится единиц времени; при использовании конвейера (в самом оптимистичном случае) для выполнения m команд понадобится всего лишь n + m единиц времени.

Факторы, снижающие эффективность конвейера:

· простой конвейера, когда некоторые ступени не используются (напр., адресация и выборка операнда из ОЗУ не нужны, если команда работает с регистрами);

· ожидание: если следующая команда использует результат предыдущей, то последняя не может начать выполняться до выполнения первой (это преодолевается при использовании внеочередного выполнения команд, out-of-order execution);

· очистка конвейера при попадании в него команды перехода (эту проблему удаётся сгладить, используя предсказание переходов).

 

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

 

Параллельная архитектура

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

Для преодоления этого недостатка предлагались и предлагаются архитектуры процессоров, которые называются параллельными. Параллельные процессоры используются в суперкомпьютерах.

Гарвардская архитектура ЭВМ, отличительным признаком которой является раздельное хранение и обработка команд и данных. Архитектура была разработана Говардом Эйкеном в конце 1930-х годов в Гарвардском университете.

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

Существуют гибридные модификации архитектур, сочетающие достоинства как Гарвардской, так и фон-Неймановской архитектур. Современные CISC-процессоры обладают раздельной кэш-памятью 1-го уровня для инструкций и данных, что позволяет им за один такт получать одновременно как команду, так и данные для её выполнения, то есть процессорное ядро, формально, является гарвардским, но с программной точки зрения выглядит как фон-Неймановское, что упрощает написание программ. Обычно в данных процессорах одна шина используется и для передачи команд, и для передачи данных, что упрощает конструкцию системы. Современные варианты таких процессоров могут иногда содержать встроенные контроллеры сразу нескольких разнотипных шин для работы с различными типами памяти — например, DDR RAM и Flash. Тем не менее, и в этом случае шины, как правило, используются и для передачи команд, и для передачи данных без разделения, что делает данные процессоры еще более близкими к фон-Неймановской архитектуре при сохранении плюсов Гарвардской архитектуры.

Возможными вариантами параллельной архитектуры могут служить (по классификации Флинна):

SISD — один поток команд, один поток данных;

SIMD — один поток команд, много потоков данных;

MISD — много потоков команд, один поток данных;

MIMD — много потоков команд, много потоков данных.

Первым компьютером, в котором была использована идея гарвардской архитектуры, был Марк I. Гарвардская архитектура используется в ПЛК и микроконтроллерах, таких, как Atmel AVR, Intel 4004, Intel 8051.

 

Суперскалярная архитектура

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

 

CISC-процессоры

Complex Instruction Set Computer — вычисления со сложным набором команд. Процессорная архитектура, основанная на усложнённом наборе команд. Типичными представителями CISC является семейство микропроцессоров Intel x86 (хотя уже много лет эти процессоры являются CISC только по внешней системе команд).

 

RISC-процессоры

Reduced Instruction Set Computer — вычисления с сокращённым набором команд. Архитектура процессоров, построенная на основе сокращённого набора команд. Характеризуется наличием команд фиксированной длины, большого количества регистров, операций типа регистр-регистр, а также отсутствием косвенной адресации. Концепция RISC разработана Джоном Коком (John Cocke) из IBM Research, название придумано Дэвидом Паттерсоном (David Patterson).

Среди первых реализаций этой архитектуры были процессоры MIPS, PowerPC, SPARC, Alpha, PA-RISC. В мобильных устройствах широко используются ARM-процессоры.

 

MISC-процессоры

Minimum Instruction Set Computer — вычисления с минимальным набором команд. Дальнейшее развитие идей команды Чака Мура, который полагает, что принцип простоты, изначальный для RISC-процессоров, слишком быстро отошёл на задний план. В пылу борьбы за максимальное быстродействие, RISC догнал и перегнал многие CISC процессоры по сложности. Архитектура MISC строится на стековой вычислительной модели с ограниченным числом команд (примерно 20-30 команд).

 

 



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

Микроконтроллер (MCU) — микросхема, предназначенная для управления электронными устройствами. Типичный микроконтроллер сочетает в себе функции процессора и периферийных устройств, может содержать ОЗУ и ПЗУ. По сути, это однокристальный компьютер, способный выполнять простые задачи. Использование одной микросхемы, вместо целого набора, как в случае обычных процессоров, применяемых в персональных компьютерах, значительно снижает размеры, энергопотребление и стоимость устройств, построенных на базе микроконтроллеров.

Микроконтроллеры являются основой для построения встраиваемых систем, их можно встретить во многих современных приборах, таких, как телефоны, стиральные машины и т. п. Большая часть выпускаемых в мире процессоров — микроконтроллеры.

Термин «микроконтроллер» (МК) вытеснил из употребления ранее использовавшийся термин «однокристальная микро-ЭВМ». Первый же патент на однокристальную микро-ЭВМ был выдан в 1971 году инженерам М. Кочрену и Г. Буну, сотрудникам Texas Instruments. Именно они предложили на одном кристалле разместить не только микропроцессор, но и память, устройства ввода-вывода. С появлением однокристальных микро-ЭВМ связывают начало эры компьютерной автоматизации в области управления. По-видимому, это обстоятельство и определило термин «микроконтроллер» (control — управление). В 1979 году НИИ ТТ разработали однокристальную 16-разрядную ЭВМ К1801ВЕ1, архитектура которой называлась «Электроника НЦ». В 1980 году фирма Intel выпускает микроконтроллер i8048. Чуть позже в этом же году Intel выпускает следующий микроконтроллер: i8051. Удачный набор периферийных устройств, возможность гибкого выбора внешней или внутренней программной памяти и приемлемая цена обеспечили этому микроконтроллеру успех на рынке. С точки зрения технологии микроконтроллер i8051 являлся для своего времени очень сложным изделием — в кристалле было использовано 128 тыс. транзисторов, что в 4 раза превышало количество транзисторов в 16-разрядном микропроцессоре i8086.

На сегодняшний день существует более 200 модификаций микроконтроллеров, совместимых с i8051, выпускаемых двумя десятками компаний, и большое количество микроконтроллеров других типов. Популярностью у разработчиков пользуются 8-битные микроконтроллеры PIC фирмы Microchip Technology и AVR фирмы Atmel, шестнадцатибитные MSP430 фирмы TI, а также ARM, архитектуру которых разрабатывает фирма ARM и продаёт лицензии другим фирмам для их производства.

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

В то время как 8-разрядные процессоры общего назначения полностью вытеснены более производительными моделями, 8-разрядные микроконтроллеры продолжают широко использоваться. Это объясняется тем, что существует большое количество применений, в которых не требуется высокая производительность, но важна низкая стоимость. В то же время, есть микроконтроллеры, обладающие больши́ ми вычислительными возможностями, например цифровые сигнальные процессоры.

Ограничения по цене и энергопотреблению сдерживают также рост тактовой частоты контроллеров. Хотя производители стремятся обеспечить работу своих изделий на высоких частотах, они, в то же время, предоставляют заказчикам выбор, выпуская модификации, рассчитанные на разные частоты и напряжения питания. Во многих моделях микроконтроллеров используется статическая память для ОЗУ и внутренних регистров. Это даёт контроллеру возможность работать на меньших частотах и даже не терять данные при полной остановке тактового генератора. Часто предусмотрены различные режимы энергосбережения, в которых отключается часть периферийных устройств и вычислительный модуль.

Большое распространение получили микроконтроллеры с RISC-архитектурой. Сокращенный набор команд позволяет выполнять большинство инструкций за один такт, что обеспечивает высокое быстродействие даже при относительно низкой тактовой частоте.

Кроме ОЗУ, микроконтроллер может иметь встроенную энергонезависимую память для хранения программы и данных. Во многих контроллерах вообще нет шин для подключения внешней памяти. Наиболее дешёвые типы памяти допускают лишь однократную запись. Такие устройства подходят для массового производства в тех случаях, когда программа контроллера не будет обновляться. Другие модификации контроллеров обладают возможностью многократной перезаписи энергонезависимой памяти. В отличие от процессоров общего назначения, в микроконтроллерах часто используется гарвардская архитектура памяти, то есть раздельное хранение данных и команд в ОЗУ и ПЗУ соответственно.

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

Архитектура AVR

Рассмотрим в качестве примера архитектуру типового микроконтроллера AVR компании ATMEL. Внутри контроллера находится система из вычислительного блока (ALU), регистров, оперативной памяти, памяти программ и периферийных устройств. Во многих современных контроллерах также есть EEPROM - это энергонезависимая память, наподобие flash памяти, только допускает куда больше циклов перезаписи. Все это завязано общей шиной, собрано на одном кристалле и залито компаундом.

ALU занимается всеми операциями процессора, сложениями, вычитаниями, сдвигами и прочим. Это математическое ядро контроллера. Операнды на вход ALU поступают из регистров общего назначения (РОН), а результат появляется на шине и обрабатывается в соответствии с текущей командой.

Блок регистров (РОН), он же регистровый файл. Это пачка из 32 ячеек памяти по 8 бит каждая. Отличаются самой быстрой скоростью работы, а также с ними производятся почти все процессорные операции.

Память программ, она же flash, она же ROM память. Это место, где хранится код программы, а также разные статичные данные, например таблицы или строки текста. Особенность контроллеров AVR (впрочем как и многих других микроконтроллеров) в том, что память программ и память данных у них жестко разделены и находятся в разных адресных пространствах.

Оперативная память, или память данных состоит из восьмиразрядных ячеек, способных содержать любое значение. Так же тут находится специальная область памяти - стек. Эта память в основном хранит в себе адреса возвратов из подпрограмм, а при использовании высокоуровневых языков, то через стек передаются еще и аргументы для вызываемых функций.

 

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

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

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



Порты микроконтроллера.

Порт в МК – это, как правило, 8 выводов или линий ввода-вывода (I/O), имеющие индивидуальные номера от 0 до 7 и общую букву A, B, C, D, ... отличающую этот порт от других. Количество портов, а также количество линий ввода-вывода в портах зависит от конкретной модели микроконтроллера. Рассматриваемый в книге микроконтроллер, ATmega16 имеет 4 порта с общим количеством линий ввода-вывода, равным 32.

Через линии ввода-вывода микроконтроллер может осуществлять прием и передачу цифровых сигналов. Задание направления передачи данных через любой контакт ввода/вывода может быть произведено программно в любой момент времени.

Выходные буферы всех портов, имея симметричные нагрузочные характеристики, обеспечивают высокую нагрузочную способность при любом уровне сигнала. Нагрузочной способности достаточно, например, для непосредственного управления светодиодными индикаторами. Входные буферы всех выводов построены по схеме триггера Шмидта. Для всех входов имеется возможность подключения внутреннего подтягивающего резистора между входом и шиной питания Vcc. Отличительной особенностью портов микроконтроллеров семейства Mega (как и всех микроконтроллеров AVR) при использовании их в качестве цифровых портов ввода/вывода общего назначения является реализация истинной функциональности «чтение/модификация/запись». Благодаря этому можно выполнять операции над любым выводом, не влияя на другие выводы порта. Это относится к изменению режима работы контакта ввода/вывода, к изменению состояния выходного буфера (для выходов) и к изменению состояния внутреннего подтягивающего резистора (для входов).

Обращение к портам осуществляется через регистры ввода/вывода. Под каждый порт в адресном пространстве ввода/вывода зарезервировано по 3 адреса, по которым размещены следующие регистры (в данном случае, используется порт B, аналогично и для любого другого порта МК):

DDRB - значение битов в этом регистре определяет, чем будет вывод этого порта с номером этого бита - начальное (при включении МК или после сброса) значение " 0" - ножка вход, если сделать бит равным «1», то этот вывод станет выходом.

PINB - биты этого регистра показывают чем (" 1" или " 0" ) считает МК напряжение на выводе порта с номером этого бита. (этот регистр можно только читать). Правила, по которым МК определяет логический уровень на выводах, описаны выше.

PORTB - бит этого регистра нужно сделать " 1" или " 0", чтобы на выводе порта с номером этого бита появилась " 1" или " 0". При этом такой же бит регистра DDRB должен быть " 1" - т.е. вывод должен быть выходом. Если вывод сконфигурирован как вход (т.е. его бит в регистре DDRB равен нулю), то если, очищен и соответствующий бит в регистре PORB, вывод будет высокоимпедансным входом (Z-состояние), а если бит в регистре PORB установлен, т.е. равен " 1", то включается " подтяжка" высокоимедансного входа к + питания МК через встроенный резистор - ножку как бы соединяют резистором с питанием МК.

Таблица 1. Таблица возможных состояний вывода МК.

Значение бита_х

Состояние вывода МК
Программа может только читать этот бит!

Программа управляет этими битами

PBx

PINB.x DDRB.x PORTB.x
1

1

1 Высокий лог. уровень (вывод как бы подсоединен к питанию МК резистором около 20 Ом)
0 0 Низкий лог. уровень (вывод как бы заземлен резистором около 20 Ом)

Определяется только реальным напряжением на ножке МК Напряжение преобразуется в " 1" или " 0" по приведенным выше правилам.

0

1 Подтяжка - pull-up. Вывод как бы подсоединен к питанию МК через резистор 40 КОм
0 Z-состояние. Высокоомный вход

Аналогичную схему можно составить для любого порта МК.

Таким образом, 32 I/O вывода микроконтроллера ATmega16 могут быть программно и индивидуально сконфигурированы (и переконфигурированы уже при выполнении управляющей программы) как:

1) входы с высоким (более 10 МОм) входным сопротивлением (для напряжений от 0 до напряжения питания МК) или Z-вход;

2) входы по п1), но с подключенным внутренним подтягивающим резистором на + питания МК (номинал резистора составляет около 40 кОм);

3) как выходы способные обеспечить ток до 20 мА (но общий ток на порт только до 80 мА, а ток всех портов до 200 мА в DIP корпусе и до 400 мА в ASMD корпусе)

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

Также приведем пример программной реализации конфигурации портов на языке Си.

PORTA=0x00;

DDRA=0xFF;

PORTB=0x00;

DDRB=0x00;

PORTC=0xFF;

DDRC=0x00;

PORTD=0x03;

DDRD=0x0A;

В приведенном примере порт А полностью сконфигурирован как выход (в регистр DDRA записано 0хFF, что означает 256 в десятичной системе счисления(знак 0х указывает на шестнадцатеричную систему счисления), таким образом, во все биты данного регистра записаны единицы), в регистр PORTA записано число 0х00 или 0 в десятичной системе счисления, что означает, что изначально на всех выводах порта А будет логический 0). Все выводы порта В сконфигурированы как входы в Z состоянии (в регистр DDRB записано 0х00, что означает 0 в десятичной системе счисления, в регистр PORTB также записан 0). Порт С полностью сконфигурирован как вход с подтяжкой (в регистр DDRC записано 0х00, что означает 0 в десятичной системе счисления, в регистр PORTB записано число 256). Выводы же порта D сконфигурированы по-разному (выводы 7-4 и вывод 2 – как входы в Z состоянии, вывод 0 – как вход с подтяжкой, вывод 1 – как выход с высоким логическим уровнем, вывод 3 – как выход с низким логическим уровнем). Поясним как это сделано более подробно.

В регистр DDRD записано число 0х0А или 10. Общее число, записываемое в регистр DDRD может быть представлено в виде:

 

DDRD = 1*x0+2*x1+4*x2+8*x3+16*x4+32*x5+64*x6+128*x7

 

Здесь x0…x7 – значения, определяющие, чем будет конкретный вывод порта (1 – если данный вывод является выходом, 0 – если входом). В нашем случае выходами являются выводы 1 и 3 порта, соответственно x1 = 1 и x3 = 1, остальные же выводы – входы, соответствующие им значения x0, x2, x4…x7 должны быть равны 0. Получаем:

 

DDRD = 1*0+2*1+4*1+8*0+16*0+32*0+64*0+128*0 = 10 = 0х0А

 

В регистр PORTD записано число 0х03 или 3 в десятичной системе счисления. Общее число, записываемое в регистр PORTD, может быть представлено в виде, схожем с общим видом регистра DDRD:

 

PORTD = 1*x0+2*x1+4*x2+8*x3+16*x4+32*x5+64*x6+128*x7

 

В этом случае для выходов соответствующее значение x определяет состояние начальное состояние вывода (логическую единицу (соответствующий бит регистра тоже должен быть равным 1) или ноль), для выходов – Z состояние (для этого соответствующий бит должен быть равным 0), либо подтяжку (для этого соответствующий бит должен быть равным 1). Получим следующее выражение:

 

PORTD = 1*1+2*1+4*0+8*0+16*0+32*0+64*0+128*0 = 3 = 0х03

 

Вывод 0 – вход с подтяжкой, поэтому x0 = 1, вывод 1 – выход с высоким логическим уровнем, поэтому x1=1, вывод 2, 4-7 – входы в Z состоянии, поэтому соответствующие значения x2, x4…x7 – равны 0. Вывод 3 – выход с низким логическим уровнем, поэтому x3 = 0.

Таким образом, изменять состояние вывода МК можно командами PORTX=Y, где Y – требуемое число, при условии, что этот вывод сконфигурирован как выход (в соответствующие биты DDRX записаны 1). На практике чаще применяется форма записи PORTX.Y = 1, PORTX.Y = 0, где X – название соответствующего порта, Y – номер вывода порта. Это объясняется тем, что в этом случае не требуется вычислять требуемое значение регистра PORTX и можно легко изменять состояние требуемых выводов. В то же время, когда необходимо одновременно изменить состояние всего порта, то чаще обращаются ко всему регистру, а не к отдельным его битам.

Считывать же состояние вывода МК можно обращаясь к регистру PORTX или к отдельным выводам порта PORTX.Y, например, так:

 

If (PIND.2 == 1) PORTA.0=1;

 

Эта строчка означает следующее: если на выводе 2 порта D логическая 1, то послать на вывод 0 порта A единицу.

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

Для более подробной информации о конфигурации портов и работы с внешними сигналами смотрите пример  «Внешние сигналы МК. Работа с портами».

 



Прерывание

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

 

В зависимости от источника возникновения сигнала прерывания делятся на:

асинхронные или внешние (аппаратные) — события, которые исходят от внешних источников (например, периферийных устройств) и могут произойти в любой произвольный момент: сигнал от таймера, сетевой карты или дискового накопителя, нажатие клавиш клавиатуры, движение мыши;

внутренние — события в самом процессоре как результат нарушения каких-то условий при исполнении машинного кода: деление на ноль или переполнение, обращение к недопустимым адресам или недопустимый код операции;

программные (частный случай внутреннего прерывания) — инициируются исполнением специальной инструкции в коде программы. Программные прерывания как правило используются для обращения к функциям встроенного программного обеспечения (firmware), драйверов и операционной системы.

Маскирование

В зависимости от возможности запрета внешние прерывания делятся на:

маскируемые — прерывания, которые можно запрещать установкой соответствующих битов в регистре маскирования прерываний (в x86-процессорах — сбросом флага IF в регистре флагов);

немаскируемые (англ. Non maskable interrupt, NMI) — обрабатываются всегда, независимо от запретов на другие прерывания. К примеру, такое прерывание может вызвать сбой в микросхеме памяти.

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

Приоритезация

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

Перехват прерывания — изменение обработчика прерывания на свой собственный.

Вектор прерывания — закреплённый за устройством номер, который идентифицирует соответствующий обработчик прерываний. Векторы прерываний объединяются в таблицу векторов прерываний. Местоположение таблицы зависит от типа и режима работы процессора.

Программное прерывание — синхронное прерывание, которое может осуществить программа с помощью специальной инструкции.

 

Аппаратные прерывания

Прерывание – операция, которая прекращает нормальный ход программы для выполнения приоритетной задачи, определяемой внутренним или внешним событием микроконтроллера. При возникновении прерывания микроконтроллер сохраняет в стеке содержимое счетчика команд PC и загружает в него адрес соответствующего вектора прерывания. По этому адресу, как правило, находится команда безусловного перехода к подпрограмме обработки прерывания. Последней командой подпрограммы обработки прерывания должна быть команда RETI, которая осуществляет возврат в основную программу и восстановление предварительно сохраненного счетчика команд. Иными словами при возникновении события, которое может вызвать разрешенное в данный момент времени прерывание (список таких событий приведен в описании МК, в разделе «Interrupts» (таблица " Reset and Interrupt Vectors" )) и при глобальном разрешении прерываний (бит7 в регистре SREG " установлен" ), выполнение программы МК останавливается, сохраняются (запоминаются) место остановки и некоторые нужные данные, бит7 в регистре SREG обнуляется, очищается флаг сработавшего прерывания и затем происходит вызов и выполнение функции обработчика данного прерывания.

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

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

От момента наступления события до начала выполнения функции обработчика прерывания проходит не менее 4 тактов процессора. Т.е. скорость реакции на прерывание напрямую зависит от частоты, на которой работает МК.

В МК ATtmega за обработку прерываний отвечает регистр под названием SREG. Биты этого регистра отвечают как за отдельные прерывания, так и за прерывания в целом. Бит7 данного регистра называется " I ". Если этот бит равен " 1" (установлен), то глобально разрешены прерывания – значит, могут возникать разрешенные индивидуально прерывания.

Если этот бит равен " 0" (бит сброшен, очищен), то глобально запрещены прерывания – значит, любые события не вызывают прерывания программы.

Флаг прерывания - это просто бит, который становится " 1" (устанавливается) при возникновении события, которое может вызвать прерывание независимо от того разрешены ли прерывания глобально (установленным битом 7 в SREG) или индивидуально - т.е. флаг устанавливается даже если прерывание не обрабатывалось программой и не было разрешено.

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

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

Если возникнет несколько разрешенных прерываний одновременно, то первым будет выполняться то, которое выше в списке векторов прерываний МК в таблице " Reset and Interrupt Vectors" описания МК. Соответственно по мере отработки накопившихся и разрешенных прерываний их флаги будут очищаться. В то же время флаги неразрешенных прерываний не очистятся пока программа этого не сделает записью в них числа 0.

Прерывания могут быть разрешены или запрещены как индивидуально, так и все сразу (глобально). Для того, чтобы глобально запретить прерывания можно использовать команду #asm(" cli" ), чтобы глобально разрешить прерывания - #asm(" sei" ).

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

В МК AVR и других, прерывания могут возникать по многим событиям:

- изменение уровня на некоторых ножках МК

- " 0" на некоторых ножках МК

- переполнение таймеров

- " насчитывание" таймером определенного значения

- завершение АЦП преобразования

- изменение уровня на выходе компаратора

- события в USART и т.д.

Пример объявления функций обработки прерываний в CodeVision:

interrupt [прерывание] void adc_isr(void)

{

код выполняемый при возникновении прерывания, разрешенного локально (значит, индивидуально - в данном примере это прерывание по завершении АЦП) и если прерывания разрешены глобально - т.е. бит I в SREG установлен.

}

В заключение следует отметить, что все прерывания могут быть легко настроены с использованием ГНК компилятора. Механизм настройки и работы прерываний будет рассмотрен в примере под названием «Обработка прерываний. Работа с таймерами», а также в последующих разделах книги.

Таймеры

Таймер (от англ. Timer) — в информатике средство обеспечения задержек и измерения времени средствами компьютера.

Главной характеристикой таймера является его точность — минимальный гарантированно выдерживаемый интервал времени. По этому параметру таймеры делят на:

малоточные (ошибка измерения может достигать 0, 1 с)

точные (ошибка измерения не превышает 0, 001 с)

сверхточные (ошибка измерения не превышает 10− 6 c)

 

Существуют два вида таймеров:

Аппаратные таймеры функционируют независимо от центрального процессора и в момент срабатывания посылают прерывание.

Программные таймеры реализуются за счёт выполнения в цикле заданного количества одинаковых «пустых» операций. При фиксированной частоте работы процессора это позволяет точно определять прошедшее время. Главными минусами такого метода являются: зависимость количества итераций цикла от типа и частоты процессора, невозможность выполнения других операций во время задержки.

 

Сторожевой таймер (контрольный таймер, англ. Watchdog timer) — аппаратно реализованная схема контроля за зависанием системы. Представляет собой таймер, который периодически сбрасывается контролируемой системой. Если сброса не произошло в течение некоторого интервала времени, происходит принудительная перезагрузка системы. В некоторых случаях сторожевой таймер может посылать системе сигнал на перезагрузку («мягкая» перезагрузка), в других же — перезагрузка происходит аппаратно (например, замыканием контактов кнопки Reset).

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

В МК ATMega16 есть три таймера/счетчика – два 8-битных (Timer/Counter0, Timer/Counter2) и один 16-битный (Timer/Counter1). Каждый из них содержит специальные регистры, одним из которых является счетный регистр TCNTn (n – это число 0, 1 или 2). Каждый раз, когда процессор выполняет одну команду, содержимое этого регистра увеличивается на единицу (либо каждые 8, 64, 256 или 1024 тактов). Потому он и называется счетным. Помимо него, есть еще и регистр сравнения OCRn (Output Compare Register), в который мы можем сами записать какое-либо число. У 8-битного счетчика эти регистры 8-битные. По мере выполнения программы содержимое TCNTn растет и в какой-то момент оно совпадет с содержимым OCRn. Тогда (если заданы специальные параметры) в регистре флагов прерываний TIFR (Timer/Counter Interrupt Flag Register) один из битов становится равен единице и процессор, видя запрос на прерывание, сразу же отрывается от выполнения бесконечного цикла и идет обслуживать прерывание таймера. После этого процесс повторяется.

Ниже представлена временная диаграмма режима CTC (Clear Timer on Compare). В этом режиме счетный регистр очищается в момент совпадения содержимого TCNTn и OCRn, соответственно меняется и период вызова прерывания.

Это далеко не единственных режим работы таймера/счетчика. Можно не очищать счетный регистр в момент совпадения, тогда это будет режим генерации широтно-импульсной модуляции, который мы рассмотрим в следующей статье. Можно менять направление счета, т. е. содержимое счетного регистра будет уменьшаться по мере выполнения программы. Также возможно производить счет не по количеству выполненных процессором команд, а по количеству изменений уровня напряжения на «ножке» T0 или T1 (режим счетчика), можно автоматически, без участия процессора, менять состояние ножек OCn в зависимости от состояния таймера. Таймер/Счетчик1 умеет производить сравнение сразу по двум каналам – А или В.

Далее представлена функциональная схема таймера/счетчика0:

Для запуска таймера нужно выставить соответствующие биты в регистре управления таймером TCCRn (Timer/Counter Control Register), после чего он сразу же начинает свою работу.

Мы рассмотрим лишь некоторые режимы работы таймера. Если вам потребуется работа в другом режиме, то читайте Datasheet к ATMega16 – там все подробнейше по-английски написано, даны даже примеры программ на С и ассемблере (недаром же он занимает 357 страниц печатного текста! ).

Теперь займемся кнопками.

Если мы собираемся использовать небольшое количество кнопок (до 9 штук), то подключать их следует между «землей» и выводами какого-либо порта микроконтроллера. При этом следует сделать эти выводы входами, для чего установить соответствующие биты в регистре DDRx и включить внутренний подтягивающий резистор установкой битов в регистре PORTx. При этом на данных «ножках» окажется напряжение 5 В. При нажатии кнопки вход МК замыкается на GND и напряжение на нем падает до нуля (а может быть и наоборот – вывод МК замкнут на землю в отжатом состоянии). При этом меняется регистр PINx, в котором хранится текущее состояние порта (в отличие от PORTx, в котором установлено состояние порта при отсутствии нагрузки, т. е. до нажатия каких-либо кнопок). Считывая периодически состояние PINx, можно определить, что нажата кнопка.

С таймером вроде все понятно. Но для чего он используется? Рассмотрим бесконечный цикл while(1) в main(). В этом цикле проверяется состояние кнопок путем анализа содержимого регистра PINB. А зачем там стоит задержка на 50 мс? Это устранение т. н. «дребезга клавиш». Дело в том, что при нажатии на кнопку происходит удар одного контакта о другой, и, поскольку контакты металлические, удар этот упругий. Контакты, пружиня, замыкаются и размыкаются несколько раз, несмотря на то, что палец сделал лишь одно нажатие. Это приводит к тому, что МК фиксирует несколько нажатий. Давайте рассмотрим график зависимости напряжения на выходе PC0 от времени. Он может выглядеть так:

Точка А – момент нажатия кнопки. Он может быть зафиксирован МК. Затем идут несколько замыканий и размыканий (их может и не быть, а может быть и 12 штук – это явление можно считать случайным). В точке B контакт уже надежно зафиксирован. Между A и B в среднем около 10 мс. Наконец, в точке D происходит размыкание. Как же избавиться от этого неприятного явления? Оказывается, очень просто. Нужно зафиксировать момент нажатия кнопки (точка А), через какое-то время, например, 50 мс (точка С) проверить, что кнопка действительно нажата, сделать действие, соответствующее этой кнопке и ждать момент ее отпускания (точка D). То есть нужно сделать паузу от А до С, такую, чтобы весь «дребезг» оказался внутри этой паузы. А попробуйте теперь убрать строчку, формирующую задержку, откомпилировать программу и зашить ее в МК. Путем простых нажиманий на кнопки сможете легко убедиться, что все эти «мучения» не были напрасными.

А что же делать, если к МК нужно подключить, скажем, 40 кнопок? Ведь у него всего лишь 32 вывода. Казалось бы, никак. На самом деле это возможно. В таком случае используют алгоритм, называемый стробированием. Для этого нужно кнопки соединить в виде матрицы, как это показано на рисунке (рисунок взят из книги Мортона «МК AVR, вводный курс», где написано про программирование AVR на ассемблере).

При подаче на вывод PB0 лог. 1 (+5В), а на выводы PB1 и PB2 лог. 0 разрешается обработка кнопок 1, 4 и 7. После этого состояние каждой из них можно узнать, проверив напряжение на одном из выводов PB3..PB5. Таким образом, подавая последовательно на выводы PB0..PB2 лог. 1, можно определить состояние всех кнопок. Понятное дело, что выводы PB0..PB2 должны быть выходами, а PB0..PB2 входами. Чтобы определить, какое количество выводов потребуется для массива из Х кнопок, нужно найти пару сомножителей Х, сумма которых наименьшая (для нашего случая с 40 кнопками это будут числа 5 и 8). Это означает, что к одному МК можно подключить до 256 кнопок (а с применение дешифраторов и того больше, но о дешифраторах потом). Лучше сделать меньшее число выводов выходами, а большее – входами. В этом случае опрос всех строк матрицы займет меньше времени. Подобный способ подключения (стробирование) свойственен не только для кнопок. Там можно подключать самые разнообразные устройства, начиная от матриц светодиодов и заканчивая микросхемами flash-памяти.

 

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

 

Таблица 2. Таймеры/счетчики общего назначения

 

Как видно из таблицы, во всех МК семейства есть, по крайней мере, 2 таймера/счетчика общего назначения – T0 и T1. Таймер/счетчик T0 имеет минимальный набор функций, который, тем не менее, зависит от модели МК. В одних моделях он может использоваться только для отсчета и измерения временных интервалов или как счетчик внешних событий. В других моделях к этим функциям добавляется возможность генерации сигналов с широтно-импульсной модуляцией (ШИМ) фиксированной разрядности (один или два канала), а также возможность работать в асинхронном режиме в качестве часов реального времени (в моделях ATmega64x/128x).

Таймер/счетчик Т1 тоже может использоваться для отсчета временных интервалов и как счетчик внешних событий. Кроме того, он может осуществлять запоминание своего состояния по внешнему сигналу. Как и таймер/счетчик ТО, он может работать в качестве 2- или 3-канального широтно-импульсного модулятора, но уже переменной разрядности. Количество каналов ШИМ зависит от модели.

Таймер/счетчик Т2 практически полностью аналогичен таймеру/счетчику ТО. Во всех моделях, кроме ATmega64x/128x, таймер/счетчик Т2 может работать в асинхронном режиме.

Таймеры/счетчики ТЗ...Т5 по функциональным возможностям идентичны таймеру/счетчику Т1.

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

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

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

При этом следует помнить, что при использовании альтернативных функций линий портов ввода/вывода, необходимо, как правило, самостоятельно сконфигурировать эти выводы в соответствии с их функциональным назначением. При использовании компилятора Code Vision настройка таймеров на тот или иной режим работы, а также конфигурация выводов МК может быть осуществлена интерактивно с помощью ГНК.

Алгоритм работы с таймерами предполагает использование прерываний, например, при переполнении таймера. В старых моделях для разрешения/запрещения прерываний от таймеров/счетчиков использовалось от одного до двух регистров ввода/вывода. В новых моделях число таких регистров C...6) равно числу счетчиков в конкретной модели. Точно так же дело обстоит и с регистрами, содержащими флаги прерываний. Названия и адреса всех этих регистров можно узнать по соответствующим таблицам в описании МК. Здесь лишь отметим, что для разрешения какого-либо прерывания от таймера/счетчика необходимо установить в 1 соответствующий бит регистра TIMSK (TIMSKn) /ETIMSK и, разумеется, флаг I регистра SREG. Конкретное название регистра, отвечающего за прерывание для того или иного таймера, также можно найти в описании используемого в конструкции МК.



Компаратор

Компаратор (аналоговых сигналов) — электронная схема, принимающая на свои входы два аналоговых сигнала и выдающая логический «0» или «1», в зависимости от того, какой из сигналов больше.

 

Простейший компаратор представляет собой дифференциальный усилитель. Компаратор отличается от линейного операционного усилителя (ОУ) устройством и входного, и выходного каскадов:

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

Выходной каскад компаратора выполняется совместимым по уровням и токам с конкретным типом логических схем (ТТЛ, ЭСЛ и т.п.). Возможны выходные каскады на одиночном транзисторе с открытым коллектором (совместимость с ТТЛ и КМОП логикой).

 

Несколько реже применяются компараторы на основе логических элементов, охваченных обратной связью (см., например, триггер Шмитта - не компаратор по своей природе, но устройство с очень схожей областью применения).

 

Компараторы, построенные на двух дифференциальных усилителях, можно условно разделить на двухвходовые и трёхвходовые. Двухвходовые компараторы применяются в тех случаях, когда сигнал изменяется достаточно быстро (не вызывает дребезга), и на выходе генерируют один из потенциалов, которыми запитаны операционные усилители (как правило - +5В или 0). Трёхвходовые компараторы имеют более широкую область применения и обладают двумя опорными потенциалами, за счёт чего их вольт-амперная характеристика может представлять собой прямоугольную петлю гистерезиса.

 

Пример широко известного компаратора - LM339. Эта микросхема часто встречается, в частности, на материнских платах ЭВМ.



Виды кадров

Ø Кадр данных (data frame) — передаёт данные;

Ø Кадр запроса передачи (remote frame) — служит для запроса на передачу кадра данных с тем же идентификатором;

Ø Кадр перегрузки (overload frame) — обеспечивает промежуток между кадрами данных или запроса;

Ø Кадр ошибки (error frame) — передаётся узлом, обнаружившим в сети ошибку.

Начало кадра (Start of Frame)

Отмечает начало кадра данных или кадра удаленного запроса данных. Состоит из бита с лог. '0'.

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

Поле арбитража (Arbitration Field)

Состоит из идентификатора и RTR-бита.

Поле контроля (CONTROL FIELD)

Включает 6 бит. Это - код длины данных (4бита) и 2 бита зарезервированные под будущие расширения. Зарезервированные биты должны быть " 0".

Поле данных (стандартный и расширенный форматы)

(Data field)

Поле данных состоит из данных, которые будут переданы внутри кадра данных. Оно может содержать от 0 до 8 байт, каждый содержит 8 бит, которые передаются, начиная с MSB.

Поле CRC (стандартный и расширенный форматы)

(CRC field)

Содержит последовательность CRC и CRC - разделитель.

Поле подтверждения (стандартный формат и расширенный формат)

(ACK field)

Поле подтверждения имеет длину два бита и содержит: " область подтверждения" и разделитель подтверждения. В поле подтверждения передающий узел посылает два бита с единичным уровнем. Приемник, который получил сообщение правильно, сообщает об этом передатчику, посылая бит с нулевым уровнем в течение приема поля " область подтверждения".

Конец кадра (стандартный формат и расширенный формат)

(End of frame)

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

Кадр удаленного запроса данных (Remote frame)

Узел, действующий как приемник некоторых данных, может инициировать передачу соответственных данных исходными узлами, посылая кадр удаленного запроса данных.

Кадр удаленного запроса данных существует и в стандартном формате и расширенном формате. В обоих случаях он состоит из шести битовых полей:

" начало кадра" (Start of frame), " поле арбитража" (Arbitration field), " управляющее поле" (Control field), " поле CRC" (CRC - field), " поле подтверждения" (ACK field), " конец кадра" (End of frame).

В отличие от кадра данных, RTR бит кадра удаленного запроса данных - единичный. В этом кадре отсутствует поле данных. При этом значение кода длины данных может принимать любое значение в пределах допустимого диапазона [0, 8]. Значение кода длины данных соответствует коду длины данных кадра данных. RTR бит указывает, является ли переданный кадр кадром данных.

Кадр ошибки (Error frame)

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

Первое поле получается суперпозицией флагов ошибки, полученных от различных узлов. Следующее поле - разделитель ошибки (Error Delimiter).


 

7. Цифровая обработка сигналов

 

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

Компьютер не может непрерывно считывать аналоговые сигналы, а выбирает их только в некоторые моменты времени. Поэтому компьютер воспринимает сигнал в виде последовательности дискретных значений. Дискретизация (sampling) – выборка, оцифровка, квантование – представляет собой считывание сигнала только в определенные моменты времени; этот процесс реализуется в компьютере специальной схемой. Дискретизация включает мультиплексирование и АЦ-преобразование. Эти операции должны быть строго синхронизированы с помощью задающего таймера.

Сама по себе дискретизация происходит очень быстро. Однако во время АЦ-преобразования не должно быть каких-то изменений во входном сигнале, которые могли бы повлиять на цифровой выход. Это обеспечивается операцией выборки и хранения (sample-and-hold) в каждом цикле дискретизации – значение аналогового сигнала считывается в начале каждого интервала и остается постоянным в течение всего времени АЦ-преобразования. Эта операция называется задержкой нулевого порядка (рис. 1). Такой подход используется при численном моделировании нелинейных систем и при дискретизации по времени непрерывных динамических систем.

Рис. 1. Дискретизация аналогового сигнала с задержкой нулевого порядка.

 

Очень важно правильно определить интервал дискретизации аналогового сигнала; в общем случае это представляет собой нетривиальную задачу. Интервал дискретизации h должен быть достаточно коротким, чтобы выходной сигнал с приемлемой точностью описывал изменения аналогового входа. Теоретически частота дискретизации должна более чем в два раза превышать частоту наивысшей составляющей преобразуемого сигнала. Если интервал дискретизации слишком велик, т.е. частота выборки слишком мала, то компьютер получит неверную картину исходного сигнала. В то же время слишком малый интервал, т. е. высокая частота выборки, приводит к тому, что управляющий компьютер выполняет неоправданно много вычислений. Кроме того, чем больше быстродействие – тем дороже устройство.

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

    В общем виде цифровой фильтр можно представить как

 

где h  - это интервал выборки,  - отфильтрованный выход, а y – вход. Аргумент kh, представляющий собой время, можно рассматривать и просто как номер k в последовательности входных значений. Если все коэффициенты  равны нулю, то такой фильтр называется фильтром скользящего среднего. с конечной импульсной характеристикой. Если некоторые либо все коэффициенты  не равны нулю, то такой фильтр называется авторегрессивным и имеет бесконечную импульсную характеристику. Обобщенный фильтр, описываемый приведенным выше уравнением, называется авторегрессивным фильтром скользящего среднего.

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

 

 


Фильтрация

Двумя основными параметрами аналоговой фильтрации являются ширина полосы пропускания и граничная частота. Полоса пропускания – это диапазон частот, проходящих фильтр без изменений. Граничная частота, или частота среза, - это частота, на которой амплитуда сигнала ослабляется в  раз, что соответствует уменьшению мощности в 2 раза по сравнению с пропускаемыми частотами.

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

Преобразованные в цифровую форму измерительные данные должны быть подвергнуты проверке. После АЦ-преобразования необходимо выполнить следующие операции – первичную обработку:

§ компенсировать дрейф;

§ сохранить исходные данные;

§ проверить соответствие исходных данных параметрам датчика – диапазону допустимых выходных значений и диапазону скоростей изменения выходного сигнала; если значение выходит из этих диапазонов, то должны генерироваться аварийные сообщения или другие указания для оператора;

§ вычислить среднее значение исходных данных («посторонние» значения, которые заметно отличаются от других, возможно, должны быть отброшены);

§ применить цифровую фильтрацию;

§ сохранить отфильтрованные данные.

После цифровой фильтрации выполняются:

§ пересчет единиц измерения – масштабирование (при необходимости);

§ линеаризация;

§ другие типы обработки данных, например статистический анализ;

§ в автоматических системах – анализ входных данных для принятия решения о дальнейших действиях, например генерации управляющих или опорных сигналов.

 





Типы шаговых двигателей

Если не углубляться во внутреннюю конструкцию, число шагов и прочие тонкости, то с пользовательской точки зрения существует три типа:

§ Биполярный - имеет четыре выхода, содержит в себе две обмотки.

§ Униполярный - имеет шесть выходов. Содержит в себе две обмотки, но каждая обмотка имеет отвод из середины.

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

 

Структура сервоуправления

Стандартный регулятор положения представляет собой структуру каскадного (подчиненного) типа с П-регулятором положения и ПИ-регулятором скорости во внутреннем подчиненном контуре скорости (структура PIV).

Встроенным элементом регулятора является задатчик профиля скорости (profiler) с заданием параметров рывка, ускорения/замедления и установившейся скорости. Регулятор дополняется форсирующими связями по скорости (velocity feedback) и ускорению (acceleration feedback) для повышения степени астатизма в соответствии с принципами комбинированного управления.

Фиг.1. Структурная схема контроллера для управления электроприводом

Основными преимуществами каскадной структуры является независимая настройка контуров и ограничения переменных. Также такая структура позволяет улучшить равномерность движения на низких скоростях за счет использования более точного измерения низких скоростей (1/T метод).

Некоторые контроллеры предусматривают организацию более простой структуры с контуром положения ПИД-типа без подчиненного контура скорости (структура PID).

Регуляторы позволяют управлять различными структурами внешних контуров – усилителем тока, напряжения или скорости. Другие особенности регуляторов как-то фильтры нижних частот, ограничение интеграла регулятора и др. рассмотрены ниже.

1. 1. Компенсация ошибки положения.

Точность отработки положения при наличии нелинейной механической передачи может быть повышена за счет компенсации задания перемешения (Position error mapping). С помощью дополнительного датчика положения (обычно более высокоточного, например лазерного интерферометра), измеряющего непосредственно перемещение исполнительной оси, вводят корректировки на задание положения, заносимые в таблицу (look up table). Таким образом могут быть компенсированы ошибки позиционирования как отдельно по каждой из осей (1-D), так и при векторном перемещении (2-D).

1.2. Структура " двойная петля" (" dual loop" )

Такая опция за счет постоянного (в отличие от Position error mapping) использования двух датчиков положения - двигателя и нагрузки (объекта) - позволяет компенсировать “мертвый ход” механизма (backlash) или нежесткость механизма путем организации структуры двойной петли обратной связи - " dual loop” (Фиг.1). При этом обратная связь по скорости в подчиненном контуре скорости остается неизменной (т.е. с датчика положения двигателя), что позволяет сохранить неизменной полосу пропускания по скорости.

Планируемое усиление (gain scheduling)

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

 

Синусоидальная коммутация

Для обеспечения непрерывной и более плавной коммутации вектора тока по сравнению с трапециидальной или шести шаговой (six-step), используется синусоидальная коммутация на базе например, энкодера.

Фиг.4. Синусоидальная коммутация синхронного (вентильного) двигателя

Энкодер является более точный датчиком положения ротора по сравнению с цифровыми датчиками Холла, имеющими только шесть фиксированных состояний на полный электрический оборот. Для стандартного двигателя с соединением фаз в «звезду», достаточно задавать ток в двух фазах (U, V) по заданной амплитуде вектора тока (момента) и положению ротора (rotor angle). Токи в фазах U, V статора контролируются ПИ-регуляторами.
При этом задание тока в третьей фазе (W) определяется внешним 3-х фазным синусоидальным усилителем (Three Phase Sinusoidal Brushless Servo Amp) независимо от контроллера как алгебраическая сумма токов.



Цель работы:

1. Ознакомление со способами организации и обработки прерываний при работе МК, закрепление навыков программирования МК.

2. Ознакомление с навыки генерации начального кода программ в пакетах «Code Vision AVR» и «Image Craft C»создание программ, реализующих и обрабатывающих программные и аппаратные прерывания.

3. Осуществление симуляции работы микропроцессорной системы программ в среде «Proteus».

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

 

Объект исследования: микроконтроллер ATMega 16.

 

Аппаратные средства: виртуальная лаборатория на ЭВМ IBM PC: программные пакеты «Proteus», «CodeVision AVR», «Image Craft C». МК ATMega 16, кнопки SWT, светодиоды blueLED.

 

Прерывания в AVR.

 

Interrupts - прерывания, очень важная и мощная функция МК AVR ATmega и ATtiny.

Иногда требуется максимально быстрая реакция программы на какие-то события. Например, приход данных на USART или завершение АЦП или изменение уровня на ножке МК подключенной к контактному датчику или переполнение таймера.

Быструю реакцию обеспечивает механизм прерываний. Группа команд, выполняемых в ответ на запрос прерывания, называется подпрограммой обработки прерывания. Прерывание (если оно разрешено) вызывается в нормальном потоке программы сразу по окончании исполнения текущей команды. Логика прерывания заносит содержимое всех регистров в стек и, таким образом, их состояния могут быть восстановлены по завершении

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

Рис. 1 Схема принципа обработки прерываний.

 

Запомните: При возникновении события которое может вызвать разрешенное в данный момент времени прерывание (список таких событий в даташите в разделе Interrupts таблица " Reset and Interrupt Vectors" ) и при ГЛОБАЛЬНОМ разрешении прерываний (бит 7 в регистре SREG " установлен" ), выполнение программы МК останавливается, сохраняются (запоминаются) место остановки и некоторые нужные данные, бит7 в регистре SREG обнуляется, очищается флаг сработавшего прерывания и затем происходит вызов и выполнение функции обработчика данного прерывания.

От момента наступления события до начала выполнения функции обработчика прерывания проходит не менее 4 тактов процессора. Таким образом, скорость реакции на прерывание напрямую зависит от частоты, на которой работает МК!

Если программа находится в функции обработчике прерывания и в этой функции не был установлен бит SREG.7 то другие события вызывающие прерывания не могут уже вызвать прерывание программы и их обработку.

Делайте функции обработчики прерывания как можно короче!

Если сейчас произойдут события, которые могут вызвать прерывания, то установятся их флаги, но даже разрешенные прерывания не произойдут! Нужно тщательно продумывать алгоритм программы, чтоб успевать обрабатывать все прерывания - т.е. не пропускать нужные события.

В конце функции обработчика прерывания компилятор ставит инструкцию RETI после выполнения которой бит 7 в регистре SREG становится " 1" - т.е. прерывания опять ГЛОБАЛЬНО разрешаются и программа продолжает выполняться с того места где она была в момент возникновения прерывания.

НО! Если при глобальном разрешении прерываний обнаружится установленный флаг разрешенного прерывания, то будет вызвана функция обработчик этого прерывания.

Такая ситуация может возникнуть если во время выполнения обработчика прерывания возникло другое прерывание - т.е. установился его флаг. Если возникнет несколько разрешенных прерываний одновременно, то первым будет выполняться, то которое выше в списке векторов прерываний МК в ДШ. Соответственно по мере отработки накопившихся и разрешенных прерываний их флаги будут очищаться.

А вот флаги неразрешенных прерываний не очистятся, пока программа этого не сделает записью в них числа 1.

Вы можете запрещать и разрешать как все прерывания сразу, так и каждое по отдельности. Все сразу - изменяя бит7 в регистре SREG вот такими строчками в компиляторе CodeVisionAVR:

#asm(" sei" ) /* бит_I сделать " 1" теперь разрешенные прерывания будут обрабатываться, если есть установленный флаг прерывания, то произойдет вызов его функции обработчика */

#asm(" cli" ) /* бит_I сделать " 0" запретить все прерывания ГЛОБАЛЬНО. */

Прерывания легко настроить интерактивно с помощью мастеров начального кода компиляторов CVAVR и ICC.

В МК AVR и других, прерывания могут возникать по многим событиям:

- изменение уровня на некоторых ножках МК,

- " 0" на некоторых ножках МК,

- переполнение таймеров,

- " насчитывание" таймером определенного значения,

- завершение АЦП преобразования,

- изменение уровня на выходе компаратора,

- события в USART,

- другие события (Для ATmega16 прерывания перечислены в таблице 18 " Reset and Interrupt Vectors" )

ПОРЯДОК И МЕТОДИКА ВЫПОЛНЕНИЯ РАБОТЫ

1) Обработка внутренних прерываний

 

К ножкам-входам внешних прерываний INT0 INT1 INT2 ATmega16 я подключил резисторы по 10 КОм к + питания МК для создания внешней подтяжки и еще подключил три кнопки 0, 1 и 2 в " Control Panel" симулятора. Нажимая кнопку мышкой можно замыкать соответствующую ножку на " землю" создавая на ней " 0" на время пока кнопка нажата. Когда кнопки не нажаты на ножках " 1".

Конфигурировал прерывания и USART с помощью мастера генератора начального кода CVAVR.

Прерывания INT0 INT1 разрешены и сконфигурированы " по любому изменению уровня" - т.е. прерывание может возникать и по фронту (" 0" -> " 1" ) и по спаду (" 1" -> " 0" ) сигнала на ножке PD2 и PD3 соответственно.

Прерывание INT2 не конфигурировал - оно оставлено " по-умолчанию" т.е. отключено.

Откройте проект vmlab.prj в VMLAB и сделайте " ребилд-ол"

В меню View откройте, если их нет на экране, панели " регистры и флаги" " SCOPE" и " Control Panel" - разместите их поудобней.

Теперь нажмите несколько раз на светофор - чтоб прекратились меседжи и симуляция шла непрерывно. Кликните по панели " регистры и флаги" чтоб вывести ее на передний план.

Теперь нажмите кнопку K2 и отпустите.

Посмотрите в панели " регистры и флаги" в регистре флагов GIFR (обязательно почитайте об этом регистре в ДатаШите) установился бит_5, если навести на него мышку то появится его название - INTF2 - это флаг прерывания INT2. Вы видите что хотя мы не включали это прерывание его флаг установился при событии соответствующем ему. Как я вам и обещал выше!

Теперь (симуляция продолжается, время с начала программы МК в правом нижнем углу бежит...) нажмите K0 в панели " Control Panel" сразу же произойдет разрешенное прерывание, и программа перейдет в функцию обработчик прерывания INT0 и в виртуальном терминале TTY появится сообщение:

int0

Отпустите K0 и нажмите K1 отпустите K1

Смотрите: так как мы находимся в отработке паузы 100 мС в обработчике прерывания от INT0. Бит_7 в SREG остается " 0" и значит прерывания не исполняются. Все правильно - но отпускание кнопки K0 вызвало установку флага INTF0 а нажатие и отпускание K1 установило флаг INTF1.

Если теория прерываний изложенная мной выше верна то по завершении текущей обработки прерывания INT0 должны произойти еще по 1 вызову обработчиков прерываний INT0 и INT1 - причем сейчас МК не " знает"

какое из них случилось первым и значит будет обрабатывать их по порядку перечисления в таблице 18 ДШ.

Ждем не долго... появляются с некоторой паузой одно сообщение и затем другое свидетельствующие о вызове соответствующих обработчиков прерываний:

int0 int1

При этом вначале очистится бит INTF0, а затем INTF1.

Вопрос для самоконтроля: Почему нажатие и отпускание кнопки K0 вызвало две обработки прерывания INT0, а от кнопки K1 только одно?

Попробуете симуляцию снова и измените порядок нажатия кнопок: вначале K1 а затем K0 - и вы увидите что последние два прерывания все равно будут выполнены в том же порядке: int0 и затем int1

Важно! Из примера выше следует что

Накопление не обработанных прерываний крайне не желательно так как МК " не помнит" последовательность возникновения соответствующих событий!

Практическое применение прерываний будет рассмотрено в задачах - упражнениях курса.

... и теперь самый пожалуй интересный пунктик -

ПРОГРАММА

" зашитая" в МК

Я постулировал ранее что -

Возможность МК действовать по вашей программе - вот суть-соль МК. Это главное отличие МК от " обычных" непрограммируемых микросхем.

Я уже рассказал выше

- о внешних электрических сигналах поступающих на МК

- про электронику подключенную к МК

- о возможностях заложенных производителем

AVR ATmega содержит многократно программируемую FLASH память программ - в нее загружается (есть различные варианты прошивки, загрузки

программы - достаточно пяти проводков от LPT-порта к МК) программа которую будет исполнять МК при наличии следующих условий:

1) есть питание МК 2) есть уровень " 1" на выводе Reset 3) есть источник тактового сигнала 4) нет сброса от иного источника сброса (== перезагрузки МК)

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

 



Теоретические сведения.

Входные и выходные сигналы непрерывных систем являются функциями непрерывного времени t. Если переменная времени принимает конечное множество значений, то сигнал называется дискретным.

t

 



Цель работы:

1) Ознакомление с принципами ШИМ управления.

2) Написание программы, организующей аппаратную реализацию ШИМ на основе МК Atmega16.

 

Объект исследования: микроконтроллер Atmega16.

 

Аппаратные средства: виртуальная лаборатория на ЭВМ IBM PC, программный пакет CodeVisionAVR – компилятор Си для AVR микроконтроллеров, программный пакет Proteus – среда симуляции работы микроконтроллеров и других электронных устройств.

 

Выполнение работы.

 

Вначале сформулируем задачу, которую мы хотим решить и напишем ТЗ. Разработать программу для микроконтроллера ATmega16, которая реализует ШИМ управление в следующем режиме: 2с ШИМ сигнал с величиной ШИМ 1%, 2с ШИМ сигнал величиной 25%, 2с – с величиной 50%, 2с – с величиной 75%, 2с – 99%. Разрядность ШИМ - 1024. Снимаемый ШИМ сигнал можно просматривать, подсоединяя соответствующий вывод МК к осциллографу

Следующим этапом создания устройств на МК является создание алгоритма программы, который заставит работать созданную схему, выполняя ТЗ.

Мы напишем алгоритм в виде псевдокода.

а) старт программы

б) сделать ножку МК, к которой подключен светодиод выходом.

в) сделать ножки МК, с которых снимаем ШИМ сигнал выходами.

г) сконфигурировать таймер1 МК в режим ШИМ сигнала, разрядностью 1024.

д) послать на выход МК 40 единицу(организуем индикацию питания МК).

е) организовать ШИМ сигнал с величиной ШИМ 1%

ж) ждать 2с

з) организовать ШИМ сигнал с величиной ШИМ 25%

и) ждать 2с

к) организовать ШИМ сигнал с величиной ШИМ 50%

л) ждать 2с

м) организовать ШИМ сигнал с величиной ШИМ 75%

н) ждать 2с

о) организовать ШИМ сигнал с величиной ШИМ 99%

п) ждать 2с

р) перейти к пункту д)

Далее нужно записать алгоритм на выбранном языке программирования. Мы будем использовать Си для МК.

Создадим новую папку для нашего проекта C: \cvavreval\Laba4. Далее открываем CodeVision. Создадим новый проект, при этом воспользуемся генератором начального кода.

В появившемся окне генератора начального кода настроим наш МК в соответствии с требованиями программы.

Далее действуем по следующему алгоритму:

1) На вкладке Chip выбираем микроконтроллер Atmega16, задаем частоту тактирования 4МГц.

 

На вкладке Ports задаем бит 0 порта А выходом (этот выход используется для индикации питания МК ), также выходом назначаем бит 5 порта D (этот выход используется для вывода ШИМ сигнала).

3) На вкладке Timers выбираем Timer1 задаем clock value 4000кГц, выбираем режим ( mode ) Fast PWM top=03FF (в этой же вкладке можно задавать и другие режимы работы таймера, например, менять режим ШИМ сигнала, организовывать работу с таймером определенной частоты и т.д.). Задаем выход А ( Out A ) как неинвертированный ( Non-Inv ) выход ШИМ.

4) Далее генерируем и сохраняем файл ( File -> Generate, Save& Exit )

Далее будем следовать созданному нами алгоритму.

Пункт (а) – старт программы. Программа в МК начинает выполняться при наличии питания МК, единицы на ножке Reset. Таким образом, написания специального программного кода для старта программы для МК не требуется.

Объединим пункты (б) и (в) в один. Для их выполнения также не требуется написания программного кода. Эти этапы были реализованы при конфигурировании портов в генераторе начального кода. Чтобы задать те или иные биты портов МК выходами, нужно записать соответствующие значения в регистры PORTx и DDRx. В нашем случае, в регистр DDRA записали число 0х01, в регистр DDRD 0х20 (запись 0х01 означает число 1 в шестнадцатиричной форме или 00000001 в двоичной, соответственно для числа 0х20 представление в двоичной форме имеет следующий вид: 00100000).

Пункт (г) – сконфигурировать Таймер1, … Для реализации этого этапа алгоритма также не требуется написания программного кода. Он также был выполнен при генерации начального кода.

Строки 66-77 – комментарии, указывающие какой таймер и в каком режиме используется, какие выходы используются. Далее идет конфигурация таймера под нашу задачу. Изменять состояние таймера можно меняя значения в соответствующих регистрах (подробнее смотрите в даташите МК).

Пункт (д) – послать на ножку 40 МК единицу. С этого пункта начинается собственно написание самой программы для МК. Как организовать вывод сигнала на ножки МК, подробно было рассмотрено в предыдущих лабораторных работах. Для нашего случая это будет единственная строка

PortA.0=1;

Пункт (е) организовать ШИМ сигнал с величиной ШИМ 1%. В рамках данного пункта рассмотрим, как же организуется ШИМ управление. Чтобы выполнить данный пункт нужно записать следующий программный код:

OCR1AH=0x00;

OCR1AL=0x0A;

Таким образом, чтобы изменить величину ШИМ нужно изменить значение в регистре OCR1A. В нашем случае частота тактирования МК 4МГц, режим ШИМ 03FF, что означает, что разрядность ШИМ 1024. Т.е. частота импульсов в нашем случае 4000000/1024≈ 3, 9кГц. Изменять частоту импульсов ШИМ можно, меняя частоту работы МК, либо меняя разрядность ШИМ сигнала. Также менять эту величину можно, меняя значение регистра TCNT1 (более подробное описание смотри в описании МК).

Рассмотрим, почему нужно записать именно число А в регистр OCR1A. А шестнадцатеричное представление числа 10, а 10 – это примерно 1% от 1024, таким образом мы обеспечиваем требуемую величину ШИМ.

Пункты (ж), (и), (л), (н), (п) объединим в один пункт. Как организовать задержку по времени было рассмотрено в предыдущих лабораторных работах. Программно это выглядит следующим образом:

delay_ms(2000);

Также необходимо добавить строку в директивы предпроцессора, включающую описание этой функции:

#include < delay.h>

Пункты (з), (м), (н), (о) объединим в один пункт. В этих пунктах необходимо изменять величину ШИМ сигнала. Для этого необходимо менять содержимое регистра OCR1A подобно тому, как это делалось в пункте (е). Соответственно для 25% необходимо послать 1024*0.25=256, для 50% - 512, для 75% - 768, для 99% - 1014.

Для того, чтобы организовать переход в начало программы также не требуется записи какого-либо программного кода, после выполнения процедуры while(1) программа возвращается к началу этой процедуры.

Общий листинг программы, реализующей данный алгоритм выглядит следующим образом:

#include < mega16.h>

#include < delay.h>

// Declare your global variables here

void main(void)

{

// Declare your local variables here

// Input/Output Ports initialization

// Port A initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=0

PORTA=0x00;

DDRA=0x01;

// Port B initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTB=0x00;

DDRB=0x00;

// Port C initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTC=0x00;

DDRC=0x00;

// Port D initialization

// Func7=In Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T

PORTD=0x00;

DDRD=0x30;

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: Timer 0 Stopped

// Mode: Normal top=FFh

// OC0 output: Disconnected

TCCR0=0x00;

TCNT0=0x00;

OCR0=0x00;

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 4000, 000 kHz

// Mode: Fast PWM top=03FFh

// OC1A output: Non-Inv.

// OC1B output: Non-Inv.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer 1 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

TCCR1A=0xA3;

TCCR1B=0x09;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer 2 Stopped

// Mode: Normal top=FFh

// OC2 output: Disconnected

ASSR=0x00;

TCCR2=0x00;

TCNT2=0x00;

OCR2=0x00;

// External Interrupt(s) initialization

// INT0: Off

// INT1: Off

// INT2: Off

MCUCR=0x00;

MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x00;

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

ACSR=0x80;

SFIOR=0x00;

while (1)

{

PORTA.0=1; // Place your code here

OCR1AH=0x00;

OCR1AL=0x0A;

delay_ms(2000);

OCR1AH=0x01;

OCR1AL=0x00;

delay_ms(2000);

OCR1AH=0x02;

OCR1AL=0x00;

delay_ms(2000);

OCR1AH=0x03;

OCR1AL=0x00;

delay_ms(2000);

OCR1AH=0x03;

OCR1AL=0xF6;

delay_ms(2000);

};

}

Следующим этапом является симуляция работы данной программы в среде Proteus. Для этого необходимо создать схему, представленную на следующем рисунке:

Далее необходимо осуществить симуляцию и получить осциллограммы исследуемого ШИМ сигнала.

Требования к отчету

Отчет должен содержать следующие разделы:

1. Титульный лист

2. Цель работы.

3. Описание принципов ШИМ управления.

4. Ход работы (с текстом программы и схемами в пакете Proteus, а также осциллограммами полученных сигналов).

5. Выводы.

 

Контрольные вопросы

1. Что такое ШИМ?

2. Для чего используется ШИМ управление?

3. Основные параметры ШИМ сигнала.

4. Примеры расчета параметров работы двигателя при ШИМ управлении.

5. Принципы организации программной реализации ШИМ сигнала?

6. Принципы организации аппаратной реализации ШИМ сигнала?

7. Опишите существующие в МК таймеры.

8. Варианты применения таймеров в МК.

9. Отчего зависит время импульсов ШИМ сигнала при аппаратной реализации ШИМ управления?

10. Как можно добиться промежуточных значений времени импульса ШИМ сигнала?

 

 



Edit

· Copy for Discourse Копирует в буфер обмена подходящий для размещения на форуме код скетча с выделением синтаксиса.

· Copy as HTML Копирует код скетча в буфер обмена как HTML код, для размещения на веб-страницах.

Sketch

· Verify/Compile Проверка скетча на ошибки.

· Import Library Добавляет библиотеку в текущий скетч, вставляя директиву #include в код скетча. Подробная информация в описании библиотек ниже (Libraries).

· Show Sketch Folder Открывает папку, содержащую файл скетча, на рабочем столе.

· Add File.Добавляет файл в скетч (файл будет скопирован из текущего места расположения). Новый файл появляется в новой закладке в окне скетча. Файл может быть удален из скетча при помощи меню закладок.

Tools

· Auto Format Данная опция оптимизирует внешний вид текста, например, выстраивает в одну линию по вертикали открывающую и закрывающую скобки и помещает между ними утверждение.

· Board Выбор используемой платформы. Список с описанием платформ приводится ниже.

· Serial Port Меню содержит список последовательных устройств передачи данных (реальных и виртуальных) на компьютере. Список обновляется автоматически каждый раз при открытии меню Tools.

· Burn Bootloader Пункты данного меню позволяют записать Загрузчик (Bootloader) в микроконтроллер на платформе Arduino. Данное действие не требуется в текущей работе с Arduino, но пригодится, если имеется новый ATmega (без загрузчика). Перед записью рекомендуется проверить правильность выбора платформы из меню. При использовании AVR ISP необходимо выбрать соответствующий программатору порт из меню Serial Port.

Блокнот (Sketchbook)

Средой Arduino используется принцип блокнота: стандартное место для хранения программ (скетчей). Скетчи из блокнота открываются через меню File > Sketchbook или кнопкой Open на панели инструментов. При первом запуске программы Arduino автоматически создается директория для блокнота. Расположение блокнота меняется через диалоговое окно Preferences.

Загрузка скетча в Arduino

Перед загрузкой скетча требуется задать необходимые параметры в меню Tools > Board и Tools > Serial Port. Платформы описываются далее по тексту. В ОС Windows порты могут обозначаться как COM1 или COM2 (для платы последовательной шины) или COM4, COM5, COM7 и выше (для платы USB). Определение порта USB производится в поле Последовательной шины USB Диспетчера устройств Windows. После выбора порта и платформы необходимо нажать кнопку загрузки на панели инструментов или выбрать пункт меню File > Upload to I/O Board. Современные платформы Arduino перезагружаются автоматически перед загрузкой. На старых платформах необходимо нажать кнопку перезагрузки. На большинстве плат во время процесса будут мигать светодиоды RX и TX. Среда разработки Arduino выведет сообщение об окончании загрузки или об ошибках.

При загрузке скетча используется Загрузчик (Bootloader) Arduino, небольшая программа, загружаемая в микроконтроллер на плате. Она позволяет загружать программный код без использования дополнительных аппаратных средств. Загрузчик (Bootloader) активен в течении нескольких секунд при перезагрузке платформы и при загрузке любого из скетчей в микроконтроллер. Работа Загрузчика (Bootloader) распознается по миганию светодиода (13 пин) (напр.: при перезагрузке платы).

Библиотеки

Библиотеки добавляют дополнительную функциональность скетчам, например, при работе с аппаратной частью или при обработке данных. Для использования библиотеки необходимо выбрать меню Sketch > Import Library. Одна или несколько директив #include будут размещены в начале кода скетча с последующей компиляцией библиотек и вместе со скетчем. Загрузка библиотек требует дополнительного места в памяти Arduino. Неиспользуемые библиотеки можно удалить из скетча, убрав директиву #include.

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

Выполнение работы

В ходе данной работы реализуем светодиодную индикацию с использованием модуля Freeduino. Для этого запустим Arduino.

 

 

Далее проведем инициализацию портов

 

const int LED_1 = 12;

const int LED_2_GND = 10;

const int LED_2_PWR = 8;

 

Это означает, что питание 1-го диода будет происходить с 12- й ножки, питание 2-го диода – с 8-й, земля второго диода будет находится на 10-й ножке. Также введем переменную button, которая потребуется нам для реализации различных команд при управлении модулем.

 

char button;

 

а также введем переменную DELAY для организации временной задержки

 

int DELAY = 1000;

 

Далее зададим порты выхода

 

void setup() {

pinMode(LED_1, OUTPUT);  

pinMode(LED_2_GND, OUTPUT);

pinMode(LED_2_PWR, OUTPUT);

 

Serial.begin(9600);

}

 

void loop() {

 

if (Serial.available() > 0) {

button = Serial.read();

}

 

теперь реализуем управление 1-м светодиодом,

 

for (int i=0, i< 10, i++);

{

digitalwrite(LED_1, HIGH);

delay(DELAY);

digitalwrite(LED_1, LOW);

delay(DELAY);

}

 

таким образом, 1-й светодиод у нас будет загораться на 1000 мс и в течении такого же временного интервала будет оставаться выключенным, что будет повторяться 10 раз

 

аналогично можно управлять 2-м светодиодом

 

for (int i=0, i< 10, i++);

{

digitalwrite(LED_2_GND, LOW);

digitalwrite(LED_1_PWR, HIGH);

delay(DELAY);

digitalwrite(LED_2_GND, LOW);

digitalwrite(LED_1_PWR, LOW);

delay(DELAY);

}

 

мигание светодиодов с переменной скоростью можно реализовать следующим образом

 

for (int i=1, i< 100, i++)

{

DELAY=i*10;

digitalwrite(LED_1, HIGH);

delay(DELAY);

digitalwrite(LED_1, LOW);

delay(DELAY);

}

for (int i=100, i< =1, i--)

{

DELAY=i*10;

digitalwrite(LED_1, HIGH);

delay(DELAY);

digitalwrite(LED_1, LOW);

delay(DELAY);

}

 

таким образом, 1-й светодиод будет гореть и выключаться в интервале, сначала увеличивающемся в течение 100 циклов от 10 мс до 1 секунды, а затем обратно уменьшающемся в течении 100 циклов до 10 мс

 

теперь попробуем осуществить управление последовательной шиной

 

 if (button == '1') {

digitalWrite(LED_1, HIGH);

 }

 if (button == '0') {

digitalWrite(LED_1, LOW);

 }

 if (button == '2') {

digitalWrite(LED_2_GND, LOW);

digitalWrite(LED_2_PWR, HIGH);

 }

 if (button == '3') {

digitalWrite(LED_2_GND, LOW);

digitalWrite(LED_2_PWR, LOW);

 }

if (button == '4') {

digitalWrite(LED_1, HIGH);

digitalWrite(LED_2_GND, LOW);

digitalWrite(LED_2_PWR, HIGH);

 }

 

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

 

 

в поле ввода введите на выбор «1», «2», «3», «4», или «0». Соответственно при вводе того или иного числа будут выполняться различные команды:

 

«1» - 1-й светодиод горит

«0» - 1-й светодиод гаснет

«2» - 2-й светодиод горит

«3» - 2-й светодиод гаснет

«4» - горят оба светодиода

Задания на выполнение лабораторной работы

Написать программу, реализующую следующее задание и произвести ее моделирование: 1 группа Организовать включение 1-го светодиода на 1с и выключение на 0, 5мс в течении 10 раз; включение 2-го светодиода на 2 с и выключение на 3 в течении 10 раз 2 группа Организовать включение 1-го светодиода с интервалом, уменьшающимся от 1 с до 20мс с и затем увеличивающимся до 600 мс; включение 2-го светодиода с интервалом, увеличивающимся от 40мс до 800 с и затем уменьшающимся до 5 мс
3 группа Организовать включение 1-го светодиода с интервалом, увеличивающимся от 20мс до 0.5 с и затем уменьшающимся до 50 мс; включение 2-го светодиода с интервалом, уменьшающимся от 1.5 с до 30мс с и затем увеличивающимся до 500 мс 4 группа Организовать включение 1-го светодиода на 1с и выключение на 0, 5мс в течении 10 раз; включение 2-го светодиода на 2 с и выключение на 3 в течении 10 раз
5 группа Организовать включение 1-го светодиода с интервалом, уменьшающимся от 1 с до 20мс с и затем увеличивающимся до 600 мс; включение\выключение 2-го светодиода с интервалом 1 с в течении 20 раз 6 группа Организовать включение\выключение 1-го светодиода с интервалом 1 с в течении 20 раз включение 2-го светодиода с интервалом, увеличивающимся от 30мс до 1.5 с и затем уменьшающимся до 100 мс;

 

Контрольные вопросы

1. Что такое Freeduino?

2. Что входит в состав модуля Freeduino?

3. Какие достоинства имеет модуль Freeduino?

4. Что представляет собой среда Arduino?

5. Что входит в состав среды Arduino?

6. Какие элементы управления содержатся в панели инструментов Arduino?

7. Какие команды содержит меню Tools?

8. Как происходит загрузка скетча в Arduino?

 



Ход работы

Объект управления

В качестве объекта управления используется линейный привод (актуатор) LAS-2-1-200-12-E компании HIWIN.

Актюатор или линейный привод - очень компактное устройство, представляющее собой готовую систему позиционирования с интегрированным двигателем постоянного тока, редуктором, выдвижным штоком с трапецеидальной резьбой и гайкой (ШВП или передача винт - гайка). При выдвижении, шток не проворачивается, а движется поступательно. Стандартный ход штока актюаторов HIWIN от 50 до 500 мм, так же поставляются линейные приводы с нестандартной величиной хода. Шестерни редуктора - цилиндрические, прямозубые, стальные или бронзовые. Питание двигателя осуществляется от источника постоянного тока напряжением - 12 или 24 В. Источники питания могут поставляться отдельно.

Диапазон рабочих температур от +5 С° до +40 С°. Так же возможен заказ актюаторов для низких температур от -20 С°, а так же от -40 С°. В стандартном исполнении, актюаторы имеют степень защиты IP54, при агрессивных условиях окружающей среды (запылённость, повышенная влажность и т.д.) степень защиты может быть повышена до IP66.

Все актюаторы оснащены концевыми выключателями. Позиционеры и оптические сенсоры поставляются как опции.

Нагрузочная способность актюаторов в зависимости от типа от 200 до 10 000 Н. Скорость в зависимости от нагрузки от 4 до 46 мм/сек. Нагрузочный цикл - 10%. Возможные цвета корпуса - серый или чёрный.

Параметры данного привода

· Скорость – до 20 мм/с

· Напряжение питания – 12 В

· Ток – максимальный - 6 А,

· Нагрузка:

o Вытягивание – 600 Н

o Втягивание – 600 Н

o Удержание – 300 Н

 

Блок управления

Блок управления содержит:

1 – кнопку включения/выключения драйвера

2 – регулятор ШИМ (скорости линейного привода)

3 – переключатель ручного/автоматического режимов управления

4 – регулятор направления движения штока привода

5 – кнопку включения/выключения блока питания

4
5
3
1

 

Программный код

Инициализация ножек драйвера

 

const int PWM_pin = 6;

const int INA_pin = 7;

const int INB_pin = 4;

const int PWM_on = 5;

const int GND_pin = 3;

 

Инициализация ножек регулятора ШИМ

 

const int pot_GND = A0;

const int pot_pin = A1;

const int pot_PWR = A2;

 

Инициализация ножек регулятора направления движения штока привода

 

const int dir_PWR = 12;

const int dir_left = 11;

const int dir_right = 13;

 

 

void setup()

{

 

Serial.begin(9600);

 

Объявление портов выхода драйвера

 

pinMode(PWM_pin, OUTPUT);

pinMode(INA_pin, OUTPUT);

pinMode(INB_pin, OUTPUT);

pinMode(GND_pin, OUTPUT);

pinMode(PWM_on, OUTPUT);

 

Объявление портов входа\выхода регулятора ШИМ

 

pinMode(pot_GND, OUTPUT);

pinMode(pot_pin, INPUT);

pinMode(pot_PWR, OUTPUT);

 

Объявление портов входа\выхода регулятора направления движения штока привода

 

pinMode(dir_PWR, OUTPUT);

pinMode(dir_left, INPUT);

pinMode(dir_right, INPUT);

 

Запись

 

digitalWrite(GND_pin, LOW);

digitalWrite(PWM_on, HIGH);

 

digitalWrite(pot_GND, LOW);

digitalWrite(pot_PWR, HIGH);

 

digitalWrite(dir_PWR, HIGH);

}

 

Управление скоростью линейного привода с помощью ШИМ

 

void loop()

{

 

int velocity = ((1023 - analogRead(pot_pin)) / 4);

 

прямой ход штока

 

if ((digitalRead(dir_left) == LOW) & & (digitalRead(dir_right) == HIGH)) {

 

analogWrite(PWM_pin, velocity);

digitalWrite(INA_pin, HIGH);  

digitalWrite(INB_pin, LOW);

delay(10);

}

 

реверсивный ход штока

 

if ((digitalRead(dir_left) == HIGH) & & (digitalRead(dir_right) == LOW)) {

analogWrite(PWM_pin, velocity);

digitalWrite(INA_pin, LOW);  

digitalWrite(INB_pin, HIGH);

delay(10);

}

 

Serial.println(velocity);

 

;

}

 


 


Описание работы с АЦП

Многие микроконтроллеры AVR, в том числе и AtMega16, имеют на борту АЦП последовательного приближения.

АЦП это десятиразрядное, однако при точности +/- 2 минимально значащих разрядов обычно его считают восьмиразрядным, так как в младших двух разрядах обычно отсутствует полезный сигнал. Тем не менее, это неплохой инструмент для контроля напряжения, в восьмиразрядном режиме имеющий 256 отсчетов и выдающее частоту дискретизации до 15кГц (15 тысяч выборок в секунду).

Конфигурация источника

Сигнал в АЦП подается через мультиплексор, с одного из восьми (в лучшем случае, часто бывает меньше) входов. Выбор входа осуществляется регистром ADMUX, а точнее его битами MUX3…MUX0. Записанное туда число определяет выбраный вход. Например, если MUX3..0 = 0100, то подключен вывод ADC4.

Кроме того, существует несколько служебных комбинаций битов MUX, использующихся для калибровки. Например, 1110 подключает к АЦП внутренний источник опорного напряжения на 1.22 вольта. Если записать в MUX3..0 все единицы, то АЦП будет подключено на землю. Это полезно для выявления различных шумов и помех.

У старших AVR семейства Mega (8535, 16, 32, 128) есть возможность включить АЦП в режиме дифференциального входа. Это когда на два входа приходят разные напряжения. Одно вычитается из другого, и может умножаться на коэффициент усиления.

Мультиплексирование каналов осуществляется только после того, как завершится преобразование, поэтому можно запускать АЦП на обсчет входных значений, записывать в MUX3..0 параметры другого входа, и готовится снимать данные уже оттуда.

Выбор опорного сигнала

Это максимальное напряжение, которое будет взято за максимум при измерениях. Опорное напряжение должно быть как можно стабильней, без помех и колебаний — от этого кардинальным образом зависит точность работы АЦП. Задается он в битах REFS1..0 регистра ADMUX.

По умолчанию там стоит REFS1..0 = 00 — внешний ИОН, подключенный к входу AREF. Это может быть напряжение со специальной микросхемы опорного напряжения.

REFS1..0 = 01 - просто берется напряжение питания.

REFS1..0 = 11 - внутренний источник опорного напряжения на 2.56 вольт.

Скорость работы АЦП

Частота выборки АЦП задается в битах предделителя ADPS2…0 регистра ADCSR. Таблицу можно найти в даташите на соответствующий МК, однако оптимальная точность работы модуля АЦП находится в пределах 50…200кГц, поэтому предделитель стоит настраивать исходя из этих соображений. С повышением частоты точность падает.

 

Описание стенда

На стенде для изучения методов обработки аналоговых сигналов (рис.1) закреплена плата Freeduino, датчик давления, прижимной винт, с помощью которого создается усилие, два ограничителя, один неподвижный, другой подвижный, между ними устанавливается упругий элемент. С помощью прижимного регулировочного винта можно перемещать ограничитель, тем самым изменяя усилие и придавая деформацию упругому элементу. Регулировочный винт упирается в измерительный элемент датчика.

Рис. 1. Стенд для изучения методов обработки аналоговых сигналов

 

 

Описание датчика

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

Интегрированная среда разработки Arduino это кроссплатформенное приложение на Java, включающее в себя редактор кода, компилятор и модуль передачи прошивки в плату. Среда разработки основана на языке программирования Processing и спроектирована для программирования новичками, не знакомыми близко с разработкой программного обеспечения

Среда разработки Arduino состоит из встроенного текстового редактора программного кода, области сообщений, окна вывода текста(консоли), панели инструментов с кнопками часто используемых команд и нескольких меню. Для загрузки программ и связи среда разработки подключается к аппаратной части Arduino.

 

Выполнение работы

В ходе данной работы проведем обработку аналоговых сигналов с использованием модуля Freeduino. У модуля Freeduino есть 6 аналоговых портов. Мы будем использовать 0 и 1. Поэтому в программе необходимо инициализировать их.

 

const int analogInPin0=A0

const int analogInPin1=A1

 

А0 и А1 соответственно 0 и 1 аналоговые порты.

В основном цикле происходит обработка сигналов с датчика. Для чтения сигнала с датчика существует команда AnalogRead. Далее присваиваем переменным значения сигналов с A0 и A1 переменным ValuePin 2 и ValuePin 4 соответственно.

Чтение сигнала с датчика происходит 100 раз внутри цикла, сигналы суммируются.

 

for (i=0; i=100; i++)

ValuePin2=analogRead(analogInPin1)

Sum1=sum1+ ValuePin2

ValuePin4=analogRead(analogInPin0)

Sum2=sum2+ ValuePin4

 

В программе предусмотрена задержка в 1мс.

 

delay(1)

 

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

 

ValuePin2=sum1/100;

ValuePin4=sum2/100;

 

Это позволяет сгладить вылеты, шумы сигнала.

Далее находим разницу между двумя средними значениями.

 

value=valuePin2-ValuePin4

 

 И непосредственно в порт выдается уже значение разности между сигналами.

Подключим питание и начнем изменять положение ограничителя, показания датчика начнут изменяться.

Необходимо отметить, что разрядность АЦП составляет 1024, т.е. АЦП 10-битное. Формально значения, которые поступают непосредственно в результате выполнения команды AnalogRead меняются от 0, что соответствует 0 Вольт, до 1023, что соответствует 5 Вольтам.

Получим графики при различных усилиях:

 

1) При плавном нажатии получили график зашумленный, но с тенденцией нарастания

 

 

2)  При точечном нажатии получили график периодического усилия

 

 

Контрольные вопросы

9. Что такое АЦП?

10. Как подается сигнал на АЦП?

11. Назовите основные компоненты стенда.

12. Что в данной работе используется в качестве источника аналогового сигнала?

13. Зачем нужна задержка в 1 мс в программе?


 

Учебная литература по курсу

1. Поляков К.Ю. Основы теории цифровых систем управления: учеб. пособие; СПбГМТУ. – СПб.: 2006. 161 с.

2. Г. Олссон, Д. Пиани. Цифровые системы автоматизации и управления. – СПб.: Невский диалект, 2001. – 557с, илл.

3. Николайчук О.И. Современные средства оптимизации.М.: Солон-Пресс, 2006. 256 с.

4. Музылева И.В. Элементная база для построения цифровых систем управления. М.: Техносфера, 2006. 144с.

5. Денисенко В.В. Компьютерное управление технологическим процессом, экспериментов, оборудованием. М.: Горячая линия – Телеком, 2009. 608 с., ил.

6. Левин Л. М. Введение в цифровую электронику. М.: Высшая школа, 1999 г. - 430 с.

7. Яцун С.Ф., Галицына Т.В. Аналого-цифровые системы автоматического управления: Учеб. пособие/ Курск. гос. техн. ун.-т, Курск, 2006. - 187с.

8. Голубцов М. С., Кириченкова А.В.. Микроконтроллеры AVR: от простого к сложному. – М.: СОЛОН-Пресс, 2005. 304с.

9. Воротников С. А. Информационные устройства робототехнических систем: Учеб. пособие – М.: Изд-во МГТУ им. Н. Э. Баумана, 2005.- 384с.

10. www.pcports.ru

11. www.easyelectronics.ru

12. www.avr123.ru

 

 


Аппаратные средства цифрового управления мехатронными системами


Поделиться:



Последнее изменение этой страницы: 2019-03-20; Просмотров: 591; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (2.145 с.)
Главная | Случайная страница | Обратная связь