Пид контроллер: ПИД-регуляторы – для чайников-практиков / Теория, измерения и расчеты / Сообщество EasyElectronics.ru

Содержание

что это такое, регулирование температуры ПИД регулятором

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

На первый взгляд все запутанно, но можно объяснить ПИД регулирование и для чайников, т.е. людей, не совсем знакомых с электронными системами и приборами.

Что такое ПИД регулятор?

ПИД регулятор — прибор, встроенный в управляющий контур, с обязательной обратной связью. Он предназначен для поддержания установленных уровней задаваемых величин, например, температуры воздуха.

Устройство подает управляющий или выходной сигнал на устройство регулирования, на основании полученных данных от датчиков или сенсоров. Контроллеры обладают высокими показателями точности переходных процессов и качеством выполнения поставленной задачи.

Что такое ПИД регулятор для чайников?

Три коэффициента ПИД регулятора и принцип работы

Работа ПИД-регулятора заключается в подаче выходного сигнала о силе мощности, необходимой для поддержания регулируемого параметра на заданном уровне. Для вычисления показателя используют сложную математическую формулу, в составе которой есть 3 коэффициента — пропорциональный, интегральный, дифференциальный.

Возьмем в качестве объекта регулирования ёмкость с водой, в которой необходимо поддерживать температуру на заданном уровне с помощью регулирования степени открытия клапана с паром.

Пропорциональная составляющая появляется в момент рассогласования с вводными данными. Простыми словами это звучит так — берется разница между фактической температурой и желаемой, умножается на настраиваемый коэффициент и получается выходной сигнал, который должен подаваться на клапан. Т.е. как только градусы упали, запускается процесс нагрева, поднялись выше желаемой отметки — происходит выключение или даже охлаждение.

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

Интегральная составляющая пытается на основе прошлых значений температуры, вернуть её значение, если оно поменялось. Подробнее процесс описан в видео ниже.

А дальше выходной сигнал регулятора, согласно коэффициенту, подается для повышения или понижения температуры. Со временем подбирается та величина, которая компенсирует внешние факторы, и скачки исчезают.

Интеграл используется для исключения ошибок путем расчета статической погрешности. Главное в этом процессе — подобрать правильный коэффициент, иначе ошибка (рассогласование) будет влиять и на интегральную составляющую.

Третий компонент ПИД — дифференцирующий. Он предназначен для компенсации влияния задержек, возникающих между воздействием на систему и обратной реакцией. Пропорциональный регулятор подает мощность до тех пор, пока температура не достигнет нужной отметки, но при прохождении информации к прибору, особенно при больших значениях, ошибки всегда возникают. Это может привести к перегреву. Дифференциал прогнозирует отклонения, вызванные задержками или воздействием внешней среды, и снижает подаваемую мощность заранее.

Настройка ПИД регулятора

Настройка ПИД-регулятора осуществляется 2 методами:

  1. Синтез подразумевает вычисление параметров на основании модели системы. Такая настройка получается точной, но требует глубоких познаний теории автоматического управления. Она подвластна только инженерам и ученым. Так как необходимо снимать расходные характеристики и производить кучу расчетов.
  2. Ручной способ основывается на методе проб и ошибок. Для этого за основу берутся данные уже готовой системы, вносятся некоторые коррективы в один или несколько коэффициентов регулятора. После включения и наблюдений за конечным результатом проводится изменение параметров в нужном направлении. И так до тех пор, пока не будет достигнут нужный уровень работоспособности.

Теоретический метод анализа и настройки на практике применяются крайне редко, что связано с незнанием характеристик объекта управления и кучей возможных возмущающих воздействий. Более распространены экспериментальные методы на основе наблюдения за системой.

Современные автоматизированные процессы реализуются как специализированные модули под управлением программ для настройки коэффициентов регулятора.

Назначение ПИД регулятора

ПИД регулятор предназначен для поддержания на требуемом уровне некой величины — температуры, давления, уровня в резервуаре, расхода в трубопроводе, концентрации чего-либо и т.д., изменением управляющего воздействия на исполнительные механизмы, такие как автоматические регулирующие клапана, используя для этого пропорциональную, интегрирующую, дифференцирующую величины для своей настройки.

Целью использования является получение точного управляющего сигнала, который способен контролировать большие производства и даже реакторы электростанций.

Пример схемы регулирования температуры

Часто ПИД регуляторы используются при регулировке температуры, давайте на простом примере подогрева воды в ёмкости рассмотрим данный автоматический процесс.

В емкости налита жидкость, которую нужно подогреть до нужной температуры и поддерживать её на заданном уровне. Внутри бака установлен датчик измерения температуры — термопара или термометр сопротивления и напрямую связан с ПИД-регулятором.

Для подогрева жидкости будем подавать пар, как показано ниже на рисунке, с клапаном автоматического регулирования. Сам клапан получает сигнал от регулятора. Оператор вводит значение температурной уставки в ПИД-регуляторе, которую необходимо поддерживать в ёмкости.

Что такое ПИД регулятор для чайников?

Если настройки коэффициентов регулятора неверны, будут происходить скачки температуры воды, при этом клапан будет то полностью открыт, то полностью закрыт. В этом случае необходимо рассчитать коэффициенты ПИД регулятора и ввести их заново. Если все сделано правильно, через небольшой промежуток времени система выровняет процесс и температура в ёмкости будет поддерживаться на заданной отметке, при этом степень открытия регулирующего клапана будет находиться в среднем положении.

ПИД-регулятор своими руками / Хабр

; PID управление
CalcMainEnd:
	; Вычисления, Go-Go.
CalcPid:
	;	1. Eo = E				 | 16bit
Pid1:
	MOV Err0H, ErrH
	MOV Err0L, ErrL
	;	2. E = Y-X				 | 16bit
Pid2:
	CLR C
	MOV A, SettingL
	SUBB A, ThermoL
	MOV ErrL, A
	MOV A, SettingH
	SUBB A, ThermoH
	MOV ErrH, A
	JNB  OV, Pid2Ov
	JB	ACC.7, Pid2Max
Pid2Min:
	MOV ErrL, #LOW(-500*32)
	MOV ErrH, #HIGH(-500*32)
	SJMP Pid2End
Pid2Max:
	MOV ErrL, #LOW(500*32)
	MOV ErrH, #HIGH(500*32)
	SJMP Pid2End
Pid2Ov:
	JNB ACC.7, Pid2OvP
Pid2OvN: ; Проверим на ограничение вниз
	CLR C
	MOV A, ErrL
	SUBB A, #LOW(-500*32)
	MOV A, ErrH
	SUBB A, #HIGH(-500*32)
	JNC Pid2End ; Если > -500 => всё ок
	SJMP Pid2Min
Pid2OvP:
	CLR C
	MOV A, ErrL
	SUBB A, #LOW(500*32)
	MOV A, ErrH
	SUBB A, #HIGH(500*32)
	JNC Pid2Max ; Если < 500 => всё ок
Pid2End:

	;	3. Int = Int + (E+Eo)/2  | 32bit+16bit
Pid3:
	JNB PowerReady, Pid3End ; Если нет сети -- интегральную часть не копим
	MOV A, ErrL
	ADD A, Err0L
	MOV R0, A ; временно
	MOV A, ErrH
	ADDC A, Err0H
	MOV C, ACC.7 ; Полусумма всегда влезает в 16 бит, поэтому при сдвиге надо сохранить знак
	RRC A	; Поделим без потери знака
	XCH A, R0 ; A= младшая часть, R0 - старшая часть полусуммы
	RRC A	; Доделили
	JNB  IntS, Pid3IntPos
	; Int отрицательный, изменим знак для R0:A, тем самым можно будет просто сложить с Int
	CLR C
	CPL A
	ADD A, #1
	XCH A, R0
	CPL A
	ADDC A, #0
	XCH A, R0
Pid3IntPos:
	; У Int и R0:A сейчас согласованы знаки, поэтому складываем обычным образом
	ADD A, IntLL
	MOV IntLL, A
	MOV A, IntLH
	ADDC A, R0
	MOV IntLH, A
	MOV A, R0
	JB	ACC.7, Pid3Neg ; Прибавляли отрицательную разность?
	; Если разность положительная, просто распространим перенос
	JNC jPid3End  ; Если прибавили слово и переноса небыло -- делать нам ничего не требуется.
	INC IntHL ; Распространяем перенос выше
	MOV A, IntHL
	JNZ Pid3End  ; Если перенос не ушел в 4й байт -- всё нормально
	INC IntHH ; Распространяем перенос на САМЫЙ старший байт
	MOV A, IntHH
	JNZ Pid3End  ; Если перенос не ушел еще выше -- всё нормально
	MOV IntHH, #0FFh ; Если перенс был выше -- ограничиваем интеграл потолком
	MOV IntHL, #0FFh
	MOV IntLH, #0FFh
	MOV IntLL, #0FFh
jPid3End:
	SJMP Pid3End
Pid3Neg: ; Если разность отрицательная, то надо продолжать добавлять оба раза, но FFh
	MOV A, IntHL
	ADDC A, #0FFh
	MOV IntHL, A
	MOV A, IntHH
	ADDC A, #0FFh
	MOV IntHH, A
	JC	Pid3End  ; Если тут был перенос, значит знак интеграла не изменился
	CPL IntS ; Если переноса небыло, значит у интеграла изменился знак
	CPL C		 ; Обратим знак получившегося числа
	MOV A, #0
	SUBB A, IntLL
	MOV IntLL, A
	MOV A, #0
	SUBB A, IntLH
	MOV IntLH, A
	MOV A, #0
	SUBB A, IntHL
	MOV IntHL, A
	MOV A, #0
	SUBB A, IntHH
	MOV IntHH, A
	; так как оно стало отрицательным -- то перенос тут будет всегда
Pid3End:

	;	5. cI = Int*(1/Ti)		 | 32*32=>32bit
Pid5: ; R3:R2:R1:R0 = Int*(1/Ti)
	JB Ti_sh2, Pid5Calc ; если Ti_sh2=0, то 1/Ti=1 или Ti=0. и ничего делать не надо
	MOV A, Ti_mLL
	ORL A, Ti_mLH
	ORL A, Ti_mHL
	ORL A, Ti_mHH
	JZ	Pid5Zero
	MOV R0, IntLL
	MOV R1, IntLH
	MOV R2, IntHL
	MOV R3, IntHH
	AJMP Pid5End
Pid5Zero:
	MOV A, #0
	MOV R0, A
	MOV R1, A
	MOV R2, A
	MOV R3, A
	MOV IntLL, A
	MOV IntLH, A
	MOV IntHL, A
	MOV IntHH, A
	AJMP Pid5End
Pid5Calc:
	; R7:R6:R5:R4[:R3] = MULUH(Int*Ti_m) // R3 считаем как часть для округления
	MOV R2, #0
	;; R7:R6 = IntHH*Ti_mHH
	MOV A, IntHH
	MOV B, Ti_mHH
	MUL AB
	MOV R7, B
	MOV R6, A
	; R6:R5 += IntHL*Ti_mHH
	MOV A, IntHL
	MOV B, Ti_mHH
	MUL AB
	MOV R5, A
	MOV A, R6
	ADD A, B
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	; R5:R4 += IntLH*Ti_mHH
	MOV A, IntLH
	MOV B, Ti_mHH
	MUL AB
	MOV R4, A
	MOV A, R5
	ADD A, B
	MOV R5, A
	MOV A, R2 ; A=0
	ADDC A, R6
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	; R4:R3 += IntLL*Ti_mHH
	MOV A, IntLL
	MOV B, Ti_mHH
	MUL AB
	MOV R3, A
	MOV A, R4
	ADD A, B
	MOV R4, A
	MOV A, R2 ; A=0
	ADDC A, R5
	MOV R5, A
	MOV A, R2 ; A=0
	ADDC A, R6
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	;; R6:R5 += IntHH*Ti_mHL
	MOV A, IntHH
	MOV B, Ti_mHL
	MUL AB
	ADD A, R5
	MOV R5, A
	MOV A, R6
	ADDC A, B
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	; R5:R4 += IntHL*Ti_mHL
	MOV A, IntHL
	MOV B, Ti_mHL
	MUL AB
	ADD A, R4
	MOV R4, A
	MOV A, R5
	ADDC A, B
	MOV R5, A
	MOV A, R2 ; A=0
	ADDC A, R6
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	; R4:R3 += IntLH*Ti_mHL
	MOV A, IntLH
	MOV B, Ti_mHL
	MUL AB
	MOV A, R3
	MOV R3, A
	MOV A, R4
	ADDC A, B
	MOV R4, A
	MOV A, R2 ; A=0
	ADDC A, R5
	MOV R5, A
	MOV A, R2 ; A=0
	ADDC A, R6
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	;; R5:R4 += IntHH*Ti_mLH
	MOV A, IntHH
	MOV B, Ti_mLH
	MUL AB
	ADD A, R4
	MOV R4, A
	MOV A, R5
	ADDC A, B
	MOV R5, A
	MOV A, R2 ; A=0
	ADDC A, R6
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	; R4:R3 += IntHL*Ti_mLH
	MOV A, IntHL
	MOV B, Ti_mLH
	MUL AB
	ADD A, R3
	MOV R3, A
	MOV A, R4
	ADDC A, B
	MOV R4, A
	MOV A, R2 ; A=0
	ADDC A, R5
	MOV R5, A
	MOV A, R2 ; A=0
	ADDC A, R6
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	;; R4:R3 += IntHH*Ti_mLL
	MOV A, IntHH
	MOV B, Ti_mLL
	MUL AB
	ADD A, R3
	MOV R3, A
	MOV A, R4
	ADDC A, B
	MOV R4, A
	MOV A, R2 ; A=0
	ADDC A, R5
	MOV R5, A
	MOV A, R2 ; A=0
	ADDC A, R6
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	;;; Если R3 > 7F --
	MOV A, R3
	JNB ACC.7, Pid5Shift ; Если R3<80 -- округление не надо
	ANL A, #7Fh
	JZ	Pid5Round ; Если = 80 -- округляем до нечетного
	MOV A, #1
	ADD A, R4
	MOV R4, A
	MOV A, R2 ; A=0
	ADDC A, R5
	MOV R5, A
	MOV A, R2 ; A=0
	ADDC A, R6
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	SJMP Pid5Shift
Pid5Round:
	MOV A, R4
	ORL A, #01h
	MOV R4, A
	;JMP Pid5Shift

Pid5Shift:
	; R3:R2:R1:R0 = (Int-R7:R6:R5:R4) >> 1
	CLR C
	MOV A, IntLL
	SUBB A, R4
	MOV R0, A
	MOV A, IntLH
	SUBB A, R5
	MOV R1, A
	MOV A, IntHL
	SUBB A, R6
	MOV R2, A
	MOV A, IntHH
	SUBB A, R7
	RRC A ; >>1 без потери переноса
	MOV R3, A
	MOV A, R2
	RRC A
	MOV R2, A
	MOV A, R1
	RRC A
	MOV R1, A
	MOV A, R0
	RRC A
	;MOV R0, A
	; R3:R2:R1:R0 += R7:R6:R5:R4
	;MOV A, R0
	ADD A, R4
	MOV R0, A
	MOV A, R1
	ADDC A, R5
	MOV R1, A
	MOV A, R2
	ADDC A, R6
	MOV R2, A
	MOV A, R3
	ADDC A, R7
	MOV R7, A
	; Теперь сдвинуть вправо на sh3.
	; sh3 может быть до 16 (так как у нас Ti 16разрядный; проверим необходимость сдвига на 16 бит)
	MOV A, Ti_sh3
	JNB ACC.4, Pid5ShiftUnder16
	; Надо сдвинуть >=16 -- 2 байта сдвинем mov'ами
	MOV R0, 18h+2; R2, bank 3
	MOV R1, 18h+3; R3, bank 3
	MOV R2, #0
	MOV R3, #0
Pid5ShiftUnder16:
	JNB ACC.3, Pid5ShiftUnder8
	; Надо сдвинуть на >=8 -- 1 байт сдвигаем mov'ами
	MOV R0, 18h+1; R1, bank 3
	MOV R1, 18h+2; R2, bank 3
	MOV R2, 18h+3; R3, bank 3
	MOV R3, #0
Pid5ShiftUnder8:
	ANL A, #07h
	JZ Pid5End ; Если внутри байта двигать не надо -- всё
	MOV R4, A
	SJMP Pid5ShiftRight
Pid5NextShift:
	CLR C
	; К этому моменту C у нас еще возможнозначимый старший бит!
Pid5ShiftRight:
	MOV A, R3
	RRC A
	MOV R3, A
	MOV A, R2
	RRC A
	MOV R2, A
	MOV A, R1
	RRC A
	MOV R1, A
	MOV A, R0
	RRC A
	MOV R0, A
	DJNZ R4, Pid5NextShift
	; Всё, после всех сдвигов получили результат
	; Не забываем, что у вычисленного в R3:R2:R1:R0
	; сейчас число положительное, а знак его в IntS
Pid5End:

	;	4. PID += [ cD = Td * (E-Eo) ]		| 16*16=>32bit
Pid4: ; cD = R7:R6:R5:R4; ErrD = E-Eo
	CLR C
	MOV A, ErrL
	SUBB A, Err0L
	MOV DiffL, A
	MOV A, ErrH
	SUBB A, Err0H
	MOV DiffH, A
	MOV C, ACC.7 ; Берём знак результата
	MOV DiffS, C ; Сохраним знак E-Eo
	JNC Pid4Mul
	; Diff -- орицательный, обратим знак
	MOV A, DiffL
	CPL A
	ADD A, #1
	MOV DiffL, A
	MOV A, DiffH
	CPL A
	ADDC A, #0
	MOV DiffH, A
Pid4Mul:
	; R7:R6 = DiffH*TdH
	; MOV A, DiffH = в любом случае A=DiffH
	MOV B, TdH
	MUL AB
	MOV R6, A
	MOV R7, B
	; R5:R4 = DiffL*TdL
	MOV A, DiffL
	MOV B, TdL
	MUL AB
	MOV R4, A
	MOV R5, B
	; R6:R5 += DiffH*TdL
	MOV A, DiffH
	MOV B, TdL
	MUL AB
	ADD A, R5
	MOV R5, A
	MOV A, R6
	ADD A, B
	MOV R6, A
	MOV A, R7
	ADDC A, #0
	MOV R7, A
	; R6:R5 += DiffL*TdH
	MOV A, DiffL
	MOV B, TdH
	MUL AB
	ADD A, R5
	MOV R5, A
	MOV A, R6
	ADD A, B
	MOV R6, A
	MOV A, R7
	ADDC A, #0
	MOV R7, A

	;	6. PID = E + cI + cD	 | 32bit
Pid6:	; R3:R2:R1:R0 равно cI, знак в IntS;
	; R7:R6:R5:R4 = cD; знак в DiffS
	; E в обратном дополнительном коде

	JB IntS, ChkDiffN
	JNB DiffS, Pid6Add ; Int>0, Diff>0 => Add
	SJMP Pid6Sub ; Int>0, Diff<0 => Sub
ChkDiffN:
	JNB DiffS, Pid6Sub ; Int<0, Diff>0 => Sub
	; Int<0, Diff<0 => Add
Pid6Add:
	; Одинаковый знак => складываем их с проверкой на переполнение
	MOV A, R0
	ADD A, R4
	MOV R0, A
	MOV A, R1
	ADDC A, R5
	MOV R1, A
	MOV A, R2
	ADDC A, R6
	MOV R2, A
	MOV A, R3
	ADDC A, R7
	MOV R3, A
	JNC Pid6Err ; Если нет переноса - в результате сложения переполнения небыло
	MOV R3, #0FFh
	MOV R2, #0FFh
	MOV R1, #0FFh
	MOV R0, #0FFh
	SJMP Pid6Err
Pid6Sub:
	; Знаки разные -- вычтем одно из другого и проверим знак результата
	CLR C
	MOV A, R4
	SUBB A, R0
	MOV R0, A
	MOV A, R5
	SUBB A, R1
	MOV R1, A
	MOV A, R6
	SUBB A, R2
	MOV R2, A
	MOV A, R7
	SUBB A, R3
	MOV R3, A
	JNC Pid6Err ; Если нет заимствования -- знак результата равен знаку DiffS
	CPL DiffS ; Если заимствование было, у DiffS и результата надо обратить знак
	MOV R6, #0 ; R6=0
	MOV A, R0
	CPL A
	ADDC A, R6 ; R6=0, C=1 => действие +1
	MOV R0, A
	MOV A, R1
	CPL A
	ADDC A, R6 ; +перенос
	MOV R1, A
	MOV A, R2
	CPL A
	ADDC A, R6
	MOV R2, A
	MOV A, R3
	CPL A
	ADDC A, R6
	MOV R3, A

Pid6Err:
	MOV R6, #0 ; R6=0
	; В R3:R2:R1:R0 -- лежит cI+cD; знак суммы в DiffS
	; надо прибавить/отнять Err, записанное в обратном коде
	; Приведём знак Err к DiffS
	MOV R4, ErrL
	MOV A, ErrH
	JB ACC.7, Pid6ChkDiffS
	JNB DiffS, Pid6SumErrNoInv ; Err>0, Diff>0 => NoInv
	SJMP Pid6SumErrInv
Pid6ChkDiffS:
	JNB DiffS, Pid6SumErrNoInv ; Err<0, Diff>0 => NoInv
Pid6SumErrInv:
	; У Err знак отличается от DiffS -- инвертируем
	SETB C ; Не уверен в состоянии C
	MOV A, ErrL
	CPL A
	ADDC A, R6 ; A+=R6+C, R6=0	C=1 => A+=1
	MOV R4, A ; R4=ErrL
	MOV A, ErrH
	CPL A
	ADDC A, R6
Pid6SumErrNoInv:
	MOV R5, A ; ErrH
Pid6SumErr:
	; Итак, в R5:R4 лежит Err, знак которого согласован с DiffS; но в обратно-дополнительном коде
	MOV A, R0
	ADD A, R4
	MOV R0, A
	MOV A, R5
	CLR F0
	JNB ACC.7, Pid6SubErrPos
	SETB F0
	MOV R6, #0FFh ; Добавляем отрицательное => дополняем FFами
Pid6SubErrPos:
	ADDC A, R1
	MOV R1, A
	MOV A, R2
	ADDC A, R6 ; +расширение
	MOV R2, A
	MOV A, R3
	ADDC A, R6 ; +расширение
	MOV R3, A
	MOV R6, #0
	; Надо проверить нет ли смены знака итоговой суммы
	JNC Pid6ChkF0
	JB F0, Pid7 ; Err<0, был перенос => Знак не сменился, переполнения нет
	SJMP Pid6SumOv ; Err>0, был перенос => переполнение
Pid6ChkF0:
	JNB F0, Pid7 ; Err>0, небыло переноса => нет переполнения
	;SJMP Pid6SumUf ; Err<0, небыло переноса => сменился знак
Pid6SumUf:
	; Если Err<0 и небыло переноса => сменился знак
	CPL DiffS
	MOV A, R0
	CPL A
	ADD A, #1 ; C=?, поэтому прибавляем 1 обычным методом
	MOV R0, A
	MOV A, R1
	CPL A
	ADDC A, R6
	MOV R1, A
	MOV A, R2
	CPL A
	ADDC A, R6
	MOV R2, A
	MOV A, R3
	CPL A
	ADDC A, R6
	MOV R3, A
	SJMP Pid7 ; Знак у результата и DiffS приведены в норму
Pid6SumOv:
	; Было переполнение => округляем до максимума
	MOV R0, #0FFh
	MOV R1, #0FFh
	MOV R2, #0FFh
	MOV R3, #0FFh

	;	7. U = K*PID/256		 | 32bit*16bit/8bit => 40bit,
	;					 | которые усекаются до 10bit
	;					 | при вычислениях
Pid7: ; В R3:R2:R1:R0 лежит результат PID, в DiffS его знак
	  ; Нужно вычислить K*PID/256, ограничив результат до 10бит
	  ; K всегда положительно, поэтому если PID < 0 => минимум
	JB DiffS, Pid7Umin
	; поскольку мы можем жестко ограничить сверху 16ю битами,
	; то если R3 != 0 => ставим максимум в любом случае
	MOV A, R3
	JNZ Pid7Umax
	; [R2:R1:R0 * KH:HL] = [R7:R6:R5:R4:R3]
	; вычисляем, учитывая что должно получиться R7=0 R6=0,
	; иначе переполнение, поэтому R7 и R6 вообще не трогаем
	; но проверяем результат
	; R7:R6 = R2*KH
	MOV A, R2
	JZ Pid7S1
	MOV A, KH
	JNZ Pid7Umax ; Если R2!=0 и KH!=0 => R7:R6>0 => переполнение
Pid7S1:
	; R6:R5 = R2*KL
	MOV A, R2
	MOV B, KL
	MUL AB
	MOV R5, A
	MOV A, B
	JNZ Pid7Umax ; Если R6 > 0 => переполнение
	; R6:R5 = R1*KH
	MOV A, R1
	MOV B, KH
	MUL AB
	ADD A, R5
	JC	Pid7Umax ; Если R6 > 0 => переполнение
	MOV R5, A
	MOV A, B
	JNZ Pid7Umax ; Если R6 > 0 => переполнение
	; R5:R4 = R0*KH
	MOV A, R0
	MOV B, KH
	MUL AB
	MOV R4, A
	MOV A, R5
	ADD A, B
	JC	Pid7Umax ; Если R6 > 0 => переполнение
	MOV R5, A
	; R5:R4 = R1*KL
	MOV A, R1
	MOV B, KL
	MUL AB
	ADD A, R4
	MOV R4, A
	MOV A, R5
	ADDC A, B
	JC	Pid7Umax ; Если R6 > 0 => переполнение
	MOV R5, A
	; R4:R3 = R0*KL
	MOV A, R0
	MOV B, KL
	MUL AB
	RLC A ; C = R3>=0x80, Z=R3>0x80
	MOV R3, #0FFh ; R3<>0x80 => ничего
	JNZ Pid7S2
	MOV R3, #0FEh ; R3==0x80 => округление до четного
Pid7S2:
	MOV A, R4
	ADDC A, B ; Складываем умножение, регистр, и перенос-округление
	ANL A, R3 ; А так же если округление до четного -- отбрасываем после младший бит
	MOV R4, A
	MOV A, R5
	ADDC A, R6 ; R6=0 у нас с давних пор, хоть мы туда и не складывали ничего во время перемножения
	JC	Pid7Umax ; Если R6 > 0 => переполнение
	MOV R5, A
	; R5:R4 => ограниченный в 16 бит результат
	; Теперь надо ограничить R5:R4 до Umax/Umin
	MOV A, UmaxL
	SUBB A, R4 ; C=0 на текущий момент
	MOV A, UmaxH
	SUBB A, R5
	JC Pid7Umax ; Если R5:R4>Umax => R5:R4 = Umax
	MOV A, UminL
	SUBB A, R4 ; C=0 на текущий момент
	MOV A, UminH
	SUBB A, R5
	JNC Pid7Umin ; Если R5:R4<Umin => R5:R4 = Umin
	; Мощность вычислена
	MOV UH, R5
	MOV UL, R4
	SETB UReady
	AJMP CalcExit
Pid7Umax: ; Установить максимальную мощность
	MOV UH, UmaxH
	MOV UL, UmaxL
	SETB UReady
	AJMP CalcExit
Pid7Umin: ; Установить минимальную мощность
	MOV UH, UminH
	MOV UL, UminL
	SETB UReady
	AJMP CalcExit

так ли страшен черт, как его малюют? Часть 5. Closed-Loop PID Autotuner / Блог компании ЦИТМ Экспонента / Хабр

Заключающая статья серии, посвященной автоматизированным способам настройки ПИД-регуляторов в среде Simulink, в которой мы рассмотрим применение блока автоматической настройки Closed-Loop PID Autotuner.

Этот блок похож на ранее рассмотренный инструмент Frequency Response Based PID Tuner: он также базируется на методе гармонического анализа. Располагается блок в разделе Simulink Control Design библиотеки Simulink.

Сразу стоит сказать, что система аналогична приведенной в предыдущей статье, поэтому все результаты моделирования можно посмотреть там же.

Модель системы

Рассматриваемая система приведена ниже.

Содержимое всех подсистем, кроме подсистемы регулятора, было рассмотрено в предыдущих статьях: Driver, Electric actuator, Load.

Для того чтобы использовать блок Closed-Loop PID Autotuner, необходимо включить его последовательно с блоком PID Controller, как показано ниже.

На порт входа 1 приходит сигнал ошибки с дискриминатора, на порт 2 — сигнал обратной связи; в данном случае угловая скорость объекта управления. В подсистеме Tune enable формируется сигнал начала и завершения эксперимента по настройке параметров регулятора.

В модель добавлены блоки Display для регистрации выполнения эксперимента в процентах

(% conv) и подобранных параметров регулятора (pid gains).

Предъявим к этой системе такие же требования, как к системе из предыдущей статьи.

Настраиваем контроллер

Окно параметров блока Closed-Loop PID Autotune позволяет выбрать тип используемого в системе регулятора, его форму, задавать цель эксперимента, а также его параметры.

Желаемое значение полосы пропускания (Target bandwidth) рассчитывается также, как в предыдущей статье. В нашем случае оно равно 4.83 рад/c.

Если используемый в системе регулятор цифрового типа, то в блоке автонастройки указывается его период квантования; при применении непрерывного регулятора задается шаг расчета модели при выполнении эксперимента (Experiment sample time). Рекомендуемое значение шага моделирования составляет . В нашем случае это значение равно 0.0041.

Во вкладке Experiment задаются параметры эксперимента. Рассматриваемая система является устойчивой, поэтому тип системы (Plant Type) указываем как Stable. Знак системы (Plant Sign) указывает на свойство совпадения знака выходной и входной координат. В данном случае оставляем этот параметр без изменения. Далее указывается амплитуда тестового гармонического сигнала (Sine Amplitudes) в соответствии с рекомендациями, приведенными в предыдущем параграфе. Устанавливаем амплитуду, равную 1.

Время начала эксперимента выбирается из расчета перехода системы в установившийся режим без регулятора. Время завершения эксперимента рекомендуется рассчитывать по формуле . Для нашей системы время начало эксперимента будет с, а время завершения с. Оба значения указываются в полях Step time соответствующих блоков Step в подсистеме Tune enable.

Следует отметить, что время завершения моделирования (Stop Time) необходимо указывать больше, чем время окончания эксперимента, иначе процесс настройки параметров регулятора не завершится.

После расчета модели подобранные параметры отобразятся в блоке Display.

Эти значения придется записать в соответствующие поля блока PID Controller вручную.

Для нормального функционирования системы переводим тумблер Manual Switch в подсистеме Tune Enable на вход нулевого сигнала. Таким образом, блок автонастройки не включится при моделировании системы.

Можно заметить, что рассчитанные параметры с помощью блока Closed-Loop PID Autotune практически совпадают с параметрами, полученными с помощью инструмента Frequency Response Based PID Tuner.

так ли страшен чёрт, как его малюют? Часть 1. Одноконтурная система / Блог компании ЦИТМ Экспонента / Хабр

Эта статья открывает цикл статей, посвященных автоматизированным способам настройки ПИД-регуляторов в среде Simulink. Сегодня разберемся, как работать с приложением PID Tuner.

Введение

Наиболее популярным типом применяемых в промышленности регуляторов в системах управления замкнутыми системами можно считать ПИД-регуляторы. И если структуру и принцип действия контроллера инженеры помнят еще со студенческой скамьи, то его настройка, т.е. расчет коэффициентов регулятора, до сих пор является проблемой. Существует огромное количество литературы, как зарубежной (например, [1, 2]), так и отечественной (например, [3, 4]), где настройка регуляторов объясняется на достаточно непростом языке теории автоматического управления.

В этой серии статей будут описываться автоматизированные способы настройки ПИД-регуляторов с помощью инструментов среды Simulink, таких как:

  • PID Tuner,
  • Response Optimizer,
  • Control System Tuner,
  • Frequency Response Based PID Tuner,
  • Closed-Loop PID Autotuner.

В качестве объекта системы управления будет выступать электропривод на базе двигателя постоянного тока с возбуждением от постоянных магнитов, работающий совместно с редуктором на инерционную нагрузку, со следующими параметрами:

Параметры нагрузки и редуктора:

  • момент инерции нагрузки, ;
  • передаточное число редуктора, .

Статьи практически не содержат математических формул, однако желательно, чтобы читатель обладал базовыми знаниями в теории автоматического управления, а также имел опыт моделирования в среде Simulink для понимания предлагаемого материала.

Модель системы

Рассмотрим линейную систему управления угловой скоростью следящего электропривода, упрощенная структурная схема которой представлена ниже.

В соответствии с приведенной структурой в среде Simulink была построена модель такой системы.

Модели электропривода (подсистема Electric actuator) и инерционной нагрузки (подсистема Load) созданы с помощью блоков библиотеки физического моделирования Simscape:

  • модель электропривода,

  • модель инерционной нагрузки.

Модели электропривода и нагрузки также включают подсистемы датчиков различных физических величин:

  • тока, протекающего в обмотке якоря двигателя (подсистема А),

  • напряжения на его обмотке (подсистема V),

  • угловой скорости объекта управления (подсистема Ω).

Перед настройкой параметров ПИД-регулятора запустим модель на расчет, приняв передаточную функцию регулятора . Результаты моделирования при отработке входного сигнала 150 об/мин показаны ниже.

Из анализа приведенных графиков видно, что:

  • Выходная координата системы управления не достигает заданного значения, т.е. в системе присутствует статическая ошибка.
  • Напряжение на обмотках двигателя достигает значения 150 В в начале моделирования, что повлечет за собой выход его из строя вследствие подачи на его обмотку напряжения больше номинального (24 В).

Пусть реакция системы на единичный импульс должна соответствовать следующим требованиям:

  • перерегулирование (Overshoot) не более 10%,
  • время нарастания (Rise time) менее чем 0.8 с,
  • время переходного процесса (Settling time) менее чем 2 с.

Кроме того, регулятор должен ограничивать напряжение, подаваемое на обмотку двигателя, до значения напряжения питания.

Настраиваем контроллер

Настройка параметров регулятора осуществляется с помощью инструмента PID Tuner, который доступен непосредственно в окне параметров блока PID Controller.

Приложение запускается нажатием на кнопку Tune…, расположенную на панели Automated tuning. Стоит отметить, что до выполнения этапа настройки параметров контроллера необходимо выбрать его вид (П, ПИ, ПД и др.), а также его тип (аналоговый или дискретный).

Поскольку одним из требований является ограничение его выходной координаты (напряжения на обмотке двигателя), то следует задать допустимый диапазон напряжений. Для этого:

  1. Переходим во вкладку Output Saturation.
  2. Нажимаем на флаговую кнопку Limit output, в результате чего активируются поля для задания верхней (Upper limit) и нижней (Lower limit) границы диапазона выходной величины.
  3. Устанавливаем границы диапазона.

Корректная работа блока регулятора в составе системы предполагает использования методов, направленных на борьбу с интегральным насыщением. В блоке реализованы два метода: back-calculation и clamping. Подробная информация о данных методах располагается здесь. Выпадающее меню выбора метода расположено на панели Anti-windup.

В рассматриваемом случае запишем значения 24 и -24 в поля Upper limit и Lower limit соответственно, а также используем метод clamping для исключения интегрального насыщения.

Можно заметить, что внешний вид блока регулятора изменился: появился знак насыщения рядом с выходным портом блока.

Далее, приняв все изменения нажатием кнопки Apply, возвращаемся во вкладку Main и нажимаем кнопку Tune…, в результате чего откроется новое окно приложения PIDTuner.

В графической области окна отображаются два переходных процесса: при текущих параметрах регулятора, т.е. для ненастроенного регулятора, и при значениях, подобранных автоматически. Новые значения параметров можно посмотреть, нажав на кнопку Show Parameters, расположенную на панели инструментов. При нажатии на кнопку появятся две таблицы: подобранные параметры регулятора (Controller Parameters) и произведенные оценки характеристик переходного процесса при подобранных параметрах (Performance and Robustness).

Как видно из значений второй таблицы, автоматически рассчитанные коэффициенты регулятора удовлетворяют всем требованиям.

Настройка регулятора завершается нажатием на кнопку с зеленым треугольником, расположенной справа от кнопки Show Parameters, после чего новые значения параметров автоматически изменятся в соответствующих полях в окне настройки параметров блока PID Controller.

Результаты моделирования системы с настроенным регулятором для нескольких входных сигналов показаны ниже. При больших уровнях входных сигналов (голубая линия) система будет работать в режиме с насыщением по напряжению.

Отметим, что инструмент PID Tuner подбирает коэффициенты регулятора по линеаризованной модели, поэтому при переходе к нелинейной модели требуется уточнять его параметры. В этом случае можно воспользоваться приложением Response Optimizer.

Литература

  1. Handbook of PI and PID Controller Tuning Rules. Aidan O’Dwyer
  2. PID Control System Design and Automatic Tuning using MATLAB, Simulink. Wang L.
  3. ПИД-управление в нестрогом изложении. Карпов В.Э.
  4. ПИД-регуляторы. Вопросы реализации. Части 1, 2. Денисенко В.

ПИД-регулятор температуры с инструкцией по эксплуатации микроконтроллера

Я брал год назад по другой ссылке за 50 с лишним долларов, но там комплект с еще одним, более навороченным термоконтроллером. Поэтому даю ссылку на другой лот с вроде бы нормальным продавцом и множеством заказов.
Брался для совсем других целей, но оказался приделан к кухонной электродуховке 🙂 В этом применении работает отлично 🙂
Подробнее под катом.

Год назад я заказал себе для паяльной печи комплект из двух термоконтроллеров — один обозреваемый и второй гораздо более функциональный. Почему-то у меня появилась глупая мысль использовать их вместе, но когда уже получил заказ резко поумнел и этот сравнительно простой термоконтроллер остался не удел.
Итак, что этот термоконтроллер может. Самое главное, конечно же, это поддерживать заданную температуру, управляя нагревателем. Но чем он лучше любого термоконтроллера за 1.5-2 бакса, которых полно на Али? Самое главное — тем, что он обеспечивает регулирование температуры PID-регулятором.

постараюсь объяснить попроще что такое PID-регуляция 🙂

По русски это понятие, кстати, сокращается в те же буквы — ПИД, Пропорционально-Интегрирующе-Дифференцирующая регуляция.
В инете множество статей, посвященных ПИД, но очень мало рассказывающих об этом понятными словами. Я не популяризатор, но постараюсь изложить принцип работы ПИД-регуляторов максимально доступно 🙂

ЗЫ: конкретные цифры на графиках могут не совпадать с цифрами в примерах, но принцип сохраняется 🙂

Представьте, что у нас есть банка с водой, температуру которой нужно поддерживать 70 градусов с помощью вставленного в эту банку нагревателя мощностью 100 Ватт. Для измерения температуры в воду опущен термометр.

Самый простой способ сделать это как раз применяется в однбаксовых терморегуляторах: включаем нагреватель, температура достигает заданной, выключаем нагреватель, температура падает ниже заданной — включаем нагреватель, и т.д.

Элементарнейший и дешевейший способ, не требующий никаких вычислительных ресурсов. На этом принципе делают как цифровые контроллеры, так и аналоговые, и даже механические. Однако есть у него большой недостаток — он не поддерживает более-менее точно заданную температуру. С таким регулятором температура воды в нашей банке будет гулять вокруг заданной, то превышая ее, то падая ниже. График температуры будет напоминать пилу. Это называется пороговый регулятор, то есть который включает или выключает нагреватель по достижении заданных порогов:

А что если не просто включать-выключать нагреватель, а регулировать его мощность — чем температура воды ниже заданной тем больше мощности подаем на нагреватель? Звучит логично и вот так у нас и начинает появляться ПИД 🙂 Точнее, появилась первая его составляющая Пс — пропорциональная, значение которой прямо пропорционально разнице между заданной и текущей температурами. Итак, будем выдавать на нагреватель значение Пс: при текущей температуре воды 20 градусов он выдаст в нагреватель 70-20=50 Ватт. Когда вода нагреется до 40 градусов, он уже будет выдавать 70-40=30 Ватт. При температуре воды 60 градусов он будет выдавать 70-60=10 Ватт. Отлично, никаких прыжков вокруг заданной температуры, все плавно 🙂 Однако есть одна закавыка: при мощности на нагревателе 10 Ватт он уже не может и дальше нагревать воду, а может только удерживать эти достигнутые 60 градусов. Итак, вода 60 градусов, Пс соответственно выдает 10 Ватт и температура воды стоит на месте, до 70 градусов с таким регулятором ей не добраться:

Нужно что-то добавлять к пропорциональной составляющей, какое-то значение, причем не постоянное. На помощь приходит Ис — интегрирующая составляющая. Это накопитель ошибок. При каждом измерении в него добавляется разница между заданной и текущей температурами. Если заданная температура больше, то добавляется положительное число, если меньше, то отрицательное. У этой составляющей есть заданное максимальное значение, превысить которое она не может, то есть если при очередном добавлении оказывается, что сумма превысит максимум, то Ис становится равной максимуму, но не больше. То же касается нуля — отрицательным числом она тоже не может стать. Пусть у нас этот максимум будет равен мощности нагревателя — 100. Теперь на нагреватель будет выдаваться суммарное значение мощности Пс+Ис. Для примера последовательность температур и что при этом получается:

1. Температура 20 градусов, Ис изначально равна нулю, Пс=70-20=50, в нагреватель выдается Ис+Пс=0+50=50 Ватт.

2. Вода нагрелась до 30 градусов, Ис=0(ее предыдущее значение)+(70-30)=40, Пс=70-30=40, в нагреватель выдается Ис+Пс=40+40=80 Ватт.

3. Вода нагрелась до 40 градусов, Ис=40(ее предыдущее значение)+(70-40)=70, Пс=70-40=30, в нагреватель выдается Ис+Пс=70+30=100 Ватт.

4. Вода нагрелась до 60 градусов, Ис=70(ее предыдущее значение)+(70-60)=80, Пс=70-60=10, в нагреватель выдается Ис+Пс=80+10=90 Ватт.

Смотрите-ка, пока все выглядит неплохо, вода уже 60 градусов, а нагреватель все еще греет воду, хотя и начал снижать мощность 🙂

5. Вода нагрелась до 70 градусов, Ис=80(ее предыдущее значение)+(70-70)=80, Пс=70-70=0, в нагреватель выдается Ис+Пс=80+0=80 Ватт.

6. Вода нагрелась до 80 градусов, Ис=80(ее предыдущее значение)+(70-80)=70, Пс=70-80=-10, в нагреватель выдается Ис+Пс=70+(-10)=60 Ватт.

Вода перегрелась. И хотя, как видно, мощность пошла вниз, температура еще будет какое-то время колебаться пока не успокоится на заданном значении:


Это называется перерегулирование. Происходит оно из-за того, что и нагреватель и термометр и, главное, вода имеют какую-то инерцию, регулятор получает обратную связь (показания температуры) с определенным запаздыванием. При подаче на нагреватель полной мощности вода не нагреется мгновенно до 100 градусов, и точно так же она не остынет мгновенно при выключении нагревателя. Регулятор посмотрел на температуру — холодная вода, добавил мощности. Через 2 секунды глянул — все еще холодная — опять добавил. А когда в очередной раз он обнаруживает, что вода уже дошла до нужной температуры то начинает выдавать мощность, накопленную в Ис, считая, что это как раз нужное для поддержания температуры значение мощности (на самом деле интегрирующая составляющая после устаканивания всех возмущений действительно содержит значение, необходимое для ровного поддержания регулируемой величины, а пропорциональная призвана только компенсировать случайные отклонения). Но для воды это много и она продолжает нагреваться. И только после превышения заданной температуры регулятор начинает снижать мощность. И эта качка продолжается некоторое время пока значение Ис не придет к нужной величине.

Что можно предпринять в таком случае? Ну, например можно понизить влияние на выходную мощность Ис. Это называется коэффициент, у каждой составляющей ПИД может быть свой коэффициент, которым можно повышать или понижать влияние этой составляющей на выходной результат. Уменьшим влияние Ис до 0.3 от его значения — Ис*0.3:

Уже лучше, но все равно есть колебание в начале. Это из-за слишком большого влияния пропорциональной составляющей, давайте уменьшим и ее влияние в 2 раз — Пс*0.5:


Идеально, правда? 🙂

Нуу… Почти. Колебаний нет, но вот время нагрева увеличилось. Оно пришло к заданной температуре только к 25-му отсчету.

На самом деле зачастую используют ПИ-регулятор, без его дифференцирующей части и это вполне работает, как видно. Однако часто можно добиться еще лучшего результата с использованием третьей составляющей — дифференцирующей, Дс.

Она является «демпфером», не дающим регулируемому устройству слишком быстро менять свое состояние. В нашем примере Дс начнет снижать выходную мощность тем сильнее чем быстрее будет нагреваться вода, иными словами она не даст «разогнаться» графику роста температуры настолько, чтобы он проскочил заданную температуру 🙂 При этом, пока до заданной температуры далеко влияние Дс не очень значительно на фоне других составляющих, температура может расти быстро. Но чем ближе она к заданной тем сильнее становится влияние Дс на фоне все уменьшающихся Ис и Пс.
Дс в отличии от Пс и Ис не прибавляется к выходному сигналу (в нашем примере- мощности), а вычитается из него. Она равна скорости изменения регулируемой величины (в нашем примере — температуры). Например, если в прошлый замер температура была 28 градусов, а в текущем замере она уже 31 градус, то Дс будет равна 3 — на столько температура выросла с прошлого замера, это скорость роста температуры. И это значение, возможно умноженное на свой коэффициент, вычитается из выходной мощности, потому эта составляющая и называется дифференцирующей 🙂

Вот что получится при добавлении Дс:


Как видно, температура вышла на режим гораздо быстрее и при этом без всплесков и колебаний. Попытку регулятора проскочить температуру вверх погасила как раз дифференцирующая составляющая.

Вот, если интересно, график изменения значений Пс, Ис и Дс в этом регуляторе в том же временном масштабе:

А вот что было бы без дифференцирующей составляющей при тех же условиях:

И еще раз коротким итогом 🙂

ПИД — это регулятор, который формирует сигнал воздействия на регулируемую величину из трех составляющих: пропорциональной, интегрирующей и дифференцирующей.

Пропорциональная составляющая добавляет в выходной сигнал сиюминутную разницу между заданной и текущей измеренной величинами (т.н. ошибку). Интегрирующая накапливает (интегрирует) разницы всех измерений и добавляет в выходной сигнал накопленное значение (но не превышающее заданного максимума). Дифференцирующая определяет скорость изменения регулируемой величины (на сколько она изменилась с прошлого измерения) и вычитает эту величину из выходного сигнала. Все три составляющие могут иметь свои коэффициенты, усиливающие или ослабляющие их влияние на выходной сигнал.

Уфф… 🙂 Ну, я говорил, что не являюсь популяризатором, поэтому за доходчивость своего изложения не отвечаю. Но я старался 🙂

ЗЫ: самое веселое заключается в подборе коэффициентов этих составляющих, т.к. без правильных (хотя бы примерно) значений этих коэффициентов ПИД-регулятор или вообще не будет регулировать или будет регулировать очень плохо. Подбор идеальных коэффициентов, как я понял, дело весьма нетривиальное. Пока я не встречал в инете доступное объяснение как их рассчитывать, в основном приводятся методики их экспериментального подбора. Что, впрочем, достаточно логично, т.к. для расчета нужно столько всего знать о регулируемом механизме, сколько о нем не всегда знают даже его создатели :))

Основные параметры этого регулятора (именно этой модели — REX-C100FK02-V*AN):

  • питание — 24 вольта постоянного напряжения / 24 вольта переменного напряжения / 85-264 вольта переменного напряжения
  • потребление — не более 9 VA при питании 240 вольт
  • выход — напряжение, 12 вольт, сопротивление нагрузки 600 Ом и выше
  • тип подключаемой термопары — K (в настройках можно выбрать целую кучу типов, но я не уверен, что железо универсальное и поддерживает всю эту кучу)
  • диапазон регулирования температуры — 0-400 градусов Цельсия (зависит от типа термопары)
  • выход аварийной сигнализации — один выход, реле на замыкание
  • период цикла регулирования — 0.5 сек
  • метод регулирования — PID, вкл/выкл (дискретный), P, PI, PD (настраивается)
  • вес — около 170 грамм
  • крепление — в отверстие панели

Вот русскоязычный мануал на этот контроллер (нашел где-то в сети) — drive.google.com/open?id=1HDs7UX5rllDy8GFdYrdINbcGI_Snoo00
А вот качественный англоязычный, чуть более полный, но по настройкам немного не соответствует — drive.google.com/open?id=1Ez—F-3hjLzNtKP36FkGy6vfGQ_AkPkn

И пролежал бы он у меня еще неизвестно сколько, если бы жена не пожаловалась, что в нашей электродуховке она не может запекать полимерную глину — температуру там нормально не выставить. Да и пироги порой подгорают 🙂 Духовка из самых дешевых, увы 🙂 И я вспомнил об этом контроллере. Мне он не понадобился, слишком примитивен, а вот для духовки — самое то. Но решил я не курочить духовку, а сделать отдельную коробочку с этим регулятором и твердотельным реле на 40 ампер. Точно такое же реле уже год трудится у меня на почти такой же духовке (переделанной в паяльную печь) и не жужжит.

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


Все подключения производятся через винтовые клеммы на задней стенке:


Подключение очень понятно расписано как на наклейке на корпусе контроллера, так и в мануале.


Меня интересует: питание (220 вольт), выход управляющего напряжения (прямиком на твердотельное реле), вход термопары.

При желании можно еще подключить выход аварийной сигнализации. Ее можно отключить или настроить на один из режимов:

  • превышение заданной температуры
  • падение ниже заданной температуры
  • попадание в заданный промежуток температуры
  • выход за заданный промежуток температуры

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

Общий план был такой — отдельная коробочка с контроллером и твердотельным реле на радиаторе, из нее выходят два силовых провода с вилкой и розеткой (да, розетка на проводе) и термопара. Термопара вставляется в духовку и зажимается ее дверцей, изоляция у термопары термоупорная, ничего ей не будет 🙂

Сначала мелькнула мысль напечатать корпус на 3D-принтере, но печатать такой размер из ABS на моем открытом всем сквознякам Anet A8 — геморрой, а PLA, размягчающийся уже при 55-60 градусах рядом с духовкой долго не проживет. Решил резать из литого поликарбоната толщиной 6 мм, их у меня есть несколько листов 50х50 см 🙂

Для начала нарисовал модель (стакан для масштаба):

Вот так оно будет собираться:

Верхняя крышка и одна стенка съемные, на винтах, остальное клееное. Правда, уже потом, когда все было сделано, до меня дошло, что лучше бы было сделать съемным дно, а не крышку, но переделывать не стал 🙂

Вырезал на фрезерном станке, так что размеры сошлись идеально. Неидеально сошлась только толщина, которая оказалась 5.9 мм вместо 6. Для более прочной склейки (или чтобы думать что так более прочно) по краям стенок сделал проточки, так что стенки соединяются полупазами:


И вот кучка запчастей готова к дальнейшей работе:

Сначала думал обклеить самоклейкой, но во-первых в магазине мне не попалась пленка нормального цвета, только цветочки да тканевые узоры, а во-вторых я не был уверен, что смогу обклеить без складок и щелей, так что решил красить.

Предварительная примерка показала что все сходится, поэтому закрепил стенки малярным скотчем и проклеил все стыки. Клеил дихлорметаном, держит железно. Набрал его в шприц с иглой, у которой отрезал скошенный носик, и прошелся иголкой по всем стыкам изнутри (даже по одному стыку, который не надо было клеить, увлекся :)). Дихлорметан очень текуч — моментально заполняет мельчайшие щели, и очень интенсивно испаряется, так что даже не пришлось давить поршень, тепло рук нагревало дихлорметан достаточно, чтобы его испарения создавали избыточное давление внутри шприца.

Сохнет:

А пока корпус сох, я откопал у себя кусок радиатора, который когда-то зачем-то заказывал на али (уже даже не помню зачем). По размерам он подошел идеально, разве что по длине пришлось отпилить нужный кусок.

Распечатал шаблон отверстий, прихватил его кусочками двухстороннего скотча к радиатору и просверлил отверстия:

После чего обнаружил, что слегка неправильно нарисовал модель твердотельного реле, и отверстия на радиаторе теперь не совсем совпадают с отверстиями в реле. К счастью, я ошибся очень удачно — во-первых не совпадало только одно отверстие, а во-вторых оно не совпадало так сильно, что совершенно не мешало просверлить правильное 🙂 Так что все обошлось просто лишним отверстием 🙂

Через час корпус уже был достаточно прочным, чтобы можно было спокойно его крутить и примерять. И вот тут я обнаружил свой второй прокол в модели: сам-то контроллер по габаритам я нарисовал верно, а вот крепежную рамку с защелками рисовать не стал. И оказалось, что она теперь мешает крышке закрыться примерно на 3 мм. Пришлось класть крышку в станок и фрезеровать на ее внутренней стороне выемку.

Еще одна моя ошибка была в том, что узкие планки, которые я приклеил к стенкам и к которым должны прикручиваться крышки, я вырезал без отверстий для болтов. Решил, что приклею, а потом по месту просверлю. Сверлить ровно и именно там где наметил никогда не было моей сильной стороной. Короче, почти все отверстия в этих планках уехали. Из-за этого пришлось разбивать сверлом отверстия в крышках и зенковкой пытаться профрезеровать скосы для шляпок в ту же сторону 🙂 Получился слегка колхоз…

Кстати, резьба в поликарбонате держит болты очень хорошо, никаких гаек не нужно.

Перед покраской слегка закруглил грани с помощью напильника и шкурки, процесс очень быстрый и легкий.

В процессе покраски я не делал фото, как-то забыл об этом, да там ничего интересного, в общем-то, и нет. Шкуркой заматировал поверхности, обезжирил, покрыл двумя слоями грунта и потом двумя слоями краски.

Почему такой цвет? А фиг его знает 🙂 Просто кроме этого у меня были лишь черный, синий, красный и зеленый, а они мне не нравились в данном случае 🙂 Ну и почему бы и нет 🙂

В отверстия для проводов я вставил специальные резиновые шайбы для таких случаев, брал их тоже на али:


(коцка — это результат моего нетерпения, полез ковырять корпус когда краска еще не высохла окончательно)

Так как они не предназначены для панелей толщиной 6 мм, пришлось с внутренней стороны делать под них выемки, оставляя стенки толщиной 1 мм:


Затянул в отверстия силовые провода, соединил заземление и одну из жил, из которой сделал отвод для запитки контроллера, как и от одной из вторых жил, идущей от вилки, прикрутил реле на термопасту к радиатору, а радиатор к корпусу:

Дальше все просто — провода к реле, отмерить длину проводов до контроллера, отрезать, зачистить, залудить, прикрутить…

Все провода, выходящие из корпуса я обтянул изнутри стяжками чтобы их случайно не выдернули. Стандартная практика.

Все соединил и включил посмотреть не бахнет ли что-нибудь салютом. Не бахнуло:


Там в глубине корпуса можно увидеть светящийся индикатор реле, значит все нормально, можно собирать 🙂

Для начала я решил устроить ему стресс-тест и подключил к нему вот такой тепловентилятор на 3 кВт:


Термопару при этом я посадил на радиатор реле и закрепил кусочком каптона чтобы контролировать температуру не только на ощупь.

Включил, тепловентилятор зажужал, а я пошел писать спойлер про ПИД-регулятор, время от времени отвлекаясь и проверяя температуру радиатора. Через 15 минут после старта температура дошла до 50 градусов. Еще через 20 минут она была уже 67 градусов и на этом значении продержалась следующие 30 минут пока я не выключил все это — в офисе стало жарко 🙂 Вердикт — с духовкой 1.5-2 кВт справится без проблем 🙂

Повседневное (когда не нужно менять какие-то глубокие настройки) управление этим контроллером очень простое. Сразу после подачи питания она начинает пытаться регулировать температуру, отдельного включения для этого не предусмотрено.

Вообще передняя панель минималистична:


Верхний, красный дисплей — измеряемая (текущая) температура

Нижний, зеленый дисплей — заданная температура

Индикаторы слева по порядку сверху вниз:

1. Аварийная сигнализация 1

2. Выходной сигнал

3. Аварийная сигнализация 2

4. Индикатор работающей автонастройки PID

Кнопки слева направо: «настройка», «сдвиг», «вверх», «вниз».

Для установки заданной температуры нажимаем «настройку», все разряды нижнего дисплея кроме младшего начинают мерцать. Кнопками «вверх» и «вниз» выставляем в младшем разряде нужную цифру и нажимаем «сдвиг», теперь мерцают все разряды кроме десятков, настройка сдвигается на разряд влево. И так выставляем нужные цифры во всех разрядах. Для окончания настройки нажимаем еще раз «настройку».

Более подробные настройки вкратце

Как я писал в спойлере про PID-регулятор, коэффициенты такого регулятора — дело тонкое и подбирать их нужно для каждого случая. Изначальные настройки коэффициентов в этом регуляторе скорее всего не подойдут под ваше применение, нужно подбирать свои. Эти коэффициенты и другие параметры в регуляторе можно изменить в более глубоких настройках. Чтобы войти в этот режим нажмите и удерживайте кнопку «настройка» 3-4 секунды.
На верхнем дисплее название параметра, а на нижнем — текущее значение этого параметра. Настройка значения производится так же, как и настройка температуры — кнопками вверх-вниз меняем текущий разряд, потом кнопкой сдвига переходим к следующему и т.д. Для перехода к следующему параметру нажимаем «настройку». Для сохранения всех настроек и выхода из этого режима жмем и удерживаем 3-4 секунды кнопку «настройка».
Список параметров в той последовательности в которой они перебираются:

  • AL1 — настройка выхода первой аварийной сигнализации (в этой модели она одна, второй нет).
  • AГU — автонастройка PID
  • P — коэффициент Пс (пропорциональной составляющей ПИД), когда выставлен в 0 контроллер работает в дискретном режиме регулирования
  • I — коэффициент Ис (интегрирующей составляющей ПИД), когда установлен в 0 контроллер работает в режиме ПД
  • d — коэффициент Дс (дифференцирующей составляющей ПИД), когда установлен в 0 контроллер работает в режиме ПИ
  • Ar — насколько я понял, этот параметр задает максимум Ис, но не уверен, что понял правильно.
  • Г — тоже не совсем понял этот параметр, но похоже, что это период, с которым происходит измерение текущей температуры и соответствующее изменение выходного сигнала
  • SC — тут можно подкорректировать показания термопары, это значение добавляется к ним. Может быть как положительным, так и отрицательным числом.
  • LCK — блокировка настроек, 0000 — все настройки доступны, 0001 — изменить можно только заданную температуру и AL1, 0011 — изменить можно только заданную температуру, 0111 — изменить ничего нельзя.

и далее опять по кругу, начиная с AL1.
И в этих настройках можно изменить коэффициенты ПИД на требуемые. Однако чтобы знать на что их менять нужно очень хорошо понимать что делаешь и как это отразится на работе контроллера, или же долго и нудно перебирать их в надежде наткнуться на правильные значения. И чтобы облегчить жизнь простым смертным в контроллере предусмотрена автоматическая настройка этих коэффициентов.
Порядок проведения автонастройки:
Все условия должны быть приближены к реальным. То есть если Вы настраиваете для использования с духовкой, то духовка должна быть подключена, закрыта и температура на контроллере должна быть выставлена на максимальную (можно процентов на 10 меньше) из того диапазона, который предполагается применять в духовке. В процессе настройки контроллер нагреет духовку до этой температуры и подержит ее некоторое время.
Итак, подключили духовку (но пока не включаем ее нагреватели), выставили температуру (я установил 180 градусов), заходим в настройки, перебираем пункты пока не появится AГU, выставляем в 1 младший разряд и выходим из настроек. Начинает мигать индикатор AT. Теперь включаем нагреватели духовки и ждем пока мигание AT прекратится. Контроллер нагревает духовку постоянным нагревом до заданной температуры, выключает нагрев и следит за тем на сколько и как быстро температура превысит заданную после выключения нагрева. Исходя из скорости нагрева, «перескока» температуры и скорости дальнейшего остывания он и вычисляет коэффициенты ПИД. Этот процесс он может повторить 2-3 раза для уточнения.

Процесс автонастройки категорически рекомендуется после покупки или после изменения условий работы (другой нагревательный прибор, что-то изменили в текущем нагревателе и т.п., то есть все, что влияет на процесс нагрева). У меня до автонастройки контроллер вообще не мог довести температуру духовки до заданных 180 градусов. Провел автонастройку (видео ускороено в 10 раз):

И работа контроллера после этого (тоже ускорено в 10 раз):

Как видно, ПИД остался настроен не совсем оптимально (а никто и не обещал идеала :)), температура перескакивает по инерции заданную аж на 10 градусов. В дальнейшем при желании можно подкорректировать вычисленные им коэффициенты (что я и сделаю на домашней духовке), но при этом нужно понимать что и зачем менять.

Кстати, тот второй, более продвинутый контроллер (он видел слева на видео) справился с автонастройкой гораздо лучше, ничего корректировать не пришлось, перескок температуры на 200 градусах не превышает 2-3 градусов.

Есть и еще один уровень настроек, вход в него осуществляется нажатием и удержанием в течении 3-4 секунд одновременно кнопок «настройка» и «сдвиг». Но туда без необходимости лучше не лазить, а при необходимости внимательно сверяться с мануалом 🙂

Результат всей этой возни 🙂


Итог:

Контроллер своих денег стоит и с работой справляется очень неплохо, особенно если настроить его чуть более тонко, чем предполагает автонастройка. Твердотельное реле тоже отлично справляется с достаточно большой нагрузкой, хотя насчет заявленных 40 ампер у меня очень большие сомнения. Максимум 20, да и то с хорошим радиатором и его активным охлаждением.

Все 🙂

Корректная реализация разностной схемы ПИД регулятора / Хабр

ПИД-регулятор является простейшим регулятором, имеющим эффективные аппаратные аналоговые реализации, и потому применяемый наиболее широко. Для своей работы требует настройки 3х коэффициентов под конкретный объект, позволяющие подобрать процесс регулирования согласно требованиям. Обладая простым физическим смыслом и простой математической записью, применяется широко и часто в регуляторах температуры, регуляторах расхода газа и других системах, где требуется поддерживать некий параметр на заданном уровне, с возможными переходами между разными заданными уровнями. Разумеется, существуют более сложные регуляторы, позволяющие более точно и быстро и с меньшими перерегулированиями выходить на заданные параметры, а так же учитывающие нелинейность или гистерезис регулируемого объекта, однако они обладают большей вычислительной сложностью и сложнее в настройке.

Несмотря на свою простоту как физического смысла, так и математической записи:


при програмной реализаци ПИД регулятора очень часто допускают ошибки, которые встречаются даже в поверенных приборах автоматики.

Причем проверить качество реализации ПИД регулятора крайне легко.

Рассмотрим простейший пример: терморегулятор. Для проверки его качестве лучше всего подходит быстрый, малоинерциальный, маломощный объект. Классика жанра: обычная лампочка на 100Вт с прикрученной к ней тонкой термопарой (ХА). И первое, на чем следует проверять ПИД регулятор — деградация ПИД до просто П-регулятора. То есть коэффициенты интегральной и дифференциальной ставим в ноль, а пропорциональную ставим в максимум.

Включаем регулятор, проверяем: текущая температура 22 градуса, уставка 16 градусов. Лампочка не горит. Начинаем начинаем увеличивать уставку: 16.1, 16.3, 16.7, 18… 19… лампочка загорелась. Как?! Откуда?! Останавливаемся — выключилась. Итак, мы встретились с первой классической ошибкой реализации ПИД регулятора.

Небольшое математическое отступление: вспомним еще раз интегральную запись указанную выше. Мы реализуем её програмно, а значит — дискретно. То есть с завидной регулярностью производим измерение входной величины, сравниваем её с уставкой, вычисляем воздействие, выдаём, повторить. А значит, надо из интегральной формы перейти в конечно-разностную схему. При переходе обычно используется переход «в лоб»:


где E(n) = X(n) - X0(n) — то есть величина рассогласования между текущим и заданным значением регулируемого параметра.

Использование прямой формулы потребует во-1х считать и хранить интеграл рассогласований за большой период, во-2х требует работы с плавающей точкой высокой точности (так как интегральный коэффициент Ki всегда < 1), либо операции деления (представляя коэффициент в форме 1/Ki) большой разрядности. Всё это требует вычислительных ресурсов, коих в embedded как правило сильно ограничено… Поэтому, вместо реализации прямой схемы, реализуют рекуррентную формулу:


использование рекуррентной формулы позволяет сократить объём вычислений и разрядность промежуточных значений.

Итак, вернёмся к нашему регулятору. Итак, есть регулируемый объект: лампочка. Для управления подаваемой на неё мощностью, используют простой подход: сеть питания (220В 50Гц) подаётся через симистор на нагрузку. Симистор в момент перехода полуволны через ноль выключается, и остаётся выключен до тех пор, пока не будет подан сигнал на управляющий электрод. Таким образом, чем раньше после начала полуволны мы подадим управляющий сигнал, тем больше энергии от этой полуволны достигнет управляемого объекта. Правильно расчитав время для линейности площади части полуволны с момента времени X до конца полуволны, мы получаем возможность выдавать мощность от 0 до 100% с точностью, с которой расчитали таблицу линеаризации.

Итак, мы можем выдавать мощность от 0 до 100%. В реальных объектах, часто нельзя выдавать 100% мощности — например, это черевато перегоранием нагревательного элемента. Поэтому, все приборы имеют настройку минимальной и максимальной выдаваемой мощности на объект.

Итак, после вычисления U(n) по вышестоящей формуле, добавляется еще ограничение результата:
if Un < Umin then Un := Umin; if Un>Umax then Un := Umax;

После чего, вычисленное Un и есть требуемая выходная мощность на текущий момент. Та-дам! Именно вот эта реализация и создаёт ошибку, о которой написано выше.

Причина банальна: в момент перехода от дикретной к конечно-разностной схеме, мы «выносим за скобки» операцию вычисления интеграла, и на каждом шаге мы прибавляем производную к накопленной сумме U(n-1). Наложив же на неё ограничение, мы весь вычисленный интеграл фактически обнуляем. (Ну не сколько обнуляем, сколько приводим к диапазону 0-100, что в данном случае несущественно). Таким образом, мы дифференциурем ПИД регулятор, и остаётся дифференциально-ускорительный. Что в реальности выглядит как просто дифференциальный регулятор — мощность при этом подаётся пропорционально изменению уставки или регулируемой величины, а не пропорционально разности между уставкой и регулируемой величиной.

Вывод №1: вычисление U(n) нельзя ограничивать. Для ограничения мощности подаваемой на выходное устройство следует заводить отдельную переменную.

Теперь, когда мы завели Urn, для ограниченной мощности, перезаливаем, продолжаем тестировать.

Включаем регулятор, проверяем: текущая температура 22 градуса, уставка 16 градусов. Лампочка не горит.

Начинаем прибавлять уставку: 16.1, 16.4, 17, 18, 20, 22, 24 (опа! засветилось! ура!), 28, 30, 40, 60… Красота! Работает!

Наблюдаем за процессом — вышло примерно на 60, болтается чуток туда-сюда, но держит. Вроде, всё красиво. Выдыхаем, проверяем управление с ПК: задаём 600 градусов. И… Лампочка выключается. Как так? Уставка 600, текущая 60, а лампочка не горит?

Пока ждём и медленно осознаём, что мы явно напоролись на какой-то «Классический Косяк №2» ™ лампочка медленно разгорается, выходит на 100% мощности, и так и остаётся — 600-то градусов она выдать ну никак не может.

Возвращаемся снова к нашей разностной схеме. U(n) = U(n-1) + Kp*(dE + ...). К текущему расчетному значению воздействия прибавляется разность невязки помноженная на коэффициент пропорциональности. У нас была уставка 60, температура 60, то есть невязка нулевая. Выходная мощность так же была нулевая. И тут разом, скачком, уставку увеличили до 600 градусов. невязка резко стала 540 градусов, помножили еще и на коэффициент пропорциональности… и вылетели за разрядность хранения U(n). Не смейтесь, использование математики с фиксированной точки, вместо плавающей точки. При разнице в 540 градусов и работе через 1/16, при коэффициенте пропорциональности 20, получаем… 540*20*16=172800, а если у нас 16тиразрядный U(n), да еще и знаковый, то фактически, в результате вычисления мы получили A300h = −8960. Опачки. Вместо большого плюса — ощутимый такой минус.

Вывод №2: вычисления должны проводиться с корректной поддержкой переполнения. Переполнилось? Ограничь предельным числом, уж никак не заворачивать.

Итак, нарастили разрядность U(n), перетранслировали, зашили, запускаем. Лампочка еще не совсем остыла, там 80 градусов, уставка всё те же 600. Лампочка зажигается… и тухнет. Зажигается и тухнет. Как так? Уставка 600, лампочка 80 — и поддерживает вполне себе свои 80! Как так-то?! Явно у нас вылез Жучок №3.

И снова лирически-математическое отступление. Итак, есть наша разностная схема: U(n) = G(U(n-1), dE(n)). Еще раз: новое значение воздействия есть сумма прошлого воздействия и некого воздействия, зависящего от разности невязки в текущий момент и предыдущий. А что такое предыдущий момент? А какой момент предыдущий у предыдущего? Ну-ка, вспомнили школу. Доказательство по индукции. Если можно построить доказательство для K+1, считая что доказательство для K верно, И доказать отдельно что верно для K=0, тогда доказательство истинно. Итак, а как мы считаем U(0)?

Часто встречающееся решение: всё обнуляем, уставку считываем из флешпамяи уставки, ждём 1 цикл опроса, и считываем X(0). Вот, ноль готов, теперь работаем. И… И не правильно. Почему? Потому что рекурентная формула отталкивается от изменений в невязке. А проинициализировав нулём и загрузив текущие значения мы потеряли стартовые условия. Всё — вместо поддержания абсолютного значения температуры на уровне равном абсолютной уставке регулятор начинает держать температуру равную стартовой плюс разнице уставки. То есть было 80 градусов и уставка 200, включили прибор — он держет 80. Сменили уставку на 240 — он начал держать 120.

Правильная инициализация разностной схемы: обнулить _вообще всё_. То есть
X(0) = 0, X0(0) = 0. U(0) = 0. E(0)=X(0)-X0(0)=0.

И на первом же цикле вычислений у нас как бы скачком появляются уставке и текущее значение:
X(1) = 80. X0(1)=200. U(1) = U(0)+Kp*(E(1)-E(0)) = U(0)+Kp*(X(1)-X0(1)-E(0)) = 0 + 20*(200 - 80 - 0) = 2400

Вот теперь схема работает правильно.

Вывод №3: корректно инициализируй стартовые условия.

Правильно ли? Hу-ка, ну-ка… Еще раз… Ставим уставку 20. Ждём охлаждения… Выключаем. Включаем. Итак, красота: текущая 20, уставка 20. Ставим скачком 600. Поехало греться. 100, 120… ставим уставку 20. Отключилось, пошло охлаждаться. Ждём чуток (120… 110… 100… 90… 80…) и ставим уставку 100. Поехало греться… 105 градусов, отключилось. Стоп. А почему оно держит 105? У нас же сейчас работает только пропорциональная составляющая. При правильной реализации из физического смысла процесса колебательный процесс не может держать уставку выше чем задано. Строго ниже. А держит на 5 градусов больше чем попросили. Это наблюдается Прикол №4.

Итак, вспоминаем что у нас было выше: Вывод№2: U(n) нельзя ограничивать. И Вывод№3: при переполнении ограничить всё-таки придётся. Да-да. Иначе «рабочая точка» смещается на ограниченный момент. Что же делать? Увеличить разрядость? Хорошо, если хватает вычислительной мощности. А надо ли? Собственно, что плохого, что у нас U(n) = 9999.99, а не 29999.99? В общем-то только то, что мы потеряли 20000. Но сейчас-то для работы нам так и так надо вваливать просто 100% мощности, правильно? Правильно. Значит, проблемы с ограничением в полку нет, до тех пор, пока мы не отходим от предела. Таким образом, в случае переполнения надо ставить флаг, и по достижении, например, половины диапазона (то есть как U(n) после 9999.9 опустилось ниже 5000.00), заново реинициализировать схему. То есть отбрасывать историю, сказать что n=0 и см. выше Вывод №3. Пытливый ум уже сообразил, что в случае полной схемы, когда все три компоненты не равны нулю, обнуляя в процессе итеративный процесс, мы в том числе обнуляем накопленный интеграл интегральной составляющей. Однако, в связи с тем, что обнуляем мы значительно заранее, он успеет подкопиться за время довырабатывания остатка. Да и не совсем корректно копить интеграл на «больших» перегонах, так как цель интегральной составляющей — «выбрать» невязку, которую не может отработать пропорциональная составляющая отдельно.

Вывод №4: если по какой-то причине U(n) было ограничено, схему следует переинициализировать как только создалось впечатление, что схема вернулась в нормальное состояние.

В следующем выпуске: а так ли надо реализовывать разностную схему? Подробная реализация прямой дискретной схемы, обладающей простыми и понятными настраиваемыми коэффициентами, с прямым физическим смыслом, которая без проблем вычисляет управляющее воздействие с частотой 25Гц на процессоре ADuC847 (быстрый 8-битный контроллер, с ядром 8051), оставляя еще море процессорного времени для других процессов.

(Картинки с изображением формул взяты из статьи ПИД-Регулятор в Wikipedia)

ПИД регулирование для чайников

Не знаю имеется ли в этом смысл но вот:

Закончил специальность АТП — автоматизирование технологических процессов, расчет регуляторов является большей частью для моей специальности.

Выходная точность зависит от 2 компонентов — качества измерительной техники и качества управляющей техники.

Измерительная составляющая.

Термистор EPCOS NTC G560 100K — такой стоит у меня в принтере.

Имеет класc точности (1), при разбросе измеряемых температур 355 имеет погрешность в 3,55 градуса.

Номинальное сопротивление имеет 100 ом — это сопротивление при 23.5 градусах, замеряется скорее всего ток (так как плата имеет источник напряжение на входовыходах), в среднем типовые амперметры имеют класс точности 1,5 — это 200мА и 3мА погрешности (1 — 1,5 градуса).

В сумме имеем погрешность в 5 градусов Цельсия.

Управляющий механизм.

Немного полиграфии:

Пропорционально-интегро-дифференцирующий (ПИД) регулятор — устройство в управляющем контуре с обратной связью. Используется в системах автоматического управления для формирования управляющего сигнала с целью получения необходимых точности и качества переходного процесса. ПИД-регулятор формирует управляющий сигнал, являющийся суммой трёх слагаемых, первое из которых пропорционально разности входного сигнала и сигнала обратной связи (сигнал рассогласования), второе — интеграл сигнала рассогласования, третье — производная сигнала рассогласования.

И по делу:

Пропорциональная составляющая в логическом смысле нас не интересует.

Интегральная составляющая нужна для устранения статической ошибки (без нее регулируемая величина может иметь фиксированное отклонение, что-то вроде +5 градусов на все время регулирования).

Дифференциальная составляющая — это достаточно забавный способ регулирования. Для расчета значения в момент времени Т, она использует значение величины в момент времени Т+1. С математической точки зрения проблем нет, но в реальной жизни будущее значение нам не известно, и в реальности дифференциальная составляющая идет с задержкой по времени. Поясняю в момент времени Т мы исполняем расчетное изменения для момента Т-1. Дифференциальная составляющая собственно и регулирует.

Это был небольшой вводный курс в ТАУ.

Есть множество вариантов расчетов ПИД регуляторов, чаще всего используют метод Зиглера, есть уже готовые калькуляторы на матлабе и маткаде.

Если бы мы имели большую вычислительную емкость, на нашей плате, можно было бы использовать опытную схему регулирования (гигантские таблицы с входными изменениями и ответной регулировкой на них). Самый оптимум так как там можно задать воздействия куллера.

Подведу итог : Погрешность измерительных приборов и датчиков сводит на нет точность настройки ПИД регулятора, Если вы закажете высокоточные датчики сразу с преобразованием в hart протокол, rs232 или какой либо еще, и сможете настроить его на своей плате, у вас появится смысл точной (до 0,02) настройки ПИД. Самый легкий способ — пойти в вуз в котором преподают ТАУ (нефтяные, производственные направления) и заплатить преподавателю за расчет с настройкой (не обращайтесь к студентам они все под ответ подгоняют — ТАУ никогда не сходится).

Наиболее удачным вариантом для стабилизации температуры — это материал сопла с высокой теплоемкостью (будет долго нагревается но и колебаться температура будет меньше). Из опыта могу предложить изолировать сопло от ветра(хоть тем же каптоновым скотчем слоев на 20).

Надеюсь я ответил на большинство вопросов по этой теме.

что это такое, регулирование температуры ПИД регулятор

Дифференциальный пропорционально-интегральный регулятор — устройство, которое устанавливается в автоматизированных системах для поддержания заданного, способного к изменениям.

На первый взгляд все запутанно, но можно объяснить ПИД регулирование и для чайников, т.е. людей, не совсем знакомых с электронными системами и приборами.

Что такое ПИД регулятор?

ПИД регулятор — прибор, встроенный в управляющий контур, с обязательной обратной связью.Он для поддержания уровней задаваемых величин предназначен, например, температуры воздуха.

Устройство подает управляющий или выходной сигнал на устройство регулирования, на основании полученных данных от датчиков или сенсоров. Контроллеры высокими показателями переходных процессов и качеством выполнения поставленной задачи.

Что такое ПИД регулятор для чайников?

Три коэффициента ПИД регулятора и принцип работы

Работа ПИД-регулятора заключается в подаче выходного сигнала о силе мощности, необходимой для поддержания регулируемого на заданном уровне.Для вычисления показателя используют сложную математическую формулу, в составе которой есть 3 коэффициента — пропорциональный, интегральный, дифференциальный.

Возьмем в качестве объекта регулирования ёмкость с водой, в которой необходимо поддерживать температуру на заданном уровне с помощью регулирования степени открытия клапана с паром.

Пропорциональная составляющая появляется в моментогласования вводными данными. Простыми словами это звучит так — разница между фактической температурой и желаемой, умножается на настраиваемый коэффициент и получается выходной сигнал, который должен подаваться на клапан.Т.е. как только градусы упали, запускается процесс перехода, поднялись выше желаемой отметки — происходит выключение или даже охлаждение.

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

Интегральная составляющая пытается на основе прошлых значений температуры, вернуть ее значение, если оно поменялось. Подробнее процесс описан в видео ниже.

А дальше выходной сигнал регулятора, согласно коэффициенту, выступает для повышения или понижения температуры. Со временем подбирается та величина, которая компенсирует внешние факторы, и скачки исчезают.

Интеграл используется для исключения ошибок путем расчета статической погрешности. Главное в процессе этого — правильный коэффициент, иначе ошибка (рассогласование) будет влиять и на интегральную составляющую.

Третий компонент ПИД — дифференцирующий. Он для компенсации влияния задержек, устанавливающих между воздействием на систему и обратной реакцией. Пропорциональный регулятор подает мощность до тех пор, пока температура не достигла нужной отметки, но при прохождении информации к прибору, особенно при больших значениях, всегда ошибки возникают.Это может привести к перегреву. Дифференциал прогнозирует отклонения, вызванные задержками или воздействием внешней среды, и снижает подаваемую мощность заранее.

Настройка ПИД регулятора

Настройка ПИД-регулятора осуществляется двумя методами:

  1. Синтез подразумевает вычисление параметров на основании модели системы. Такая настройка получается точной, но требует глубоких познаний теории автоматического управления. Она подвластна только инженерам и ученым. Так как необходимо снимать расходные характеристики и выполнять кучу расчетов.
  2. Ручной способ основывается на методе проб и ошибок. Для этого за основу берутся данные уже готовой системы, вносятся коррективы в один или несколько коэффициентов регулятора. После включения и наблюдений за конечным результатом проводится изменение параметров в нужном направлении. И так до тех пор, пока не будет достигнут нужный уровень работоспособности.

Теоретический метод анализа и применения практики применяются крайне редко, что вызвано незнанием объекта управления и кучей вызывающим воздействием.Более распространены экспериментальные методы на основе наблюдения за системой.

Современные автоматизированные процессы реализуются программно специализированные модули под управлением коэффициентов регулятора.

Назначение ПИД регулятора

ПИД регулятор предназначен для поддержания на необходимом уровне некой величины — температуры, давления, уровня в резервуаре, расхода в трубопроводе, концентрации чего-либо и т.д., изменением управляющего воздействия на исполнительные механизмы, такие как автоматические регулирующие клапана, использующие эту изменяющую, дифференцирующую величину для своей настройки.

Целью использования является получение точного управляющего сигнала, который способен контролировать большие и даже реакторы электростанций.

Пример схемы регулирования температуры

Часто ПИД используются регуляторы при регулировке температуры, давайте на простом примере подогрева воды в ёмкости рассмотрим данный автоматический процесс.

В емкости налита жидкость, которую нужно подогреть до нужной температуры и поддерживать ее на заданном уровне.Внутри бака установлен датчик измерения температуры — термопара или термометр сопротивления и напрямую с ПИД-регулятором.

Для подогрева жидкости будем подавать пар, как показано на рисунке, с клапаном автоматического регулирования. Сам клапан получает сигнал от регулятора. Оператор ввода значения температурной уставки в ПИД-регуляторе, которую необходимо поддерживать в ёмкости.

Что такое ПИД регулятор для чайников?

Если настройки коэффициентов неверного регулятора, будут происходить скачки температуры воды, при этом клапан будет полностью открыт, то полностью закрыт.В этом случае необходимо рассчитать коэффициенты ПИД регулятора и ввести их заново. Если все сделано правильно, через промежуток времени система выровняет процесс и температура в ёмкости будет поддерживаться на заданной отметке, при этой степени открытия регулирующего клапана будет находиться в среднем положении.

.

так ли страшен чёрт, как его малюют? Часть 1. Одноконтурная система / Блог компании ЦИТМ Экспонента / Хабр

Эта статья открывает цикл статей, посвященных автоматизированным способам ПИД-регуляторов в среде Simulink. Сегодня разберемся, как работать с приложением PID Tuner.

Введение

Наиболее популярным типом применяемых в промышленности регуляторов в системах управления замкнутыми системами можно считать ПИД-регуляторы. И если используется и принцип действия контроллера инженеры помнят еще со студенческой скамьи, то его настройка, т.е. расчет коэффициентов регулятора, до сих пор является проблемой. Существует огромное количество литературы, как зарубежной (например, [1, 2]), так и отечественной (например, [3, 4]), где настройка регуляторов объясняется на достаточно непростом языке теории автоматического управления.

В этой серии статей будут описаны автоматизированные способы настройки ПИД-регуляторов с помощью инструментов среды Simulink, таких как:

  • PID Tuner,
  • Оптимизатор отклика,
  • Тюнер системы управления,
  • ПИД-тюнер на основе частотной характеристики,
  • Автонастройка ПИД-регулятора с обратной связью.

В качестве объекта системы управления выступать электропривод на базе постоянного тока с возбуждением от постоянных магнитов, работающего совместно с редуктором на инерционную нагрузку, со своими функциями:

Параметры нагрузки и редуктора:

  • момент инерции нагрузки,;
  • передаточное число редуктора,.

Статьи практически не содержат математических формул, однако желательно, чтобы читатель обладал базовыми знаниями в области теории автоматического управления, а также имел опыт моделирования в среде Simulink для понимания предлагаемого материала.

Модель системы

Рассмотрим линейную систему управления угловой скоростью следящего электропривода, упрощенная структурная схема которой представлена ​​ниже.

В соответствии с приведенной структурой в среде Simulink была построена модель такой системы.

Модели электропривода (подсистема Электропривода) и инерционной нагрузки (подсистема Load) с помощью блоков физического моделирования Simscape:

  • модель электропривода,

  • модель инерционной нагрузки.

Модели электропривода и нагрузки включают в себя также подсистемы датчиков различных физических величин:

  • тока, протекающего в обмотке якоря двигателя (подсистема А),

  • на его обмотке (подсистема V),

  • угловой скорости объекта управления (подсистема Ω).

Перед настройкой параметров ПИД-регулятора запустим модель на расчет, приняв передаточную функцию регулятора.Результаты моделирования при отработке входного сигнала 150 об / мин показаны ниже.

Из анализа приведенных графиков видно, что:

  • Выходная координата системы управления не достигает заданного значения, т.е. в системе присутствует статическая ошибка.
  • Напряжение на обмотках двигателя устанавливает значения 150 В начале моделирования, что повлечет за собой выход из системы подачи на его обмотку напряжения больше номинального (24 В).

Пусть реакция системы на единичный импульс соответствует требованиям:

  • перерегулирование (перерегулирование) не более 10%,
  • время нарастания (Время нарастания) менее чем 0.8 с,
  • время переходного процесса (Время установления) менее 2 с.

Кроме того, регулятор должен ограничивать напряжение, подаваемое на обмотку двигателя, до значения напряжения питания.

Настраиваем контроллер

Настройка параметров регулятора осуществляется с помощью инструмента PID Tuner, который доступен непосредственно в окне параметров блока PID Controller.

Приложение запускается нажатием на кнопку Tune… , расположенную на панели Автоматическая настройка . Стоит отметить, что до выполнения этапа настройки контроллера необходимо выбрать его вид (П, ПИ, ПД и др.), А также его тип (аналоговый или дискретный).

Укажите ограничение его выходных координат (напряжение на обмотке двигателя), то следует установить допустимый диапазон напряжений. Для этого:

  1. Переходим во вкладку Output Saturation .
  2. Нажимаем на флаговую кнопку Предельный выход , в котором активируются поля для достижения результата (верхний предел) и нижний (нижний предел) границы диапазона выходной величины.
  3. Устанавливаем границы диапазона.

Корректная работа блока регулятора в составе предполагает использование методов, направленных на борьбу с интегральным насыщением. В блоке реализованы два метода: обратный расчет и зажим. Подробная информация о методах рассматривается здесь.Выпадающее меню выбора расположения на панели Anti-windup .

В рассматриваемом случае запишем значения 24 и -24 в поле Верхний предел и Нижний предел соответственно, а также используем метод зажима для исключения интегрального насыщения.

Можно заметить, что внешний вид блока регулятора изменился: знак насыщения рядом с выходным портом блока.

Далее, приняв все изменения нажатием кнопки Apply , возвращаемся во вкладку Main и нажимаем кнопку Tune… , в результате чего откроется новое окно приложения PIDTuner.

В графической области системы два переходных процесса: при текущих параметрах регулятора, т.е. для ненастроенного регулятора, и при значениях, подобранных автоматически. Новые значения параметров можно посмотреть, закрыть на кнопку Показать параметры , расположенную на панели инструментов. При нажатии на кнопку появятся две таблицы: подобные параметры регулятора (Параметры контроллера) и произведены характеристики переходного процесса при подобных параметрах (Производительность и надежность).

Как видно из значений второй таблицы, автоматически рассчитанные коэффициенты регулятора удовлетворяют всем требованиям.

Настройка регулятора завершается нажатием на кнопку с зеленым треугольником, расположенной справа от кнопки Показать параметры , после чего новые значения параметров автоматически изменяются в соответствующих полях в окне настройки параметров блока ПИД-контроллера.

Результаты моделирования системы с настроенным регулятором для нескольких входных сигналов показаны ниже.При больших уровнях входных сигналов (голубая линия) система будет работать в режиме с насыщением по напряжению.

Отметьте, что инструмент PID Tuner подбирает коэффициенты регулятора по линеаризованной модели, поэтому при переходе к нелинейной модели требуется уточнять его параметры. В этом случае можно воспользоваться приложением Response Optimizer.

Литература

  1. Справочник по правилам настройки ПИ- и ПИД-регуляторов.Эйдан О’Дуайер
  2. Проектирование системы ПИД-регулирования и автоматическая настройка с использованием MATLAB, Simulink. Ван Л.
  3. ПИД-управление в нестрогом изложении. Карпов В.Э.
  4. ПИД-регуляторы. Вопросы реализации. Части 1, 2. Денисенко В.

.

ПИД-регулятор своими руками / Хабр

 ; PID управление
CalcMainEnd:
; Вычисления, Go-Go.
CalcPid:
; 1. Eo = E | 16 бит
Pid1:
MOV Err0H, ErrH
MOV Err0L, ErrL
; 2. E = Y-X | 16 бит
Pid2:
CLR C
MOV A, Настройка L
SUBB A, Термол
MOV ErrL, A
MOV A, НастройкаH
SUBB A, ThermoH
MOV ErrH, A
JNB OV, Pid2Ov
JB ACC.7, Pid2Max
Pid2Min:
MOV ErrL, #LOW (-500 * 32)
MOV ErrH, # ВЫСОКИЙ (-500 * 32)
SJMP Pid2End
Pid2Max:
MOV ErrL, #LOW (500 * 32)
MOV ErrH, # ВЫСОКИЙ (500 * 32)
SJMP Pid2End
Pid2Ov:
JNB ACC.7, Pid2OvP
Pid2OvN:; Проверим на ограничение вниз
CLR C
MOV A, ErrL
ПОДБА А, # НИЗКИЙ (-500 * 32)
MOV A, ErrH
ПОДБА А, # ВЫСОКИЙ (-500 * 32)
JNC Pid2End; Если> -500 => всё ок
SJMP Pid2Min
Pid2OvP:
CLR C
MOV A, ErrL
ПОДБА А, # НИЗКИЙ (500 * 32)
MOV A, ErrH
ПОДБА А, # ВЫСОКИЙ (500 * 32)
JNC Pid2Max; Если <500 => всё ок
Pid2End:

; 3. Int = Int + (E + Eo) / 2 | 32 бит + 16 бит
Pid3:
JNB PowerReady, Pid3End; Если нет сети - интегральную часть не копим
MOV A, ErrL
ДОБАВИТЬ A, Err0L
MOV R0, A; временно
MOV A, ErrH
ADDC A, Err0H
MOV C, ACC.7; Полусумма всегда влезает в 16 бит, поэтому при сдвиге надо сохранить знак
RRC A; Поделим без потерь знака
XCH A, R0; A = младшая часть, R0 - старшая часть полусуммы
RRC A; Доделили
JNB IntS, Pid3IntPos
; Инт отрицательный, изменим знак для R0: A, тем самым можно будет просто сложить с Int
CLR C
CPL A
ДОБАВИТЬ A, # 1
XCH A, R0
CPL A
ADDC A, # 0
XCH A, R0
Pid3IntPos:
; У Int и R0: A сейчас согласованы знаки, поэтому складываем обычным образом
ДОБАВИТЬ A, IntLL
MOV IntLL, A
MOV A, IntLH
ADDC A, R0
MOV IntLH, A
MOV A, R0
JB ACC.7, Pid3Neg; Прибавляли отрицательную разность?
; Если разность положительная, просто распространим перенос
JNC jPid3End; Если прибавили слово и переноса небыло - делать нам ничего не требуется.
INC IntHL; Распространяем перенос выше
MOV A, IntHL
JNZ Pid3End; Если перенос не ушел в 4й байт - всё нормально
INC IntHH; Распространяем перенос на САМЫЙ старший байт
MOV A, IntHH
JNZ Pid3End; Если перенос не ушел еще выше - всё нормально
MOV IntHH, # 0FFh; Если перенс был выше - ограничиваем интеграл потолком
MOV IntHL, # 0FFh
MOV IntLH, # 0FFh
MOV IntLL, # 0FFh
jPid3End:
SJMP Pid3End
Pid3Neg:; Если разность отрицательная, то надо продолжать добавлять оба раза, но FFh
MOV A, IntHL
ADDC A, # 0FFh
MOV IntHL, A
MOV A, IntHH
ADDC A, # 0FFh
MOV IntHH, A
JC Pid3End; Если тут был перенос, значит знак интеграла не изменился
CPL IntS; Если переноса небыло, значит у интеграла изменился знак
CPL C; Обратим знак получившегося числа
MOV A, # 0
SUBB A, IntLL
MOV IntLL, A
MOV A, # 0
SUBB A, IntLH
MOV IntLH, A
MOV A, # 0
SUBB A, IntHL
MOV IntHL, A
MOV A, # 0
SUBB A, IntHH
MOV IntHH, A
; так как оно стало отрицательным - то перенос тут будет всегда
Pid3End:

; 5.cI = Int * (1 / Ti) | 32 * 32 => 32 бит
Pid5:; R3: R2: R1: R0 = Int * (1 / Ti)
JB Ti_sh2, Pid5Calc; если Ti_sh2 = 0, то 1 / Ti = 1 или Ti = 0. и ничего делать не надо
MOV A, Ti_mLL
ОРЛ А, Ti_mLH
ОРЛ А, Ti_mHL
ОРЛ А, Ti_mHH
JZ Pid5Zero
MOV R0, IntLL
MOV R1, IntLH
MOV R2, IntHL
MOV R3, IntHH
AJMP Pid5End
Pid5Zero:
MOV A, # 0
MOV R0, A
MOV R1, A
MOV R2, A
MOV R3, A
MOV IntLL, A
MOV IntLH, A
MOV IntHL, A
MOV IntHH, A
AJMP Pid5End
Pid5Calc:
; R7: R6: R5: R4 [: R3] = MULUH (Int * Ti_m) // R3 считаем как часть для округления
MOV R2, # 0
;; R7: R6 = IntHH * Ti_mHH
MOV A, IntHH
MOV B, Ti_mHH
MUL AB
MOV R7, B
MOV R6, A
; R6: R5 + = IntHL * Ti_mHH
MOV A, IntHL
MOV B, Ti_mHH
MUL AB
MOV R5, А
MOV A, R6
ДОБАВИТЬ A, B
MOV R6, A
MOV A, R2; А = 0
ADDC A, R7
MOV R7, A
; R5: R4 + = IntLH * Ti_mHH
MOV A, IntLH
MOV B, Ti_mHH
MUL AB
MOV R4, A
MOV A, R5
ДОБАВИТЬ A, B
MOV R5, А
MOV A, R2; А = 0
ADDC A, R6
MOV R6, A
MOV A, R2; А = 0
ADDC A, R7
MOV R7, A
; R4: R3 + = IntLL * Ti_mHH
MOV A, IntLL
MOV B, Ti_mHH
MUL AB
MOV R3, A
MOV A, R4
ДОБАВИТЬ A, B
MOV R4, A
MOV A, R2; А = 0
ADDC A, R5
MOV R5, А
MOV A, R2; А = 0
ADDC A, R6
MOV R6, A
MOV A, R2; А = 0
ADDC A, R7
MOV R7, A
;; R6: R5 + = IntHH * Ti_mHL
MOV A, IntHH
MOV B, Ti_mHL
MUL AB
ДОБАВИТЬ A, R5
MOV R5, А
MOV A, R6
ADDC A, B
MOV R6, A
MOV A, R2; А = 0
ADDC A, R7
MOV R7, A
; R5: R4 + = IntHL * Ti_mHL
MOV A, IntHL
MOV B, Ti_mHL
MUL AB
ДОБАВИТЬ A, R4
MOV R4, A
MOV A, R5
ADDC A, B
MOV R5, А
MOV A, R2; А = 0
ADDC A, R6
MOV R6, A
MOV A, R2; А = 0
ADDC A, R7
MOV R7, A
; R4: R3 + = IntLH * Ti_mHL
MOV A, IntLH
MOV B, Ti_mHL
MUL AB
MOV A, R3
MOV R3, A
MOV A, R4
ADDC A, B
MOV R4, А
MOV A, R2; А = 0
ADDC A, R5
MOV R5, А
MOV A, R2; А = 0
ADDC A, R6
MOV R6, A
MOV A, R2; А = 0
ADDC A, R7
MOV R7, A
;; R5: R4 + = IntHH * Ti_mLH
MOV A, IntHH
MOV B, Ti_mLH
MUL AB
ДОБАВИТЬ A, R4
MOV R4, А
MOV A, R5
ADDC A, B
MOV R5, А
MOV A, R2; А = 0
ADDC A, R6
MOV R6, A
MOV A, R2; А = 0
ADDC A, R7
MOV R7, A
; R4: R3 + = IntHL * Ti_mLH
MOV A, IntHL
MOV B, Ti_mLH
MUL AB
ДОБАВИТЬ A, R3
MOV R3, A
MOV A, R4
ADDC A, B
MOV R4, A
MOV A, R2; А = 0
ADDC A, R5
MOV R5, А
MOV A, R2; А = 0
ADDC A, R6
MOV R6, A
MOV A, R2; А = 0
ADDC A, R7
MOV R7, A
;; R4: R3 + = IntHH * Ti_mLL
MOV A, IntHH
MOV B, Ti_mLL
MUL AB
ДОБАВИТЬ A, R3
MOV R3, A
MOV A, R4
ADDC A, B
MOV R4, А
MOV A, R2; А = 0
ADDC A, R5
MOV R5, А
MOV A, R2; А = 0
ADDC A, R6
MOV R6, A
MOV A, R2; А = 0
ADDC A, R7
MOV R7, A
;;; Если R3> 7F -
MOV A, R3
JNB ACC.7, Pid5Shift; Если R3 <80 - округление не надо
ANL A, # 7Fh
JZ Pid5Round; Если = 80 - округляем до нечетного
MOV A, # 1
ДОБАВИТЬ A, R4
MOV R4, А
MOV A, R2; А = 0
ADDC A, R5
MOV R5, А
MOV A, R2; А = 0
ADDC A, R6
MOV R6, A
MOV A, R2; А = 0
ADDC A, R7
MOV R7, A
SJMP Pid5Shift
Pid5Round:
MOV A, R4
ОРЛ А, # 01h
MOV R4, А
; JMP Pid5Shift

Pid5Shift:
; R3: R2: R1: R0 = (Int-R7: R6: R5: R4) >> 1
CLR C
MOV A, IntLL
ПОДБ А, R4
MOV R0, A
MOV A, IntLH
ПОДБ А, R5
MOV R1, A
MOV A, IntHL
ПОДБ А, R6
MOV R2, A
MOV A, IntHH
ПОДБ А, R7
RRC A; >> 1 без потерь переноса
MOV R3, A
MOV A, R2
RRC A
MOV R2, A
MOV A, R1
RRC A
MOV R1, A
MOV A, R0
RRC A
; MOV R0, A
; R3: R2: R1: R0 + = R7: R6: R5: R4
; MOV A, R0
ДОБАВИТЬ A, R4
MOV R0, A
MOV A, R1
ADDC A, R5
MOV R1, A
MOV A, R2
ADDC A, R6
MOV R2, A
MOV A, R3
ADDC A, R7
MOV R7, A
; Теперь сдвинуть вправо на sh3.; sh3 может быть до 16 (так как у нас Ti 16разрядный; проверим необходимость сдвига на 16 бит)
МОВ А, Ти_ш3
JNB ACC.4, Pid5ShiftUnder16
; Надо сдвинуть> = 16 - 2 байта сдвинем mov'ами
MOV R0, 18ч + 2; R2, банк 3
MOV R1, 18ч + 3; R3, банк 3
MOV R2, # 0
MOV R3, # 0
Pid5ShiftUnder16:
JNB ACC.3, Pid5ShiftUnder8
; Надо сдвинуть на> = 8 - 1 байт сдвигаем mov'ами
MOV R0, 18ч + 1; R1, банк 3
MOV R1, 18ч + 2; R2, банк 3
MOV R2, 18ч + 3; R3, банк 3
MOV R3, # 0
Pid5ShiftUnder8:
ANL A, # 07h
JZ Pid5End; Если внутри байта двигать не надо - всё
MOV R4, А
SJMP Pid5ShiftRight
Pid5NextShift:
CLR C
; К этому моменту C у нас еще возможнозначимый старший бит!
Pid5ShiftRight:
MOV A, R3
RRC A
MOV R3, A
MOV A, R2
RRC A
MOV R2, A
MOV A, R1
RRC A
MOV R1, A
MOV A, R0
RRC A
MOV R0, A
DJNZ R4, Pid5NextShift
; Всё, после всех сдвигов получили результат
; Не забываем, что у вычисленного в R3: R2: R1: R0
; сейчас число положительное, а знак его в IntS
Под конец:

; 4.PID + = [cD = Td * (E-Eo)] | 16 * 16 => 32 бит
Pid4:; cD = R7: R6: R5: R4; ErrD = E-Eo
CLR C
MOV A, ErrL
SUBB A, Err0L
MOV DiffL, A
MOV A, ErrH
SUBB A, Err0H
MOV DiffH, A
MOV C, ACC.7; Берём знак результата
MOV DiffS, C; Сохраним знак E-Eo
JNC Pid4Mul
; Diff - орицательный, обратим знак
MOV A, DiffL
CPL A
ДОБАВИТЬ A, # 1
MOV DiffL, A
MOV A, DiffH
CPL A
ADDC A, # 0
MOV DiffH, A
Pid4Mul:
; R7: R6 = DiffH * TdH
; MOV A, DiffH = в любом случае A = DiffH
MOV B, TdH
MUL AB
MOV R6, A
MOV R7, B
; R5: R4 = DiffL * TdL
MOV A, DiffL
MOV B, TdL
MUL AB
MOV R4, А
MOV R5, B
; R6: R5 + = DiffH * TdL
MOV A, DiffH
MOV B, TdL
MUL AB
ДОБАВИТЬ A, R5
MOV R5, А
MOV A, R6
ДОБАВИТЬ A, B
MOV R6, A
MOV A, R7
ADDC A, # 0
MOV R7, A
; R6: R5 + = DiffL * TdH
MOV A, DiffL
MOV B, TdH
MUL AB
ДОБАВИТЬ A, R5
MOV R5, А
MOV A, R6
ДОБАВИТЬ A, B
MOV R6, A
MOV A, R7
ADDC A, # 0
MOV R7, A

; 6.PID = E + cI + cD | 32 бит
Pid6:; R3: R2: R1: R0 равно cI, знак в IntS;
; R7: R6: R5: R4 = cD; знак в DiffS
; E в обратном дополнительном коде

JB IntS, ChkDiffN
JNB DiffS, Pid6Add; Int> 0, Diff> 0 => Добавить
SJMP Pid6Sub; Int> 0, Diff <0 => Sub
ChkDiffN:
JNB DiffS, Pid6Sub; Int <0, Diff> 0 => Sub
; Int <0, Diff <0 => Добавить
Pid6Add:
; Одинаковый знак => складываем их с проверкой на переполнение
MOV A, R0
ДОБАВИТЬ A, R4
MOV R0, A
MOV A, R1
ADDC A, R5
MOV R1, A
MOV A, R2
ADDC A, R6
MOV R2, A
MOV A, R3
ADDC A, R7
MOV R3, A
JNC Pid6Err; Если нет переноса - в результате сложения переполнения небыло
MOV R3, # 0FFh
MOV R2, # 0FFh
MOV R1, # 0FFh
MOV R0, # 0FFh
SJMP Pid6Err
Pid6Sub:
; Знаки разные - вычтем одно из другого и проверим знак результата
CLR C
MOV A, R4
ПОДБ А, R0
MOV R0, A
MOV A, R5
ПОДБ А, R1
MOV R1, A
MOV A, R6
ПОДБ А, R2
MOV R2, A
MOV A, R7
ПОДБА А, R3
MOV R3, A
JNC Pid6Err; Если нет заимствования - знак результата равенство знаку DiffS
CPL DiffS; Если заимствование было, у DiffS и результат надо обратить знак
MOV R6, # 0; R6 = 0
MOV A, R0
CPL A
ADDC A, R6; R6 = 0, C = 1 => действие +1
MOV R0, A
MOV A, R1
CPL A
ADDC A, R6; + перенос
MOV R1, A
MOV A, R2
CPL A
ADDC A, R6
MOV R2, A
MOV A, R3
CPL A
ADDC A, R6
MOV R3, A

Pid6Err:
MOV R6, # 0; R6 = 0
; В R3: R2: R1: R0 - лежит cI + cD; знак суммы в DiffS
; надо прибавить / отнять Err, записанное в обратном коде
; Приведём знак Err к DiffS
MOV R4, ErrL
MOV A, ErrH
JB ACC.7, Pid6ChkDiffS
JNB DiffS, Pid6SumErrNoInv; Err> 0, Diff> 0 => NoInv
SJMP Pid6SumErrInv
Pid6ChkDiffS:
JNB DiffS, Pid6SumErrNoInv; Err <0, Diff> 0 => NoInv
Pid6SumErrInv:
; У Err знак отличается от DiffS - инвертируем
SETB C; Не уверен в состоянии C
MOV A, ErrL
CPL A
ADDC A, R6; А + = R6 + C, R6 = 0 C = 1 => A + = 1
MOV R4, A; R4 = ErrL
MOV A, ErrH
CPL A
ADDC A, R6
Pid6SumErrNoInv:
MOV R5, A; ErrH
Pid6SumErr:
; Итак, в R5: R4 составляет Err, знак которого согласован с DiffS; но в дополнительном дополнительном коде
MOV A, R0
ДОБАВИТЬ A, R4
MOV R0, A
MOV A, R5
CLR F0
JNB ACC.7, Pid6SubErrPos
SETB F0
MOV R6, # 0FFh; Добавляем отрицательное => дополняем FFами
Pid6SubErrPos:
ADDC A, R1
MOV R1, A
MOV A, R2
ADDC A, R6; + расширение
MOV R2, A
MOV A, R3
ADDC A, R6; + расширение
MOV R3, A
MOV R6, # 0
; Надо проверить нет ли смены знака итоговой суммы
JNC Pid6ChkF0
JB F0, Pid7; Err <0, был перенос => Знак не сменился, переполнения нет
SJMP Pid6SumOv; Err> 0, был перенос => переполнение
Pid6ChkF0:
JNB F0, Pid7; Err> 0, небыло переноса => нет переполнения
; SJMP Pid6SumUf; Err <0, небыло переноса => сменился знак
Pid6SumUf:
; Если Err <0 и небыло переноса => сменился знак
CPL DiffS
MOV A, R0
CPL A
ДОБАВИТЬ A, # 1; C = ?, поэтому прибавляем 1 обычным методом
MOV R0, A
MOV A, R1
CPL A
ADDC A, R6
MOV R1, A
MOV A, R2
CPL A
ADDC A, R6
MOV R2, A
MOV A, R3
CPL A
ADDC A, R6
MOV R3, A
SJMP Pid7; Знак у результата и Различия в норму
Pid6SumOv:
; Было переполнение => округляем до максимума
MOV R0, # 0FFh
MOV R1, # 0FFh
MOV R2, # 0FFh
MOV R3, # 0FFh

; 7.U = K * PID / 256 | 32 бит * 16 бит / 8 бит => 40 бит,
; | которые усекаются до 10bit
; | прих вычисления
Pid7:; В R3: R2: R1: R0 лежит результат PID, в DiffS его знак
; Нужно вычислить K * PID / 256, ограничив результат до 10бит
; K всегда положительно, поэтому если PID <0 => минимум
JB DiffS, Pid7Umin
; поскольку мы можем жестко ограничить сверху 16ю битами,
; то если R3! = 0 => ставим максимум в любом случае
MOV A, R3
JNZ Pid7Umax
; [R2: R1: R0 * KH: HL] = [R7: R6: R5: R4: R3]
; учитывая что должно получиться R7 = 0 R6 = 0,
; иначе переполнение, поэтому R7 и R6 вообще не трогаем
; но проверяем результат
; R7: R6 = R2 * KH
MOV A, R2
JZ Pid7S1
MOV A, KH
JNZ Pid7Umax; Если R2! = 0 и KH! = 0 => R7: R6> 0 => переполнение
Pid7S1:
; R6: R5 = R2 * KL
MOV A, R2
MOV B, KL
MUL AB
MOV R5, А
MOV A, B
JNZ Pid7Umax; Если R6> 0 => переполнение
; R6: R5 = R1 * KH
MOV A, R1
MOV B, KH
MUL AB
ДОБАВИТЬ A, R5
JC Pid7Umax; Если R6> 0 => переполнение
MOV R5, А
MOV A, B
JNZ Pid7Umax; Если R6> 0 => переполнение
; R5: R4 = R0 * KH
MOV A, R0
MOV B, KH
MUL AB
MOV R4, А
MOV A, R5
ДОБАВИТЬ A, B
JC Pid7Umax; Если R6> 0 => переполнение
MOV R5, А
; R5: R4 = R1 * KL
MOV A, R1
MOV B, KL
MUL AB
ДОБАВИТЬ A, R4
MOV R4, А
MOV A, R5
ADDC A, B
JC Pid7Umax; Если R6> 0 => переполнение
MOV R5, А
; R4: R3 = R0 * KL
MOV A, R0
MOV B, KL
MUL AB
RLC A; С = R3> = 0x80, Z = R3> 0x80
MOV R3, # 0FFh; R3 <> 0x80 => ничего
JNZ Pid7S2
MOV R3, # 0FEh; R3 == 0x80 => округление до четного
Pid7S2:
MOV A, R4
ADDC A, B; Складываем умножение, регистр, и перенос-округление
ANL A, R3; А так же если округление до четного - отбрасываем после младший бит
MOV R4, А
MOV A, R5
ADDC A, R6; R6 = 0 у нас с давних пор, хоть мы туда и не складывали ничего во время перемножения
JC Pid7Umax; Если R6> 0 => переполнение
MOV R5, А
; R5: R4 => ограниченный в 16 бит результат
; Теперь надо ограничить R5: R4 до Umax / Umin
MOV A, UmaxL
SUBB A, R4; C = 0 на текущий момент
MOV A, UmaxH
ПОДБ А, R5
JC Pid7Umax; Если R5: R4> Umax => R5: R4 = Umax
MOV A, UminL
SUBB A, R4; C = 0 на текущий момент
MOV A, UminH
ПОДБ А, R5
JNC Pid7Umin; Если R5: R4  R5: R4 = Umin
; Мощность вычислена
MOV UH, R5
MOV UL, R4
SETB U Готово
AJMP CalcExit
Pid7Umax:; Установить максимальную мощность
MOV UH, UmaxH
MOV UL, UmaxL
SETB U Готово
AJMP CalcExit
Pid7Umin:; Установить минимальную мощность
MOV UH, UminH
MOV UL, UminL
SETB U Готово
AJMP CalcExit
  

.

ПИД регулирование для чайников

Не знаю, в этом смысле но вот:

Закончил специальность АТП — автоматизирование технологических процессов, расчет регуляторов является большей частью для моей специальности.

Выходная точность зависит от 2 компонентов — качества измерительной техники и качества управляющей техники.

Измерительная составляющая.

Термистор EPCOS NTC G560 100K — такой стоит у меня в принтере.

Имеет класc точности (1), при разбросе измеряемых температур 355 имеет погрешность в 3,55 градуса.

Номинальное сопротивление имеет 100 ом — это сопротивление при 23,5 градусах, измеряется скорее всего ток (так как плата имеет напряжение на входовыходах), в среднем типовые амперметры имеют класс точности 1,5 — это 200мА и 3мА погрешности (1 — 1, 5 градуса).

В сумме имеем погрешность в 5 градусов Цельсия.

Управляющий механизм.

Немного полиграфии:

Пропорционально-интегро-дифференцирующий (ПИД) регулятор — устройство в управляющем контуре с обратной связью.Используется в системе автоматического управления для формирования управляющего с целью достижения необходимой точности и качества переходного процесса. ПИД-регулятор формирует управляющий сигнал, являющийся суммой трёх слагаемых, первое из которых пропорционально разности входного сигнала и сигнала обратной связи (сигнал рассогласования), второе — интеграл сигнала рассогласования, третье — производная сигнала рассогласования.

И по делу:

Пропорциональная составляющая в логическом смысле нас не интересует.

Интегрирующая составляющая нужна для устранения статической ошибки (без регулируемой величины может иметь фиксированное отклонение, что-то вроде +5 градусов на все время регулирования).

Дифференциальная составляющая — это достаточно забавный способ регулирования. Для расчета значения в момент времени Т, она использует значение величины в момент времени Т + 1. С математической точки зрения проблем нет, но в реальной жизни нам не известно, и в реальности дифференциальная составляющая идет с задержкой по времени.Поясняю в момент времени. Мы исполняем расчетное изменение для момента Т-1. Дифференциальная составляющая собственно и регулирует.

Это был небольшой вводный курс в ТАУ.

Есть множество вариантов расчетов ПИД регуляторов, чаще всего используют метод Зиглера, есть уже готовые калькуляторы на матлабе и маткаде.

Если бы была большая вычислительная емкость, на нашей плате, можно было бы использовать опытную схему регулирования (гигантские таблицы с входными изменениями и ответной регулировкой на них).Самый оптимум так как там можно задать воздействие куллера.

Подведу итог: Погрешность измерительных приборов и датчиков сводит на точность настройки ПИД регулятора, Если вы закажете высокоточные датчики сразу с преобразованием в hart протокол, rs232 или какой либо еще, и сможете настроить его на своей плате, у вас появится смысл точной ( до 0,02) настройки ПИД. Самый легкий способ — пойти в вуз в котором преподают ТАУ (нефтяные, производственные направления) и заплатить преподавателю за расчет с настройкой (не обращайтесь к студентам они все под ответ подгоняют — ТАУ никогда не сходится).

Наиболее удачное применение для стабилизации температуры — это материал сопла с высокой теплоемкостью (будет долго нагревается, но и колебаться температура будет меньше). Из опыта могу предложить изолировать сопло от ветра (хоть тем же каптоновым скотчем слоев на 20).

Надеюсь, я ответил на большинство вопросов по этой теме.

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *