[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
ПИД регулятор для коллекторного двигателя
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 кнопки памяти. Температура выводится на семисегментник.
Прикрепления: sstation.bas (9.9 Kb)


 
pchela5Дата: Среда, 29.01.2014, 14:34 | Сообщение # 7
Группа: Свой человек
Сообщений: 85

Статус: Offline
Цитата plex ()
Также задействован энкодер с кнопкой (кнопка меняет шаг изменения уставки). 3 кнопки памяти. Температура выводится на семисегментник.

А схемку можно поглядеть?


 
implexДата: Четверг, 30.01.2014, 02:37 | Сообщение # 8
Группа: Проверенные
Сообщений: 34

Статус: Offline
Схемки нету, есть плата. Думаю там вопросов не будет.
Прикрепления: solstation.lay (66.4 Kb)


 
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 разбираю алгоритм пид регулятора. Немного переписал код для отладки через терминал и симулятор. Вроде ничего сверхъестественного в этой пропорционально-интегрально-дифференциальной регулировке нет, все работает.
А что именно "работает"? smile Где "выходной сигнал" ? sad




Сообщение отредактировал 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 и будет являться выходным "сигналом"


 
  • Страница 1 из 1
  • 1
Поиск: