Дата публикации статьи: 17.10.2004 16:37
Виктор Мясников
Моделирование мультивибратора
Задумал книгу написать на тему мутную,
Но дело трудно прорастало
…………………………….
Поэтому далее в прозе и кодом
Скачать пример к статье
Обсудить в форуме
Задумал я написать книгу по стыковке образования и информатизации. Составил
примерный план. Ко всем теоретическим разделам есть написанные VBA-приложения,
а к одному – нет. Раздел назывался «Моделирование цифровых схем». И, что самое
интересное этим моделированием я занимался еще на студенческой скамье и во
времена застоя был соавтором книги на эту тему. А тут, кстати, подходит коллега
и просит сделать лабораторную работу по исследованию мультивибратора. Я,
конечно, щеки надул, загнул тираду про теоретически не доказанную адекватность,
отсутствие виртуальных приборов, трудоемкость процесса и еще про что-то. А,
потом, подумал и говорю: - Заходи после смены, к вечеру сделаю.
Использование AVTOCADов и WORKBENTCHей было отброшено сразу. Цель разработки
была учебная, а не исследовательская, поэтому, во-первых, не нужны были средства
автоматизации составления принципиальных схем, во-вторых, на компьютере в
учебной лаборатории, кроме Office ничего не умещалось, а, в-третьих, мне
хотелось показать силу моего любимого EXCEL-VBA.
Открыл EXCEL- книгу с одним листом. Убрал сетку. Загрузил фон листа (нечто
серенькое в клеточку). Быстренько с помощью панели «Рисование» набросал схему
простейшего мультивибратора с задержанной обратной связью.

Что дальше? Есть схема – нужен осциллограф. Содрать неоткуда.
Надо делать самому. Ну, что ж вперед. Для начала попробуем увидеть в
«осциллографе» гармонические колебания от начала развертки в фазе косинусоиды.
Не выходя из листа, где-то справа, например, в колонке «Т», заполняем столбец
арифметической прогрессией от начального значения «0» до «179», что в дальнейшем
будет соответствовать виртуальному времени. В соседнем столбце «U» с помощью
встроенной функции преобразуем целочисленные значения ячеек диапазона «Т0:Т179»
(градусы) в радианы, но с некоторым коэффициентом, записанным в именованную
ячейку «R1» - «Развертка». В итоге в ячейках диапазона «U0:U179» должна быть
записана формула «=Развертка*РАДИАНЫ(T1)» с относительной адресацией. Теперь в
соседний диапазон «V0:V179» записываем функцию «=COS(U1)» и получаем значения
косинусоиды.
Для преобразования табличной формы косинусоиды в наглядный вид вставим на
рабочий лист диаграмму. Только сначала сфомируем еще два диапазона. В диапазон
«Х0:Х179» скопируем диапазон «Т0:Т179» и преобразуем его с помощью функции
«=ФИКСИРОВАННЫЙ(T1;0;)» в текстовый формат без десятичных знаков, а в диапазон
«Y0:Y179» скопируем итоговый диапазон значений косинусоиды. Смысл этих действий
заключается в формировании двух смежных диапазонов, в первый из которых
записываются текстовые значения категорий (ось «X»), а во второй числовые
значения категорий (ось «Y»), необходимых для определения исходных данных при
построении диаграммы.
Пользуясь мастером построения диаграмм, вставляет график с исходными данными,
определяемыми диапазоном « =Лист1!$X$1:$Y$180». Настраиваем шкалу значений.
Готово. Получили график косинусоиды на оси, якобы, времени. Замечу, что
использование текстового формата для оси категорий, это практически единственный
способ получить обозначения оси абсцисс, начинающиеся с нуля.
Далее - косметика. Область диаграммы делаем прозрачной, а для области построения
выбираем заливку, имитирующую экран осциоллографа ( темнозеленую со средней
горизонтальной частью немного более светлой, как бы засвеченной лучом
развертки). Для самой линии графика используем толстую ярко-желтую линию. Линии
сетки тоже делаем желтыми, но потоньше. Диаграмму заключаем в багетную рамку из
вкладки «Основные фигуры». И еще две рамки равной ширины пристыковываем к
диаграмме для размещения вспомогательных элементов управления. В итоге получаем

Неплохо, но скорее похоже на фотографию экрана, а не на живой
экран. Должна быть развертка во времени. Тут пришлось еще раз подумать.
Попробовал заполнять выходной диапазон поэлементно и выводить его на экран
осциллографа, но при этом стали видны нулевые элементы справа и соединительная
линия на границе графика и нулевых значений, что не соответствует режиму
развертки осциллографа. Не проходит.
Тогда, дай, думаю, сделаю подвижную шторку, сдвигающуюся вправо и открывающую
область построения диаграммы. Нарисовал на листе прямоугольник идентичный по
размерам и по раскраске области построения диаграммы. Шторка готова. А как ее
сдвигать вправо, если в свойствах прямоугольника есть только отступ слева (Left)
и ширина (Width). Меняя ширину, сдвигаем влево. Раз можно налево, сообразим и
вправо.
Очевидно, что сдвиг шторки вправо сводится к синхронному смещению отступа слева
и изменению ширины шторки. Быстренько набросал первый макрос:
Sub Отобразить()
If control Then ‘ контроль повторного обращения
a = ActiveSheet.Shapes("Rectangle 1").Width
b = ActiveSheet.Shapes("Rectangle 1").Left
For i = 1 To a
Range("A1").Select
ActiveSheet.Shapes("Rectangle 1").Left = b + i
ActiveSheet.Shapes("Rectangle 1").Width = a - i
Next i
Else
End If
control = False ‘ контроль повторного обращения
End Sub
Здесь все прозрачно. Сначала считываем ширину шторки (a) и
значение смещения влево (b), а затем в цикле увеличиваем смещение и уменьшаем
ширину.
Восстановление исходного состояния шторки, когда она закрывает область
построения диаграммы, осуществляется следующим макросом:
Sub Сброс()
'
If Not control Then
Range("A1").Select
ActiveSheet.Shapes("Rectangle 1").Width = a
ActiveSheet.Shapes("Rectangle 1").Left = b
Else
End If
control = True
End Sub
Назначаем макросы соответствующим фигурам и запускаем шторку.
Все работает отлично. Только, когда я случайно запустил повторно макрос
«Отобразить», все развалилось. Причина ясна – при повторном запуске считываются
значения уже сдвинутой шторки и восстановить первоначальное положение и размеры
уже не удается.
Исправить ситуацию можно при помощи механизма триггера с переменной control,
которая описывается как Public, кстати, переменные a и b также описываются как
Public.
При первом запуске в теле подпрограммы Auto_0pen переменной control
присваивается значение True, поэтому выполниться могут только операторы в теле
подпрограммы «Отобразить», а на выходе из нее стоит control = False.
При control = False можно запустить макрос «Сброс» и выполнить его внутренние
операции, на выходе установив control = True. И так далее. Поэтому выполнение
внутренних операторов макросов «Отобразить» и «Сброс» может только чередоваться,
а повторное выполнение становится невозможным.
Сделаем еще небольшой косметический штришок. Дело в том, что шторка закрывает не
только график, но и горизонтальные линии сетки, чем слегка портит внешний вид.
Поэтому пришлось нарисовать пять тонких желтых линий, совместить их с линиями
сетки и расположить на переднем плане. Вот теперь все нормально. Осциллограф
получился как живой. Если не рассказывать, то никто и не догадается о какой-то
шторке.
Теперь вернемся к истокам. Мультивибратор формирует все-таки прямоугольные
импульсы. Для формирования негармонических периодических функций можно
использовать простую функцию рабочего листа с названием ОСТАТ(T1;Период),
формирующую периодически нарастающий остаток от деления. Комбинируя эту функцию
с другими, можно сформировать прямоугольные колебания требуемой амплитуды,
периода и фазы. Заменив в ячейках диапазона «Y1:Y180» функцию косинуса на
функцию
ЕСЛИ(ОСТАТ(T1;Период)>Период/2;1;0,2), где «Период» это значение именованной
ячейки «R2», получаем нечто похожее на колебания мультивибратора. Эти колебания
исправно отображает наш осциллограф.

Поскольку период колебаний определяется значением
соответствующей именованной ячейки, то, связав эту ячейку с элементом управления
«Счетчик», получаем возможность управления периодом непосредственно с панели
осциллографа. При этом событие изменения состояния счетчика вызывает запуск
нового цикла отображения информации на экране осциллографа:
Private Sub SpinButton1_Change()
Сброс
Отобразить
End Sub
На панели осциллографа размещаем дополнительно окно ввода,
связав его через свойство «LinkedCell» с именованной ячейкой «R2». Значение в
окне отражает значение периода колебаний, которое, в свою очередь, можно связать
со значениями емкости конденсаторов мультивибратора.
Теперь попробуем реализовать механизм изменения места подключения щупа
осциллографа. Красная стрелка на схеме мультивибратора показывает узел, сигнал с
которого выводится на экран. В мультивибраторе два узла, поэтому сразу нарисуем
две стрелки. Кроме того. Нарисуем две окружности поверх узлов. Эти окружности
сделаем невидимыми, т.е. из панели «Рисования» назначим для этих окружностей
опции «Нет заливки» и «Нет линий». С графикой все.
Теперь макросы. Создаем два простейших макроса
Sub макрос4()
ActiveSheet.Shapes("Line 87").Visible = True
ActiveSheet.Shapes("Line 91").Visible = False
End Sub
Sub макрос5()
ActiveSheet.Shapes("Line 87").Visible = False
ActiveSheet.Shapes("Line 91").Visible = True
End Sub
Смысл действий макросов очень прост. Один делает видимой одну стрелку, а
другой – другую. Эти макросы присваиваем нарисованным прозрачным окружностям,
так, чтобы выполнение макроса высвечивало ближайшую к узлу стрелку.
Простенько, но со вкусом.
Пока реализовали индикацию, а существо механизма заключается в замене
отображаемого диаграммой диапазона. Это осуществляется одним циклом для метода
Cells, перезаписывающего в диапазон «Y1:Y180» диапазон «Q1:Q180» или
«P1:P180». Кроме того, в тело макросов вставляем последовательное обращение
«Сброс» и «Отобразить» и в итоге получаем
Sub Макрос4()
ActiveSheet.Shapes("Line 87").Visible = True
ActiveSheet.Shapes("Line 91").Visible = False
For n = 1 To 180
Cells(n, 25) = Cells(n, 17)
Next n
Сброс
Отобразить
End Sub
Sub Макрос5()
ActiveSheet.Shapes("Line 87").Visible = False
ActiveSheet.Shapes("Line 91").Visible = True
For n = 1 To 180
Cells(n, 25) = Cells(n, 16)
Next n
Сброс
Отобразить
End Sub
Вот и все. Можно показать студентам как динамическую иллюстрацию. Конечно,
можно пойти дальше и ввести элементы управления синхронизацией, усилением по
оси «Х», скоростью развертки, но это заинтересованный читатель может легко
сделать самостоятельно
И, в заключение несколько общих замечаний. Вообще говоря, все, что было
описано выше, можно назвать обратным моделированием. То есть, сначала любыми
средствами создается какой-то образ, а потом утверждается, что объект
функционирует именно так. В то время как в традиционном моделировании сначала
структурируется объект, затем имитируется его функционирование, и только потом
оформляются результаты. Конечно, когда речь идет о сложной разработке,
действовать необходимо именно так, однако для демонстрационных задач
предложенный метод обратного моделирования дает ряд весьма ощутимых
преимуществ. Во-первых, нет необходимости создавать математические и
программные модели отдельных элементов схем, во-вторых, не нужно разрабатывать
или использовать готовые приемы создания схем из отдельных элементов и, в
третьих, не нужно использовать сложные итерационные алгоритмы вычислений
состояний и выходных сигналов. Эти аргументы весьма весомы при выборе методов
разработки информационного обеспечения учебного процесса, особенно специальных
дисциплин.
Все писалось и проверялось в EXCEL-VBA (файл Мультивибратор.xls) из OFFICE-XP
на весьма посредственной машине. Будет работать и на старых версиях OFFICE,
только градиентная заливка не получится, поэтому там ее нужно будет изменить
на одноцветную.
Автор: Виктор
Мясников
|