Инструменты пользователя

Перевод этой страницы:

Инструменты сайта


Боковая панель

Для чего нужен ОрбиКрафт

Подсистемы конструктора

Инструкции по работе с ОрбиКрафт

Уроки

Лабораторная оснастка

Знакомство с Arduino

Полезная нагрузка на базе Arduino

Обратная связь

Новости

stabilization_pid

Это старая версия документа!


ПИД Регулятор

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

П-регулятор, пропорциональный регулятор

Передаточная функция П-регулятора: Wп(s) = K1. Принцип действия заключается в том, что регулятор вырабатывает управляющее воздействие на объект пропорционально величине ошибки (чем больше ошибка, тем больше управляющее воздействие).

И-регулятор, интегрирующий регулятор

Передаточная функция И-регулятора: Wи(s) = К0/s. Управляющее воздействие пропорционально интегралу от ошибки.

Д-регулятор, дифференцирующий регулятор

Передаточная функция Д-регулятора: Wд(s) = К2*s. Д-регулятор генерирует управляющее воздействие только при изменении регулируемой величины: Y= K2 * dE/dt.

На практике данные простейшие П, И, Д регуляторы комбинируются в регуляторы вида ПИ, ПД, ПИД.

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

ПИ-регулятор, пропорционально-интегральный регулятор

ПИ-регулятор представляет собой сочетание П- и И-регуляторов. Передаточная функция ПИ-регулятора: Wпи(s) = K1 + K0/s.

ПД-регулятор, пропорционально-дифференциальный регулятор

ПД-регулятор представляет собой сочетание П- и Д-регуляторов. Передаточная функция ПД-регулятора: Wпд(s) = K1 + K2 s.

ПИД-регулятор, пропорционально-интегрально-дифференциальный регулятор

ПИД-регулятор представляет собой сочетание П-, И- и Д-регуляторов. Передаточная функция ПИД-регулятора: Wпид(s) = K1 + K0 / s + K2 s.

stabilization_PID.py
# Временной шаг работы алгоритма, с
time_step = 0.1
# Целевая угловая скорость спутника, град/с.
# Для режима стабилизации равна 0.0.
omega_goal = 0.0
# Номер маховика
mtr_num = 1
# Максимально допустимая скорость маховика, об/мин
mtr_max_speed = 3000
# Номер ДУС (датчика угловой скорости)
hyr_num = 1
 
error = 0     		# Ошибка
P = 0         		# Воздействие пропорционального звена
D = 0         		# Воздействие дифференциального звена
I = 0         		# Воздействие интегрального звена
Kp = 100      		# Пропорциональный коэффициент
Kd = 0.02   		# Дифференциальный коэффициент
Ki = 0.9      		# Интегральный коэффициент
lastError = 0		# Прошлая ошибка
Integrator = 0  	# Интеграл (сумма всех ошибок)
PID = 0   		# Величина управляющего воздействия
Integrator_max = 10 	#
Integrator_min = -10 	# Ограничение минимального 
 
# Функции для определение новой скорости маховика.
# Новая скорость маховика складывается из
# текущей скорости маховика и приращения скорости.
# Приращение скорости пропорционально ошибке по углу
# и ошибке по угловой скорости.
# mtr_speed - текущая угловая скорость маховика, об/мин
# omega - текущая угловая скорость спутника, град/с
# omega_goal - целевая угловая скорость спутника, град/с
# mtr_new_speed - требуемая угловая скорость маховика, об/мин
def motor_new_speed_PD(mtr_speed, omega, omega_goal):
	global Integrator
	global lastError
	error = omega - omega_goal           		# Вычисление ошибки
	P = Kp * error                       		# Вычисление воздействия пропорционального звена
	D = Kd * ( error - lastError) / time_step	# Вычисление воздействия дифференциального звена
	lastError = error                    		# Запоминаем ошибку
	Integrator = Integrator + error * time_step 	# Накапливаем суммарную ошибку
	if Integrator > Integrator_max:         	# Сатурация (Ограничиваем максимальное значение накапливаемой ошибки)
		Integrator = Integrator_max
	elif Integrator < Integrator_min:
		Integrator = Integrator_min
 
	I = Integrator * Ki             # Вычисление воздействия интегрального звена
	PID = P + I + D     		# Вычисление суммарного управляющего воздействия
 
	mtr_new_speed = int(mtr_speed + PID)
	if mtr_new_speed > mtr_max_speed:
		mtr_new_speed = mtr_max_speed
	elif mtr_new_speed < -mtr_max_speed:
		mtr_new_speed = -mtr_max_speed
	print "P= ", P, "I= ", I, "D= ", D, "PID= ", PID, "mtr_new_speed= ", mtr_new_speed  
	return mtr_new_speed
 
# Функция включает все приборы,
# которые будут использоваться в основной программе.
def initialize_all():
	print "Enable motor №", mtr_num 
	motor_turn_on(mtr_num)
	sleep(1)
	print "Enable angular velocity sensor №", hyr_num 
	hyro_turn_on(hyr_num)
	sleep(1)
 
# Функция отключает все приборы,
# которые будут использоваться в основной программе.
def switch_off_all():
	print "Finishing..."
	print "Disable angular velocity sensor №", hyr_num
	hyro_turn_off(hyr_num)
	motor_set_speed(mtr_num, 0)
	sleep (1)
	motor_turn_off(mtr_num)
	print "Finish program"
 
# Основная функция программы, в которой вызываются остальные функции.
def control():
	initialize_all()
	# Инициализируем статус маховика
	mtr_state = 0
	# Инициализируем статус ДУС	
	hyro_state = 0
        omega_goal = 0.0
 
	for i in range(100):
		print "i = ", i
 
		# Опрос датчика угловой скорости и маховика.
		hyro_state, gx_raw, gy_raw, gz_raw = hyro_request_raw(hyr_num) 
		mtr_state, mtr_speed = motor_request_speed(mtr_num)
 
		# Обработка показаний датчика угловой скорости,
		# вычисление угловой скорости спутника по показаниям ДУС.
		# Если код ошибки ДУС равен 0, т.е. ошибки нет
		if not hyro_state:
			gx_degs = gx_raw * 0.00875
			gy_degs = gy_raw * 0.00875
			gz_degs = gz_raw * 0.00875
			# если ДУС установлен осью z вверх, то угловая скорость
			# спутника совпадает с показаниями ДУС по оси z, иначе
			# необходимо изменить знак: omega = - gz_degs
			omega = gz_degs
			print "gx_degs =", gx_degs, "gy_degs =", gy_degs, "gz_degs =", gz_degs
		elif hyro_state == 1:
			print "Fail because of access error, check the connection"
		elif hyro_state == 2:
			print "Fail because of interface error, check your code"
 
		#Обработка показаний маховика и установка требуемой угловой скорости.
		if not mtr_state:	# если код ошибки 0, т.е. ошибки нет
			print "Motor_speed: ", mtr_speed
			# установка новой скорости маховика
			mtr_new_speed = motor_new_speed_PD(mtr_speed,omega,omega_goal)
			motor_set_speed(mtr_num, mtr_new_speed)
 
		sleep(time_step)
 
	switch_off_all()
stabilization_pid.1583220486.txt.gz · Последние изменения: 2020/03/25 16:29 (внешнее изменение)

Инструменты страницы