ПИД регулятор для коллекторного двигателя
|
|
exersizze | Дата: Понедельник, 25.03.2013, 20:29 | Сообщение # 1 |
Группа: Администраторы
Сообщений: 723
Статус: Offline
| Задумался о автоматическом регуляторе для своей сверлилки (и не только), чтобы обороты держались на установленном значении и не падали во время проделывания отверстий. Для людей знакомых с автоматизацией не секрет, что такие вещи делаются с использованием ПИД-регуляторов. Для справки http://ru.wikipedia.org/wiki/%CF%C8%C4-%F0%E5%E3%F3%EB%FF%F2%EE%F0
Может кто имеет опыт написания подобных вещей на Bascom-avr ?
|
|
| |
exersizze | Дата: Вторник, 26.03.2013, 19:25 | Сообщение # 2 |
Группа: Администраторы
Сообщений: 723
Статус: Offline
| По следам апнота #109 http://www.mcselec.com/index.p....emid=57 разбираю алгоритм пид регулятора. Немного переписал код для отладки через терминал и симулятор. Вроде ничего сверхъестественного в этой пропорционально-интегрально-дифференциальной регулировке нет, все работает. Можно внедрять)
Код $regfile = "m8def.dat" $sim
' -----[ Переменные ]------------------------------------------------------------ Dim Auto_mode As Bit ' регулировка вкл/выкл Dim Manual_value As Single ' значение без регулировки
Dim Setpoint As Single ' выбранное значение Dim Pv As Single ' входное значение (то что получаем от датчиков) Dim Cv As Single ' выходное значение с PID (то что отдаем исполнительному устройству)
Dim First_execution As Byte Dim Initial_error As Single
Auto_mode = 1 ' регулировка включена First_execution = 0 ' начинает с нулевого шага Manual_value = 40 ' выходное значение по умолчанию Setpoint = 37 ' установкленное значение
Do Waitms 50 Gosub Regulator ' Вызов функции высчитывания ПИД алгоритма Gosub Object ' вызов функции управлеия нагрузкой Loop
End
' --------------------------------------------------------------------------- ' -----------------------------[ подпрограммы ]------------------------------- ' --------------------------------------------------------------------------- Object: ' -----[ Управление нагрузкой ]-------------------------------- 'печатаем значения переменных Print "Setpoint " ; Setpoint Print "Input value " ; Pv Print "PID output " ; Cv
Return
Regulator: ' -----[ ПИД регулирование]--------------------------------------------- ' -----[ переменные и константы ]---------------------------------------------------------- Const Kp = .85 ' коэффициент пропорциональной корректировки Const Ki = .67 ' коэффициент интегральной корректировки Const Kd = .15 ' коэффициент дифференциальной корректировки
Dim Last_pv As Single Dim Last_sp As Single Dim Sum_error As Single ' значение суммированной ошибки Dim D_pv As Single
Dim Error As Single ' разница между входным и установленным значениями Dim Pterm As Single ' пропорциональная составляющая Dim Iterm As Single ' интегральная составляющая Dim Dterm As Single ' дифференциальная составляющая ' -----[ код ]--------------------------------------------------------------
If Auto_mode = 1 Then
Error = Setpoint - Pv Sum_error = Sum_error + Error Iterm = Ki * Sum_error ' интегральная корректировка
If First_execution < 2 Then If First_execution = 0 Then Sum_error = Manual_value / Ki First_execution = 1 Initial_error = Error End If Pterm = 0 Dterm = 0 If Initial_error > 0 And Error < 0 Then First_execution = 2 Last_pv = Pv End If If Initial_error < 0 And Error > 0 Then First_execution = 2 Last_pv = Pv End If Last_sp = Setpoint
Else D_pv = Last_pv - Pv Last_pv = Pv Dterm = Kd * D_pv ' дифференциальная корректировка If Setpoint = Last_sp Then
Pterm = Kp * Error ' пропорциональная корректировка
Else Pterm = 0 Dterm = 0 If Setpoint > Last_sp And Pv > Setpoint Then Last_sp = Setpoint Last_pv = Pv End If If Setpoint < Last_sp And Pv < Setpoint Then Last_sp = Setpoint Last_pv = Pv End If End If End If
Cv = Pterm + Iterm ' суммирование пропорциональной/интегральной/пропорциональной частей Cv = Cv + Dterm
Else ' если регулировка отключена Cv = Manual_value ' выставляем выходное значение по умолчанию First_execution = 0 End If Return
|
|
| |
implex | Дата: Вторник, 26.03.2013, 22:48 | Сообщение # 3 |
Группа: Проверенные
Сообщений: 34
Статус: Offline
| Делал недавно паяльную станцию. То же из баскомовского апнота. Работает, но опыта настройки нет. Перепробовал кучу вариантов коэффициентов. Сейчас при нагреве от 0 до 3800 температура запрыгивает до 410, опускается до 380 и держится. Пока сдался на этом варианте.
|
|
| |
RDV | Дата: Четверг, 28.11.2013, 22:24 | Сообщение # 4 |
Группа: Пользователи
Сообщений: 2
Статус: Offline
| Уважаемий exersizze можно узнать как обстоят дела с вашим ПИД регулятором. Можно ли получить исходник ? занимаюсь такой же работой только коефициенты хочу настраивать через UART. И написать прогу в Пурбейсике. наподобе USB вольтмера http://avrproject.ru/publ....1-0-118
Спасибо за ваш ответ.
|
|
| |
exersizze | Дата: Пятница, 29.11.2013, 12:09 | Сообщение # 5 |
Группа: Администраторы
Сообщений: 723
Статус: Offline
| RDV, я больше не затрагивал эту тему. Исходник во втором сообщении, я его на только на симуляторе прогонял. Да и пока нет приемлемого движка которым можно было бы управлять, все мелкие и слабомощные. Но сама идея ПИД регулирования у меня осталась, может когда и займусь этим в плотную. А пока буду рад если сами будете делиться своими наработками :)
|
|
| |
implex | Дата: Четверг, 16.01.2014, 20:49 | Сообщение # 6 |
Группа: Проверенные
Сообщений: 34
Статус: Offline
| Это код моей паяльной станции. Всех подробностей не помню, если будут вопросы может что и вспомню. На выходе пида переменная, которая сравнивается с 16-битным таймером. Помню что из баскомовского примера что-то выкидывал и добавлял ограничение на накопление ошибок. Работает так же: Цитата Сейчас при нагреве от 0 до 3800 температура запрыгивает до 410, опускается до 380 и держится. Пока сдался на этом варианте. Неудобств от этого нет. Также задействован энкодер с кнопкой (кнопка меняет шаг изменения уставки). 3 кнопки памяти. Температура выводится на семисегментник.
|
|
| |
pchela5 | Дата: Среда, 29.01.2014, 14:34 | Сообщение # 7 |
Группа: Свой человек
Сообщений: 85
Статус: Offline
| Цитата plex ( ) Также задействован энкодер с кнопкой (кнопка меняет шаг изменения уставки). 3 кнопки памяти. Температура выводится на семисегментник. А схемку можно поглядеть?
|
|
| |
implex | Дата: Четверг, 30.01.2014, 02:37 | Сообщение # 8 |
Группа: Проверенные
Сообщений: 34
Статус: Offline
| Схемки нету, есть плата. Думаю там вопросов не будет.
|
|
| |
pchela5 | Дата: Четверг, 30.01.2014, 12:55 | Сообщение # 9 |
Группа: Свой человек
Сообщений: 85
Статус: Offline
| Нда, вопросов действительно нет, ибо ничего не понятно. Если с операционником и транзистором ясно, то остальное - темный лес. Ссылка на что-нить есть?
|
|
| |
implex | Дата: Четверг, 30.01.2014, 16:37 | Сообщение # 10 |
Группа: Проверенные
Сообщений: 34
Статус: Offline
| B1-B7, C0-C2 подключается семисегментник (C3 идет на все 3 точки индикатора) при отображении уставки точки светятся B0, D6, D7 - уставки (три обычные кнопки на 200, 385, 420град можно поменять в исходнике) D5 управление симистором С5 получаем показания температуры с операционника на АЦП D0-D2 энкодер На плату управления подается 5В. Паяльник питается от 24. В разрыве питания паяльника симистор. Резисторы на индикатор токоограничивающие. На кнопки и энкодер подтягивающие. Обвязка операционника описана в статье "Подключаем термопару к микроконтроллеру"
|
|
| |
LIA060 | Дата: Вторник, 22.04.2014, 20:41 | Сообщение # 11 |
Группа: Пользователи
Сообщений: 3
Статус: Offline
| Цитата exersizze ( ) По следам апнота #109 http://www.mcselec.com/index.p....emid=57 разбираю алгоритм пид регулятора. Немного переписал код для отладки через терминал и симулятор. Вроде ничего сверхъестественного в этой пропорционально-интегрально-дифференциальной регулировке нет, все работает. А что именно "работает"? Где "выходной сигнал" ?
Сообщение отредактировал LIA060 - Вторник, 22.04.2014, 20:43 |
|
| |
exersizze | Дата: Среда, 23.04.2014, 23:19 | Сообщение # 12 |
Группа: Администраторы
Сообщений: 723
Статус: Offline
| Работает сам алгоритм ПИД корректировки. Результат выводится в терминал, в коде есть такие переменные Код Dim Setpoint As Single ' выбранное значение Dim Pv As Single ' входное значение (то что получаем от датчиков) Dim Cv As Single ' выходное значение с PID (то что отдаем исполнительному устройству) абстрактный пример :) нам нужно держать обороты двигателя на 2000 оборотах Setpoint = 2000 - переменная куда кладется значение оборотов которые хотим удерживать с датчика (скажем, с тахометра) получаем значение 1800 PV=1800 - как видим частота немного не дотягивает до требуемой, значит надо поддать жару. Как? К примеру через ШИМ. Так как текущее значение ШИМ мало и не дает требуемых оборотов, алгоритм высчитывает следующее его (ШИМ) значение, которое должно приблизить фактическую частоту двигателя к требуемой. Для этого служит переменная Cv, которая непосредственно управляет значением ШИМ . Как то так. Cv и будет являться выходным "сигналом"
|
|
| |