Управление ракетной техникой
Разработка комплекса программных средств управления летательными аппаратами. Контроль измерения параметров полёта. Сохранение информации во флеш-памяти на борту ракеты. Структура данных модуля навигации. Специфика операционных систем в микроконтроллерах.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 04.07.2018 |
Размер файла | 2,9 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
BottLED();
}
break;
case 2://PF5 P
code = BUT_GetBut();//берем код события
if (code==3)//одинарное отпускание
{
angleP=700;
BottLED();
}else
if (code==5) //двойное
{
angleP=2300;
BottLED();
}
break;
case 3://PF6 CS2
code = BUT_GetBut();//берем код события
if (code==3)//одинарное отпускание
{
angleCS2=700;
BottLED();
}else
if (code==5) //двойное
{
angleCS2=2300;
BottLED();
}
break;
case 4://PF7 PH
code = BUT_GetBut();//берем код события
if (code==3)//одинарное отпускание
{
anglePH=700;
BottLED();
}else
if (code==5) //двойное
{
anglePH=2300;
BottLED();
}
break;
}
uxHighWaterMark = uxTaskGetStackHighWaterMark( NULL );
//printf(" Polling WaterMark %u ", uxHighWaterMark);
}
}
//Подпрограмма-обработчик прерывания по приходу байта с GPS
ISR(USART0_RX_vect)
{
u8 val=UDR0;
/*if ( val!='A'){//if ( UDR0!=lf){ //<CR> - Возврат каретки (0x0D) - добавим,<LF> - Подача строки - не будем уже передавать в очередь,
FBuf.GPS_Buf[FBuf.GPS_idxIN++] =val;
FBuf.GPS_idxIN &= sizeof(FBuf.GPS_Buf)/sizeof(FBuf.GPS_Buf[0])-1;//BUF_MASK;
}
else //а выставим семафор - из очереди можно изъять байты
{
printf(" ISR bits ");
xEventGroupSetBits(FBuf.GPSEventGroupSdOrCC, (1<<1)|(1<<0));
//xSemaphoreGiveFromISR(GPS_Ready, NULL);
}*/
//if (rand(10)==1)
{//Это тестовый код, рабочий - сверху
for (int i = 48; i<59;i++){
FBuf.GPS_Buf[FBuf.GPS_idxIN++] =i;
FBuf.GPS_idxIN &= sizeof(FBuf.GPS_Buf)/sizeof(FBuf.GPS_Buf[0])-1;}
FBuf.GPS_Buf[FBuf.GPS_idxIN++] ='a';
FBuf.GPS_idxIN &= sizeof(FBuf.GPS_Buf)/sizeof(FBuf.GPS_Buf[0])-1;FBuf.GPS_Buf[FBuf.GPS_idxIN++] ='A';
FBuf.GPS_idxIN &= sizeof(FBuf.GPS_Buf)/sizeof(FBuf.GPS_Buf[0])-1;
printf(" ISR bits ");
xEventGroupSetBits(FBuf.GPSEventGroupSdOrCC, (1<<1)|(1<<0));}
}
void uart_Init( void )
{
UBRR0H = GPS_BAUD_PRESCALE >> 8; // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
UBRR0L = GPS_BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
//8 бит данных, 1 стоп бит, без контроля четности
UCSR0C = ( 1 << UCSZ1 ) | ( 1 << UCSZ0 ); //( 1 << URSEL ) |
//разрешить прием, передачу данных и прерывание по приёму байта
UCSR0B = ( 1<<RXCIE )| ( 1 << TXEN ) | ( 1 <<RXEN );
}
/*инициализация SPI модуля в режиме master*/
void SPI_Init(void)
{
/*настройка портов ввода-вывода
все выводы, кроме MISO выходы*/
DDRB |= (1<<SPIC_MOSI)|(1<<SPIC_SCLK)|(1<<SPIC_CS)|(0<<SPIC_MISO);
PORTB |= (1<<SPIC_MOSI)|(1<<SPIC_SCLK)|(1<<SPIC_CS)|(1<<SPIC_MISO);
DDRD|=1<<SPIC_extraCS;
PORTD|=1<<SPIC_extraCS;
/*разрешение spi,старший бит вперед,мастер, режим 0, частота 16M/4=4MHz*/
SPCR = (1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(0<<SPR1)|(0<<SPR0);
SPSR = (0<<SPI2X);
}
u16 RTC_500msDetection;
ISR(TIMER2_COMP_vect){//T=10ms
RTC_500msDetection++;//32.768 кГц dt26
if (RTC_500msDetection==49) {
RTC_TimeMult++;//увеличиваем множитель времени по основанию 500ms
xSemaphoreGive( RTC_Time_Ready );//Семафорим, что пора выписать время
RTC_500msDetection=0;
}
PORTG ^= (1<<PG2);
mmc_disk_timerproc();//FatFs дела
BUT_Poll();//опросить кнопки
FRESULT open_append (
FIL* fp, // [OUT] File object to create
const char* path // [IN] File name to be opened
)
{
FRESULT fr;
/* Opens an existing file. If not exist, creates a new file. */
fr = f_open(fp, path, FA_WRITE | FA_OPEN_ALWAYS);
if (fr == FR_OK) {
/* Seek to end of the file to append data */
fr = f_lseek(fp, f_size(fp));
if (fr != FR_OK)
f_close(fp);
}
return fr;
}
void vADCStart( void *pvParameters )//Инициализация и запуск ADC
{
ADMUX = 0b00000000;//// Internal Vref turned off, выравнивание по правой границе 7й канал, 10бит
ADCSRA |= (1<<ADEN)|(0<<ADSC)|(0<<ADFR)|(0<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);//вкл adc, не запустить первое преобраз, непрер режим прерыван выкл (ADFR), ADCпрерывание выкл, делитель 128 (62.5kHz)
TickType_t xLastWakeTime;
const TickType_t xFrequency = 2000;//ms
xLastWakeTime=xTaskGetTickCount();
unsigned short ADCdata;
float voltage;
for( ;; )
{
ADCSRA |= 1<<ADSC;//начать новое преобразование (раз в ~50 ms)
vTaskDelay(1);//Пусть другие повыполняются 1 такт диспетчера
while (!(ADCSR & 1<<ADIF));//ждать флага прерывания по готовности ацп
ADCdata = ADCW; // В ADCW хранится напряжение в двоичном коде
voltage = ADCdata * 0.0048876; // 5 вольт / 1023 = 4.8875
//прерывание ADC, ring buffer
FBuf.ADC_Buf[FBuf.ADC_idxIN++] =ADCdata;
FBuf.ADC_idxIN &= sizeof(FBuf.ADC_Buf)/sizeof(FBuf.ADC_Buf[0])-1;
vTaskDelayUntil(&xLastWakeTime,xFrequency);
}
}
void Timer2_10ms(void)//ATmega128 ButtUpdate_and_FatFsUpdate_Driver
{
//Таймер2 - 10ms для FatFs и кнопок
TCCR2 |= (1<<WGM21) |(1<<CS22)|(0<<CS21)|(1<< CS20);//CTC, предделитель 1024, то 7812,5Hz таймер
//нужно 10ms
OCR2=77;//р-р сравнения
//TCCR2 |= (1<< CS20);//CTC, предделитель 64, то 125kHz таймер
TIMSK |= 1<<OCIE2;//Разрешить прерывание
}
ISR(INT7_vect){//Чеки PE7 прерывание по переходу низкий->высокий
if (PINE & 1<<PE7){
//vTaskSuspend(PollingFromButt_lib_Handle);нельзя из-под ISR! //засыпаем (кнопки серв уже не нужны)
xTaskResumeFromISR(BottLED_Handle);//моргнуть vBottLED -> PORTG |= (1<<PG0);
xTaskResumeFromISR(ADC_Handle);//Начать юзать ADC vADCStart
xTaskResumeFromISR(FatFsWrite_Handle);//Начать бэкапить на SD vFatFsWrite
xTaskResumeFromISR(CCWrite_Handle);//Начать бэкапить на CC vCCWrite
xTaskResumeFromISR(FligthServo_Handle);//Начать выбрасывать кансаты и открывать парашют vFligthServo
}
}
//внешние прерывания http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh128/8.htm
void ChecaInit(){
//Если на PE7 высокий уровень, чека сошла (полёт?)
PORTE |= (1<<PE7);//поддяжка к питанию
DDRE &= ~(1<<PE7);//На ввод
EIMSK |=1<<INT7;//вне прерывание на ножке PE7
EICRB |=(1<<ISC71)|(1<<ISC70);
}
portSHORT main(void)
{
DDRG |= (1<<PG0)|(1<<PG2)| (1<<PG4);//vLEDInit(); //иниц портов подкл к светодиод
//Инициализация Servo
ServoDriverInit();//timer3_init
DDRC=0xFF;//Порты - на вывод ШИМ серв
//Инициализация Buttons
BUT_Init();
Timer2_10ms();//ATmega128 ButtUpdate_and_FatFsUpdate_Driver
SPI_Init();//это пересделает FatFs, но у нас в SPI_Init ещё экстра чипселекты на выход настраиваются
//Инициализация лога на флешке
sei();//сомнительное место для sei, но иначе таймер для FatFS не запашет
///*Монтируем том, для использования диска */
res=f_mount (&fs,"0",1);
if (res==FR_OK)
printf("f_mount ok\n"); else printf(" f_mount no, state= %X ",res);
/* Opens an existing file. If not exist, creates a new file. */
//Коля res=f_open(&fil, "1.txt", FA_WRITE | FA_OPEN_ALWAYS);
res=open_append(&fil, "1.txt");
if (res== FR_OK)
printf(" open ok\n"); else printf(" f_open no, state= %X ", res);
cli();
//Инициализация UART и i/o (printf, ect)
uart_Init();
stdout = &mystdout;
_delay_ms(20); //нужно после старта не писать ничего в ML8088 20ms
/*Так как нам достаточно одного сообщения RMC, в значение параметра CDB-ID 201 запишем 0x00000040. Достаточное время вывода RMC - 0,5 с, то в CDB-ID 190, задающий время вывода Набора сообщений 0 запишем 0x01.*/
printf("$PSTMSETPAR,1201,00000040,0*0D0A");//<cr> - возврат каретки 0x0D, <lf> - подача строки 0x0A.
printf("$PSTMSETPAR,1190,01,0*0D0A");
//Инициализация чеки
ChecaInit(); //use вне прерывания при потери на PE7 низкого уровня
RTC_Time_Ready = xSemaphoreCreateMutex();
FBuf.GPSEventGroupSdOrCC = xEventGroupCreate();
FBuf.ADCEventGroupSdOrCC = xEventGroupCreate();
FBuf.Orient_EventGroupSdOrCC = xEventGroupCreate();
xTaskCreate( vPollingFromButt_lib, ( const char * ) "FatFS", 115, NULL, 2, &PollingFromButt_lib_Handle );
xTaskCreate( vFatFsWrite, ( const char * ) "FatFS", 245, NULL, 2, &FatFsWrite_Handle );
vTaskSuspend(FatFsWrite_Handle);//засыпаем (бэкапить на SD пока не нужно)
xTaskCreate( vCCWrite, ( const char * ) "CCWr", 250, NULL, 2, &CCWrite_Handle );
vTaskSuspend(CCWrite_Handle);//засыпаем (бэкапить на CC пока не нужно)
xTaskCreate( vBottLED, ( const char * ) "vBottLED", 80, NULL, 2, &BottLED_Handle );
vTaskSuspend(BottLED_Handle);//засыпаем (мигнуть пока не нужно)
xTaskCreate( vADCStart, ( const char * ) "ADCStart", 200, NULL, 2, &ADC_Handle );
vTaskSuspend(ADC_Handle);//засыпаем (ADC пока не нужен)
xTaskCreate( vFligthServo, ( const char * ) "FlServ", 200, NULL, 3, &FligthServo_Handle );
vTaskSuspend(FligthServo_Handle);
//xTaskCreate( vOrient, ( const char * ) "Orient", 200, NULL, 2, &Orient_Handle );
//vTaskSuspend(Orient_Handle);//
vTaskStartScheduler(); //start scheduler
while(1){}
}
Размещено на Allbest.ru
Подобные документы
Задача накопления, обработки и распространения информации. Характеристика систем управления. Схема комплекса средств автоматизации. Функционирование АСУ комплекса средств автоматизации. Требования, предъявляемые к АРМ РД. Структура базы данных.
реферат [29,1 K], добавлен 12.06.2009Разработка алгоритма фильтрации данных, полученных с систем спутниковой навигации с помощью GNSS-модуля. Анализ работы фильтра Калмана, его программная реализация под конкретную задачу. Выбор навигационных модулей для получения данных позиционирования.
дипломная работа [3,6 M], добавлен 12.01.2016Порядок работы менеджера турфирмы. Анализ рынка программных приложений для ведения туристического бизнеса. Выбор средств проектирования и разработки системы управления баз данных. Разработка, реализация и анализ работы программного модуля, его запуск.
дипломная работа [3,4 M], добавлен 19.07.2015Особенности архитектуры Java. Технология Java Database Connectivity. Кроссплатформенность Java-приложений. Преимущества языка программирования. Логическая структура базы данных. Структура программного комплекса. Верификация программных средств.
курсовая работа [962,8 K], добавлен 13.01.2016Структура данных в динамической памяти, однонаправленные списки. Разработка программного комплекса, предназначенной для хранения и предоставления пользователям данных об улицах города. Реализация данной программы при помощи метода расширения ядра.
курсовая работа [438,3 K], добавлен 11.01.2016Изучение области применения комплекса для проведения имитационных испытаний микропроцессорных систем железнодорожной автоматики на функциональную безопасность. Разработка программного обеспечения модуля управления и отладки. Тестирование системы команд.
курсовая работа [1,1 M], добавлен 22.11.2014Система управления базами данных как совокупность программных и языковых средств, предназначенных для создания и обработки данных. Анализ деятельности обувной мастерской. Особенности разработки функциональной диаграммы и тестирования программного модуля.
дипломная работа [2,9 M], добавлен 04.11.2012Проблемы и тенденции проектирования операционных систем, структура ОС. Руководящие принципы при разработке интерфейса. Парадигмы пользователя, исполнения и данных. Примеры применения ортогональности и связывания. Методы практической реализации систем.
реферат [60,9 K], добавлен 26.01.2011Основные функции системы управления базами данных. Комплекс программных и лингвистических средств общего или специального назначения. Условия принятой технологии обработки данных. Управление буферами оперативной памяти. Журнализация и её значение.
курсовая работа [1,2 M], добавлен 19.01.2012Выполнение отладки программных модулей с использованием специализированных программных средств. Тестирование, оптимизация кода модуля. Реализация базы данных в конкретной системе управления. Анализ проектной и технической документации на уровне компонент.
дипломная работа [5,0 M], добавлен 08.06.2017