В прошлой статье мы рассмотрели теоретически основы измерения веса руды в сосуде ШПУ по измерению силы, развиваемым двигателем при подъеме. Схемотехнически подготовили сигналы тока и напряжения статора двигателя для обработки их в МК. В этой статье мы рассмотрим программную реализацию вычисления массы поднимаемого груза на МК. Для того что бы приступить к написанию программы для МК, необходимо разобраться, как правильно нужно данные сигналы в МК обрабатывать. Итак приступим.
Сигналы тока и напряжения представляют собой синусоидальный сигнал, в основе своей содержащий основную частоту питающей сети (для наших реалий 50 Гц). Про гармоники и прочие составляющие в сетевом напряжении говорить не будем, они есть и оказывают влияние на качество сети и динамические свойства электродвигателей. На любом производстве с ними борются по мере сил, так что их влияние, пусть и не ничтожно, но все-таки мало. Останавливаться на этом не станем.
И опять формулы и немного теории
Рассмотрим график сигнала напряжения поступающего на аналоговый вход МК. Все расчеты, выводы будут справедливы в полной мере и для сигнала тока.
Виртуальный ноль синусоиды находится на уровне в 1,5 Вольта, искусственная земля на ОУ в схеме. Для вычисления действующего значения напряжения необходимо воспользоваться формулой:
Как видно, вся синусоида положительна и прямое использование данной формулы к реальным данным не приведет. То есть показания, считанные с АЦП, нужно масштабировать в реалии синусоидального сигнала, то есть с положительной и отрицательной полуволной. Для это из считанного кода АЦП необходимо вычесть код АЦПo соответствующий нашей искусственной земле, средней точки. То есть наша формула примет данный вид:
Вычисление кода АЦПo можно реализовать несколькими способами.
- Завести напряжение с формирователя средней точки на аналоговый вход МК и при начале измерения напряжения считывать код АЦПo и его использовать при расчетах.
- Для таких измерений требуется использовать источники опорного напряжения высокой точности, а также хорошо стабилизированные источники питания аналоговых цепей, поэтому значение АЦПo можно вычислить один раз, после настройки схемы и использовать это значение в дальнейшем.
- Что то еще можно придумать интересного…
В данной реализации мы, пойдем способом вторым, правда немного автоматизируем данную процедуру определения значения АПЦo для каждого используемого канала. Но не будем бежать впереди паровоза.
Чем больше будет замеров за период сетевого напряжения (то есть частота дискретизации), тем выше точность наших расчетов. Обработка полученных результатов после сканирования канала перед началом нового измерения наложит свои ограничения на эту частоту. Тут нужно подходить со здравым смыслом и аппаратных возможностей того МК, на который будет возложена данная задача. Точность можно повысить, если замеры производить не за один период, а за несколько. Главное условие чтоб в количество замеров укладывалось кратное число периодов исследуемого сигнала.
Для сигнала тока все с точностью также как и для напряжения.
Для расчета активной мощности используется данная формула:
Перепишем, с учетом наших реалий:
Значит в один и тот же момент времени, нам необходимо снять показания с двух каналов АЦП (напряжения и тока), затем провести необходимые вычисления, и перейти к следующему замеру и т.д. Отсюда рождается примерно такой алгоритм.
Алгоритм, для измерения величин на МК.
- По сигналу с детектора начала измерений, который заведен на ножку МК обладающему аппаратным обработчиком прерывания по изменению уровня сигнала, запускаем таймер для отсчета равных временных интервалов при измерении сигналов тока и напряжения. Устанавливаем счетчик измерений в 0.
- По прерыванию от таймера, производим считывания кода АЦП с двух аналоговых каналов. Производим необходимые вычисления, по предварительной обработке сигналов. Увеличиваем счетчик измерений на 1. Если значение счетчика не достигло нужной величины N замеров, то переходим к началу пункта 2.
- Если количество замеров равно N, останавливаем таймер. Устанавливаем флаг окончания измерений.
- В основном цикле по флагу окончания измерений производим окончательные расчеты по измеренным данным.
- После всех расчетов, запускаем прерывание от детектора начала измерений и все итерации повторяются снова.
Программа МК на этом не ограничится. Результаты измерений и вычислений должны будут взаимодействовать с человеком, в виде отображения на дисплее, или отправки по интерфейсу на ПК, или организовывать связь с другим отображающим прибором или устройством. В данной реализации, МК будем взаимодействовать с ПК по интерфейсу RS-232 по протоколу ModBus RTU. Реализация данного протокола на МК не сложна и не требовательна к аппаратным ресурсам МК.
Выбор аппаратной платформы и расчет частоты дискретизации обработки сигналов
Требований к аппаратной платформе МК для данной задачи не заоблачные. 8-ми битные микроконтроллеры вполне справятся с этой задачей. Для визуализации работы программы на МК и полученных результатов воспользуемся симулятором Proteus. Для понимания принципов решения данной задачи этого хватит. Этот симулятор поддерживает множество разнообразных МК, но все же не все. В этой реализации я покажу пример на МК от фирмы Microchip семейства PIC18F. Модель данного МК есть в протеусе.
МК PIC18F2580. Рассмотрим его основные характеристики. Идем на сайт производителя и скачиваем даташит на данное семейство. Вот таблица «возможностей» данного МК.
Для вычисления частоты дискретизация, т.е. время прерывание от аппаратного таймера, необходимо вычислить время преобразования АЦП двух каналов, время выполнения промежуточных результатов по измерениям и немного времени оставить для выполнения остального кода программы. И если это время окажется мизерным, то есть смысл его увеличить.
Для промежуточных вычислений, необходимо измеренные величины возводить в квадрат и суммировать, а после производить деление на количество замеров и извлечение квадратного корня. Деление даже целого числа, довольно затратная операция для МК, в плане быстродействия, так что лучше её заменять битовым сдвигом, то есть количество измерений стоит брать кратное степени 2.
Все остальные преобразования будут происходить после остановки таймера, то есть вне прерывания в основном цикле программы.
Результат преобразования с АЦП в данном МК представляет собой 10-ти битное значение, после возведения в квадрат, получим 20 битное значение. Зададимся 4-х байтным регистром хранения суммы квадратов измерений АЦП, то есть 32 бита, следовательно, максимальное количество замеров, до наступления переполнения нашего 32-х битного регистра, составляет 2^12. Приличное значение. Для вычисления активной мощности, где есть значение знака, один бит нам становится недоступен. Так что количество замеров уменьшается до 2^11. Добавим здравого смысла и ограничимся количеством замеров N = 2^9 = 512.
Теперь определим количество полных периодов, которые будут укладываться в наше количество замеров. Возьмем для начала 5 полных периодов, т.е. 100 мс во временной шкале. Следовательно, время переполнение аппаратного таймера составляет Т = 100мс/512 = 195,3125 мкс. Отсюда частота дискретизации f = 1/Т = 1/195,3125*10-6 = 5120 Гц. Вполне вменяемая величина, как для точности, так и необходимого быстродействия нашего МК.
Время выполнения одной инструкции для данного МК максимально составляет 0,1 мкс. Так что за время «тиканья» аппаратного таймера до следующего прерывания, мы сможем обработать 1953,125 инструкций что, несомненно, должно хватить нам с «головой». Но полученное число не целое. А тактирование аппаратных таймеров, которые являются 8-ми или 16-ти битными происходит от тактового генератора, равного частоте после PLL деленной на 4. То есть мы не сможем настроить таймер таким образом, что бы он за 512 равных промежутков измерений отсчитал ровно 100 мс. Выхода как всегда несколько.
- Найти кварц, не целочисленной кратности. Например, на 6,4 МГц
- Ограничатся 500 замерами, то есть не степенью 2, и производить в основном цикле деление, а не битовый сдвиг.
Для МК других производителей и архитектур, такой проблемы может не возникнуть.
В данном примере, «экзотический» кварцевый резонатор искать не будем. Так что нагрузим немного процессор МК математическими операциями.
Промежуточный итог
Количество измерений за 5 полных периодов сетевого напряжения будет 500. Значит, временной интервал аппаратного таймера составит 200 мкс. Частота дискретизации в таком случае получится 5000 Гц.
Настройка АЦП и таймера МК
Обратимся к даташит на семейство PIC18F2580 в частности всего, что касается АЦП. Для проведения измерений с помощью АЦП необходимо руководствоваться некоторыми аспектами:
- После подключения канала к модулю АЦП, необходимо выждать время для полной зарядки конденсатора в модуле.
- На 10-ти битное преобразование, необходимо время.
Согласно даташиту, время на 10-ти битное преобразование необходимо 11 Tad. Где, Tad должно быть >= 2 мкс. Этим гарантируется наибольшая точность, при преобразовании.
Время, необходимое для зарядке конденсатора в модуле АЦП, после подключения канала к модулю АЦП, может быть вычислено по приведенной методике в даташите. Там рассмотрен пример, с указанием необходимых данных, участвующих в расчетах. Величины, входящие в расчет времени, зависят от проектирования схемотехники и топологии печатной платы. Так что в данной статье, они учитываться не будут, и за основу возьмем пример из даташита.
Время, необходимое для зарядки конденсатора модуля АЦП, возьмем из примера, которое равно 12,86 мкс. Время для преобразования, вычислим исходя из неравенства Tad>=2 мкс. Тактирование преобразования настраивается в регистре ADCON2. И может иметь следующие значения:
- 2 Tosc
- 4 Tosc
- 8 Tosc
- 16 Tosc
- 32 Tosc
- 64 Tosc
- Internal RC Oscillator
В нашем случае, при тактировании МК от 40 МГц после PLL, Tosc = 0,1 мкс, следовательно, Tad = 3,2 мкс, то есть 32 Tosc.
Итого, для одного преобразования АЦП, понадобится время Tацп = 12,86+11*3,2 = 48,06 мкс. Для двух каналов 96,12 мкс. Переполнения аппаратного таймера у нас составляет 200 мкс. Следовательно, на все вычисления остается: 200 — 96,12 = 103,88 мкс. Должно хватить.
Настроим таймер для обработки значений с АЦП.
Будем использовать модуль TMR0. Он может работать как в 8-ми битном режиме, так и в 16-ти битном. У него есть предделитель. Тактируется как от внешнего источника, так и от внутреннего.
Для обеспечения точного временного интервала в 200 мкс, необходимо во время прерывания от таймера, загружать в него предустановленное значение, отличное от 0.
Отображение результатов
Для связи с внешним миром, будем использовать обычный периферийный модуль USART, с реализацией протокола ModBus RTU. Программная реализация для МК семейства PIC16F рассказана в данной статье. Таблицу регистров заполним по мере написания программы.
Симулятор протеус, позволяет использовать компонент, работающий с COM портом системы, как виртуальным, так и физическим. В качестве конечного потребителя данных по протоколу ModBus RTU будем использовать OPC сервер, в принципе любой фирмы. OPC сервер обеспечивает опрос, отображение результатов опроса своими инструментами, что в данном случае является полным набором. Данные по стандарту OPC он может передать множеству сторонних приложений. SCADA пакетам, например.
Настройку модуля USART производим, отталкиваясь от тактовой частоты и необходимой скорости обмена.
Автоматизация процесса вычисления средней точки
Вначале статьи, было объявлено, что вычисление кода АЦП средней точки для каждого канала будет автоматизировано:
«немного автоматизируем данную процедуру определения значения АПЦ0 для каждого используемого канала»
Давайте рассмотрим алгоритм такого автоматического вычисления.
Измерение сигналов у нас происходит по вычислению среднеквадратичного значения. В начальный момент времени, когда мы включили устройство, в энергонезависимой памяти у нас для кода АПЦo обоих каналов записаны нули. Отключим источники наших сигналов, трансформаторы тока и напряжения, желательно у источников. Значит на вход АЦП, у нас будет приходить постоянное напряжение средней точки возможно с какой-нибудь помехой от длинной кабельной линии. Производим вычисление среднеквадратичного значения постоянного напряжения по заложенному алгоритму измерения сигналов. По команде, например по сети по протоколу ModBus RTU, мы эти вычисленные значения заносим в АПЦo для соответствующего канала, также обновляем данные в энергонезависимой памяти. Эти значения при хорошо стабилизированном питании аналоговых цепей и использовании точного источника опорного напряжения практически никак не будут меняться во времени.
В дальнейшем, при эксплуатации устройства, можно будет проводить эти работы, для коррекции АПЦo. Тут мы сможем отфильтровать, постоянную составляющую кабельной линии, если таковая будет иметь место. К тому же среднюю точку токового входа, после микросхемы, другим способом, с достаточной точностью, вычислить и не предоставляется возможным.
Заключение
Рассмотрели алгоритм измерения сигналов, поступающих с трансформаторов тока и напряжения. Провели анализ необходимых настроек аппаратных модулей МК. Теперь приступим к написанию собственно программы для МК.
P.S.
Так как статья получилась довольно обширной, то непосредственно описание получившейся программы, с примерами исходных кодов, рассмотрим в следующей публикации.
Автор: Helixa