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

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

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


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

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

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

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

Уроки

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

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

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

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

Новости

wheel_subsys

Двигатель-маховик

Виртуальное потребление - 2000мА

 Двигатель-маховик

Рисунок 1. Двигатель-маховик

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

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

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

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

int32_t motor_set_speed(uint16_t num,int16_t RPM,int16_t *confirm); 

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

Следующая функция позволяет запросить текущую скорость маховика:

int32_t motor_request_speed(uint16_t num,int16_t *pRPM);

Пример кода проверки двигателя-маховика на языке С

	#include "libschsat.h"
	/*
	** Lab 5: manage motor speed
	*/
	void control(void)
	{
		const int num = 1;	/* motor number #1 */
		int16_t temp;
		int16_t rpm = -3000;	/* -3000 ... +3000 */
		printf("Enable motor #%d\n", num);
		motor_turn_on(num);
		Sleep(1);
		printf("Manage speed motor #%d\n", num);
		while (rpm <= 3000) {
			printf("<<< Set speed to %d\n", rpm);
			if (LSS_OK == motor_set_speed(num, rpm, &temp)) {
				if (temp == rpm)
					printf("\t%d confirmed\n", rpm);
			}
			Sleep(1);
			if (LSS_OK == motor_request_speed(num, &temp)) {
				printf("Got speed %d >>>\n", temp);
			} else {
				puts("Fail! >>>");
			}
			rpm += 500;
		}
		printf("<<< Set speed to 0\n");
		if (LSS_OK == motor_set_speed(num, 0, &temp)) {
			if (temp == 0)
				printf("\t%d confirmed\n", 0);
		}
		Sleep(1);
		if (LSS_OK == motor_request_speed(num, &temp)) {
			printf("Got speed %d >>>\n", temp);
		} else {
			puts("Fail! >>>");
		}
		Sleep(1);
		motor_set_speed(num, 0, &temp);
		Sleep(1);
		printf("Disable motor #%d\n", num);
		motor_turn_off(num);
	}

Пример кода проверки двигателя-маховика на языке Python

def control(): # Основная функция программы, в которой нужно вызывать остальные функции
 
#Инициализируем переменных:
 
	motor_response = [0,0] # Инициализируем массив, в который будут записываться показания с маховика, где первый элемент - сообщение об ошибке
	num = 1
	rpm = 0 #rpm = rotation per minute, то есть, количество оборотов в минуту, будем изменять от -3000 до +3000
 
#Включаем маховик
	print "Enable reaction wheel №", num
	motor_turn_on(num)
	sleep(1)
 
#Изменяем скорость маховика от - 3000 до 3000 со скоростью 500 обортов в минуту
 
	print "Manage speed of motor №", num  
 
	while rpm >= -3000:
	#Установим скорость маховика - 3000
	# motor_set_speed устанавливает скорость rpm и возвращает значение о текущей скорости в motor_response
 
		print "Set speed to -3000"
		motor_response = motor_set_speed(num, rpm) 
		if not motor_response[0]:            #Если ошибки нет, то
			if motor_response[1] == -3000:           	# Если заданная скорость достигнута, то 
				print "-3000 rotations per minute confirmed"      #Выводим подтверждение
			else: 
				print "Got speed", motor_response[1]	
		elif motor_response[0] == 1:
			print "Fail because of access error, check the connection"
		elif motor_response[0] == 2:
			print "Fail because of interface error, check your code"
		rpm += -500	
		sleep(1)		                             # Ждем 1 секунду	
 
	print "Set speed to 3000 " 
	while rpm <= 3000:
		motor_response = motor_set_speed(num, rpm) 
		if not motor_response[0]:           
			if motor_response[1] == 3000:           	
				print "3000 rotations per minute confirmed"      
			else: 
				print "Got speed", motor_response[1]	                         	
		elif motor_response[0] == 1:
			print "Fail because of access error, check the connection"
		elif motor_response[0] == 2:
			print "Fail because of interface error, check your code"
		rpm += 500
		sleep(1)			
 
 
	print "Set speed to 0"
	while rpm != 0:
		motor_response = motor_set_speed(num, rpm) 
		if not motor_response[0]:           
			if motor_response[1] == 0:           	
				print "0 rotations per minute confirmed"      
			else: 
				print "Got speed", motor_response[1]	                         	
		elif motor_response[0] == 1:
			print "Fail because of access error, check the connection"
		elif motor_response[0] == 2:
			print "Fail because of interface error, check your code"
		rpm += -500
		sleep(1)		
 
	print "Disable reaction wheel №", num
	motor_turn_off(num)
wheel_subsys.txt · Последние изменения: 2022/03/15 14:08 — ekaterina.manucharova

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