Встроенный контроль температуры ПИД-регулятора, часть 4: графический интерфейс Scilab
Благодаря USB-коммуникациям и графическому пользовательскому интерфейсу Scilab мы можем действительно видеть, что делает ПИД-регулятор.
Вспомогательная информация
- В этом проекте используется специально спроектированная печатная плата; обратитесь к разделу «Специальная конструкция печатной платы с микроконтроллером EFM8» для руководства по включению устройств EFM8 в ваше пользовательское оборудование.
- Вы можете найти краткий обзор термопар, а также некоторую общую информацию о MAX31855 в статье «Создание системы на основе EFM8 для мониторинга и анализа измерений термопар».
- Введение в системы управления: проектирование ПИД-регулятора с помощью инструмента SISO MATLAB
- Отрицательная обратная связь, часть 1: Общая структура и основные понятия
- В этой статье представлен Scilab.
- В двух предыдущих статьях представлена информация о включении USB-связи в проект EFM8: Связь с микроконтроллером EFM8 через USB и EFM8 Sound Synthesizer: воспроизведение мелодий через USB.
Предыдущие статьи в этой серии
- Встроенный контроль температуры ПИД-регулятора, часть 1: цепь
- Встроенный контроль температуры ПИД-регулятора, часть 2: интеграция на уровне платы
- Встроенный контроль температуры ПИД-регулятора, часть 3: Внедрение и визуализация
Прежде чем мы начнем, вот диаграмма системы управления PID, представленная ранее:

И вот часть схемы, относящаяся к PID:


Гораздо лучше, чем светодиоды
Схема визуализации светодиодов, использованная в предыдущей статье, была довольно ограниченной. Дело в том, что практически любая схема визуализации, основанная не более чем на нескольких светодиодах, будет довольно слабой. Нам нужно что-то, что позволяет нам точно видеть, что делает наш ПИД-регулятор - во-первых, потому что это будет более интересно, а во-вторых, потому что нам нужна подробная информация о производительности системы, чтобы правильно установить пропорциональные, и производным коэффициентом.
Для этого этапа проекта мы собираемся включить возможности USB в прошивку EFM8 и разработать графический пользовательский интерфейс Scilab, который контролирует заданное значение и отображает в реальном времени фактические измеренные температуры. В разделе «Поддержка информации» выше вы найдете статьи, которые содержат вводную информацию о функциях USB EFM8 и Scilab. Вы также можете прокручивать мои предыдущие статьи и просматривать все, что связано с графическими интерфейсами Scilab или USB-связью.
Прошивка
Команды USB
Прошивка была изменена так, что операция PID управляется Scilab. EFM8 не запускает функции PID до тех пор, пока Scilab не сообщит об этом, и тогда Scilab может остановить и возобновить функции PID в любое время. Чтобы инициировать или возобновить работу PID, Scilab отправляет ASCII «C» по каналу USB и для остановки работы PID отправляет ASCII «H»; обе команды - это только один символ без возврата каретки или новой строки, а что нет. Напряжение при нагреве устанавливается на 0 В при остановке работы ПИД-регулятора, поэтому имейте в виду, что температура нагревательного элемента будет постепенно уменьшаться до комнатной температуры во время остановки. Scilab также может изменить заданное значение; это достигается путем отправки ASCII «S», за которым следует однобайтовый двоичный (то есть не-ASCII) номер, который представляет заданное значение в градусах Цельсия. Эти три команды включены в функцию обратного вызова VCPXpress.
VCPXpress_API_CALLBACK(myAPICallback) { uint32_t API_InterruptCode; //get the code that indicates the reason for the interrupt API_InterruptCode = Get_Callback_Source(); //if the USB connection was just opened if (API_InterruptCode & DEVICE_OPEN) { //start the first USB read procedure Block_Read(USBRxPacket, USB_PACKET_SIZE, &USBBytesRcvd); /*we will process the received bytes when we get a callback with an RX_COMPLETE interrupt code*/ } if (API_InterruptCode & RX_COMPLETE) //USB read complete { //'C' tells the EFM8 to begin or resume PID control if(USBRxPacket(0) == 'C') { PID_ACTIVE = TRUE; } //'H' tells the EFM8 to halt PID control else if(USBRxPacket(0) == 'H') { PID_ACTIVE = FALSE; /*The heater-drive voltage is held at 0 V * while PID control is halted.*/ UpdateDAC(DAC_HEATER, 0); } //'S' indicates that the host is sending the setpoint else if(USBRxPacket(0) == 'S') { /*The setpoint temperature is restricted to * positive integers not greater than 100 * degrees C. Scilab sends the setpoint as a * normal binary number, not as ASCII characters, * so that the EFM8 doesn't have to convert * from ASCII to binary.*/ Setpoint_Temp = USBRxPacket(1); } //continue with the next USB read procedure Block_Read(USBRxPacket, USB_PACKET_SIZE, &USBBytesRcvd); } }
ПИД-поток
Процедура PID в основном цикле while начинается с проверки флага PID_ACTIVE, который инициализируется FALSE. Выполнение остается на этом этапе, пока команда «C» из Scilab не заставляет EFM8 изменить этот флаг на TRUE. Другое важное различие заключается в том, что измеренная температура отправляется в Scilab в начале каждой итерации. В предыдущих проектах Scilab сначала запрашивал данные через USB-команду, затем EFM8 отправил данные в ответ на запрос. В этом проекте Scilab не должен запрашивать данные; EFM8 отправляет трехбайтный пакет измеренных температур на каждой итерации, а Scilab просто получает и отображает данные. Это уменьшает трафик USB и нагрузку на процессор EFM8, и поэтому у нас должно быть меньше проблем с более высокими скоростями обновления, необходимыми для улучшения визуализации изменений в управляемой переменной. Текущая прошивка использует интервал обновления в две секунды, что, по-видимому, обеспечивает адекватный контроль и визуализацию без перегрузки EFM8 или графического интерфейса Scilab. Следующий фрагмент кода охватывает часть PID основного цикла while:
while (1) { /*First, we check PID_ACTIVE. The following while statement * suspends PID functionality until the EFM8 is commanded by * Scilab to begin or resume PID control.*/ while(PID_ACTIVE == FALSE); GatherMAX31855Data(); while(TEMP_DATA_READY == FALSE); //wait until the SPI transaction is complete Measured_Temp = ConvertMAX31855Data_to_TempC(); //send measured temperature to Scilab TransmitUSB_TempData(); Error = Setpoint_Temp - Measured_Temp; /*We don't want the integral error to get * way too large. This is a standard problem * referred to as integral windup. One solution * is to simply restrict the integral error to * reasonable values.*/ Error_Integral = Error_Integral + Error; if(Error_Integral > 50) Error_Integral = 50; else if(Error_Integral200) PID_Output = 200; else if(PID_Output < 0) PID_Output = 0; //here we convert the PID output from a float to an unsigned char Heater_Drive = PID_Output; UpdateDAC(DAC_HEATER, Heater_Drive);
светодиоды
Хотя сам по себе недостаток, светодиодная обратная связь по-прежнему является удобным способом контроля работы системы. Это также полезно для подтверждения того, что данные, отображаемые Scilab, согласуются с тем, что действительно происходит в EFM8. Чтобы сделать светодиодную обратную связь более подходящей для этой второй цели, на этом этапе проекта мы будем использовать другой подход: если измеренная температура находится в пределах ± 2 ° C от заданного значения, мы включаем только зеленый светодиод. Если измеренная температура более чем на 2 ° C ниже заданного значения, мы включаем только синий цвет. Если измеренная температура выше заданного значения выше 2 ° C, мы включаем только красный цвет. Итак, зеленый = хороший, синий = слишком холодный, а красный = слишком горячий. Преимущество этой схемы будет очевидным, когда измеренная температура колеблется вокруг заданного значения, поскольку изменения цвета светодиода будут синхронизироваться с изменениями температуры, отображаемыми в графическом интерфейсе. Код управления светодиодом включен во вторую часть основного цикла.
/*LED visualization: If the measured temperature is within * plus/minus 2 degrees C of the setpoint, we turn on the * green LED. If the measured temperature is more than * 2 degrees below the setpoint, we turn on the blue LED. * If the measured temperature is more than 2 degrees * above the setpoint, we turn on the red LED.*/ if(Measured_Temp >= (Setpoint_Temp-2) & Measured_Temp <= (Setpoint_Temp+2)) { UpdateDAC(DAC_RGB_R, 0); UpdateDAC(DAC_RGB_B, 0); UpdateDAC(DAC_RGB_G, 100); } else if(Measured_Temp(Setpoint_Temp+2)) { UpdateDAC(DAC_RGB_R, 100); UpdateDAC(DAC_RGB_B, 0); UpdateDAC(DAC_RGB_G, 0); } /*Here we wait until the PID interval has expired, * then we begin a new iteration. The interval is * currently set to 2 seconds.*/ PID_WAIT = TRUE; while(PID_WAIT == TRUE); }
Вот ссылка для загрузки всех исходных файлов и файлов проекта.
Файлы источника и проекта
Scilab
Вот как выглядит графический интерфейс, когда он неактивен:

Он был разработан с помощью инструментария GUI Builder, который вы можете загрузить с помощью диспетчера модулей ATOMS Scilab:

Вот ссылка на загрузку графического интерфейса (это всего лишь один текстовый файл).
Сценарий GUI
Сначала вы используете кнопку «Open VCP Port», чтобы установить подключение виртуального COM-порта к EFM8. Затем выберите заданное значение. Scilab ограничивает заданное значение целыми числами, меньшими или равными 100. Если вы введете значение больше 100, Scilab автоматически уменьшит его до 100 и отобразит «Уставка с уменьшенным до максимального допустимого значения, то есть 100 ° C» в строке сообщений ниже кнопку «Открыть порт VCP». Аналогично, если вы вводите нецелое число, Scilab округляет его до ближайшего целого и отображает сообщение об этом. Теперь вы можете нажать кнопку «Активировать ПИД-регулятор». Уставка не отправляется на EFM8 до тех пор, пока вы не нажмете эту кнопку, и вы не сможете изменить заданное значение, пока ПИД-регулятор активен. Это будет очевидно, потому что поле ввода текста заданного значения становится серым во время активного ПИД-регулирования. Чтобы изменить заданное значение, вы должны нажать «HOLD PID Control», а затем изменить его, а затем нажать «Активировать ПИД-управление», чтобы возобновить работу PID.
Когда вы закончите с использованием GUI, сначала нажмите «Halt PID Control» (если PID-управление уже неактивно), затем нажмите «Закрыть порт VCP», затем закройте окно графического интерфейса. Если вы не выполните эту процедуру, вам может потребоваться перезапустить Scilab или сбросить EFM8 или некоторые из них. Это раздражает, но не катастрофично.
Давайте быстро рассмотрим некоторые существенные части сценария Scilab. Во-первых, это то, как Scilab отправляет команды «S» (заданное значение) и «C» (инициировать / возобновлять ПИД-управление) после нажатия «Активировать ПИД-регулирование»:

Значение Setpoint взято из окна ввода текста следующим образом:

Когда ПИД-регулятор активен, Scilab повторно проверяет буфер приема виртуального COM-порта. Как только три байта были получены, он считывает три байта, преобразует их в значение температуры и добавляет их в массив, содержащий все измеренные значения температуры, полученные с момента последнего нажатия на «Активировать ПИД-контроль»:

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

Результаты
В предыдущей статье мы рассмотрели результаты (на основе светодиодов и оскопов) для системы с пропорциональным единством и пропорционально-интегральной системой. В обоих случаях задача управления заключалась в том, чтобы довести нагревательный элемент с 30 ° C до заданного значения 50 ° C. Мы смогли определить, что 1) система P-only никогда не достигла заданного значения и 2) система PI действительно достигла заданного значения, хотя и с некоторым превышением. Теперь давайте посмотрим на результаты, основанные на GUI, для одной и той же задачи управления. Сначала система P-only:

Мы видим, что система P-only фактически очень близка к заданной точке, но без интегрального усиления температура несколько уменьшается и достигает установившегося значения, которое на 2 ° C ниже заданного значения. Как мы упоминали в предыдущей статье, системы P-only известны своей восприимчивостью к значительной установившейся ошибке.
Вот график для системы PI:

Мы видим здесь, что система PI на самом деле хуже, чем мы думали. Он действительно достигает заданного значения, но он вызывает больше, чем просто перерегулирование - эта конкретная конфигурация фактически приводит к устойчивому (или, по крайней мере, долговременному) колебанию вокруг заданного значения.
Вывод
Видео в конце этой статьи (оно работает с нормальной скоростью 16x) показывает поведение светодиода, соответствующее графику для системы PI. В видео вы также заметите важную аппаратную деталь: на PCB, который мы используем для этого проекта, на самом деле есть два USB-разъема, один для питания и один для данных. Типичный порт USB не может поставлять более 500 мА. Таким образом, для получения более высокого тока, необходимого для нагревательного элемента, плата включает в себя возможность питания от отдельного разъема. Таким образом, один из USB-кабелей подключен к USB-зарядному устройству, которое может поставлять что-то вроде 1200 мА, а другое подключено к порту USB на ПК.
В следующей статье мы будем использовать наш новый графический интерфейс для изучения того, как различные влияния P, I и D влияют на производительность системы.
Следующая статья в серии: встроенный контроль температуры ПИД-регулятора, часть 5: регулировка усиления
Попробуйте этот проект сами! Получить спецификацию.