| ПИД регулятор для коллекторного двигателя | 
| 
				
			 | 
| 
| exersizze | Дата: Понедельник, 25.03.2013, 20:29 | Сообщение # 1 |  |   Группа: Администраторы Сообщений: 720 
 Статус: 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 |  |   Группа: Администраторы Сообщений: 720 
 Статус: 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 |  |   Группа: Администраторы Сообщений: 720 
 Статус: Offline | RDV, я больше не затрагивал эту тему. Исходник во втором сообщении, я его на только на симуляторе прогонял. Да и пока нет приемлемого движка которым можно было бы управлять, все мелкие и слабомощные. Но сама идея ПИД регулирования у меня осталась, может когда и займусь этим в плотную. А пока буду рад если сами будете делиться своими наработками :) 
 
 |  
 |  |  |  | 
| 
| implex | Дата: Четверг, 16.01.2014, 20:49 | Сообщение # 6 |  | Группа: Проверенные Сообщений: 34 
 Статус: Offline | Это код моей паяльной станции. Всех подробностей не помню, если будут вопросы может что и вспомню. На выходе пида переменная, которая сравнивается с 16-битным таймером. Помню что из баскомовского примера что-то выкидывал и добавлял ограничение на накопление ошибок. Работает так же: 
 Цитата Сейчас при нагреве от 0 до 3800 температура запрыгивает до 410, опускается до 380 и держится. Пока сдался на этом варианте.Неудобств от этого нет. Также задействован энкодер с кнопкой (кнопка меняет шаг изменения уставки). 3 кнопки памяти. Температура выводится на семисегментник.
 
 
 |  
 |  |  |  | 
| 
| pchela5 | Дата: Среда, 29.01.2014, 14:34 | Сообщение # 7 |  | Группа: Свой человек Сообщений: 84 
 Статус: Offline | Цитата plex (  ) Также задействован энкодер с кнопкой (кнопка меняет шаг изменения уставки). 3 кнопки памяти. Температура выводится на семисегментник.А схемку можно поглядеть?
 
 
 |  
 |  |  |  | 
| 
| implex | Дата: Четверг, 30.01.2014, 02:37 | Сообщение # 8 |  | Группа: Проверенные Сообщений: 34 
 Статус: Offline | Схемки нету, есть плата. Думаю там вопросов не будет. 
 
 |  
 |  |  |  | 
| 
| pchela5 | Дата: Четверг, 30.01.2014, 12:55 | Сообщение # 9 |  | Группа: Свой человек Сообщений: 84 
 Статус: 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 |  |   Группа: Администраторы Сообщений: 720 
 Статус: Offline | Работает сам алгоритм ПИД корректировки. Результат выводится в терминал, в коде есть такие переменные
 
 Код Dim Setpoint As Single            ' выбранное значение   Dim Pv As Single                    ' входное значение (то что получаем от датчиков)
 Dim Cv As Single                    ' выходное значение с PID (то что отдаем исполнительному устройству)
абстрактный пример :)
 нам нужно держать обороты двигателя на 2000 оборотах
 Setpoint = 2000 - переменная куда кладется значение оборотов которые хотим удерживать
 с датчика (скажем, с тахометра) получаем значение 1800
 PV=1800 - как видим частота немного не дотягивает до требуемой, значит надо поддать жару. Как? К примеру через ШИМ. Так как текущее значение ШИМ мало и не дает требуемых оборотов, алгоритм высчитывает следующее его (ШИМ) значение, которое должно приблизить фактическую частоту двигателя к требуемой. Для этого служит переменная Cv, которая непосредственно управляет значением ШИМ . Как то так.
 Cv и будет являться выходным "сигналом"
 
 
 |  
 |  |  |  |