Специальные цены   новые товары
+ Ответить в теме
Страница 62 из 165 ПерваяПервая ... 52 60 61 62 63 64 72 ... ПоследняяПоследняя
Показано с 2,441 по 2,480 из 6569

Создание собственной системы стабилизации

Тема раздела Квадрокоптеры. Общие вопросы в категории Квадрокоптеры и мультироторы; Я тоже думаю что причина не в УАРТЕ, и время цикла правильное что приходит на ум 22милисекунды - какой-то баг ...

  1. #2441

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    Я тоже думаю что причина не в УАРТЕ, и время цикла правильное что приходит на ум 22милисекунды - какой-то баг по гире? системное время в высшем приоритете!

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

  2.  
  3. #2442

    Регистрация
    07.04.2012
    Адрес
    Брянск
    Возраст
    29
    Сообщений
    1,674
    Записей в дневнике
    6
    Ловите вкусняшку - 10DOF платка и никакого и2с - все по SPI можно подключить http://www.aliexpress.com/item/Treax...925324231.html

    хотя дороговато немного)))

  4. #2443

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    ну да как-то дороговато хотя если посмотреть иму платы от тех же виртуалроботикс (мультипилот) то цена приемлимая...

  5. #2444

    Регистрация
    17.06.2011
    Адрес
    Минск
    Возраст
    39
    Сообщений
    1,941
    Плата дорогая, 5983 и 5883 практически не отличаются по цене, не понятно с чего бы этой платке стоить дороже того же CRIUS'a (или других контроллеров, коих сейчас полно)

    З.Ы. 5983 можно прикупть на eBay баксов за 7
    З.Ы.Ы. VRBrain такая же дорогая поделка как и PX4 - не вижу смысла переплачивать за такие девайсы.

  6.  
  7. #2445

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    Цитата Сообщение от Sir Alex Посмотреть сообщение
    З.Ы.Ы. VRBrain такая же дорогая поделка как и PX4 - не вижу смысла переплачивать за такие девайсы.
    ну как бэ плата то есть конкурентная и явно дешевле а вот 5983 можно повесить на свободный spi (это в текущей версии), а 5883 можно и отключать программно или заменить вроде подключение одинаковое если по i2c...
    и похоже развод это, зачем 5983 цеплять по i2c да пусть к той же mpu?

  8. #2446

    Регистрация
    27.12.2009
    Адрес
    Днепродзержинск, Украина
    Возраст
    43
    Сообщений
    281
    Записей в дневнике
    3
    Цитата Сообщение от SergDoc Посмотреть сообщение
    Я тоже думаю что причина не в УАРТЕ, и время цикла правильное что приходит на ум 22милисекунды - какой-то баг по гире? системное время в высшем приоритете!

    да и первый уарт работает на прямую с памятью, не отвлекая жирный проц - как бы не разленился
    Вот тут делаю измерение-
    LED3_ON;
    serialCom();
    LED3_OFF;
    Измеряю время работы функции обмена. Меряем на светодиоде. Когда происходит чтение реальных данных из гуи, то имеем время 19мс. А обработка обмена у нас висит как раз в основном цикле. Частота этих багов соответствует частоте опроса из гуи. Интересно что б кто нибудь проверил. Проверять только в режиме чтения реальных данных в вингуи или в мультивий-конфигураторе.

  9. #2447

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    this code is executed at each loop and won't interfere with control loop if it lasts less than 650 microseconds
    т.е. если бы оно тормозило цикл это было бы видно в гуи, и уж у Таймкопа аппараты точно падали при подключении к гуи, да и вий бы никуда не полетел, хотя если мы допустим из 400, расчётов потеряем даже 60% -70% ничего не случится, скоро предоставится возможность всё перепроверить - проверю обязательно.... сейчас тупо лень с аппарата плату снимать

  10.  
  11. #2448

    Регистрация
    27.12.2009
    Адрес
    Днепродзержинск, Украина
    Возраст
    43
    Сообщений
    281
    Записей в дневнике
    3
    Цитата Сообщение от SergDoc Посмотреть сообщение
    т.е. если бы оно тормозило цикл это было бы видно в гуи, и уж у Таймкопа аппараты точно падали при подключении к гуи, да и вий бы никуда не полетел, хотя если мы допустим из 400, расчётов потеряем даже 60% -70% ничего не случится, скоро предоставится возможность всё перепроверить - проверю обязательно.... сейчас тупо лень с аппарата плату снимать
    Таймкоп не причем помойму.
    Вот тут проблемка
    void uartWrite( uint8_t ch)
    {
    LED3_ON;
    while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE) {
    };
    LED3_OFF;
    txBuffer[txBufferHead] = ch;

    Цикл ожидания равен примерно 87 мкс. И это на каждом байте. Можете прикинуть тормоза системы при усиленном обмене. Тут чето с дма не то.

  12. #2449

    Регистрация
    07.04.2012
    Адрес
    Брянск
    Возраст
    29
    Сообщений
    1,674
    Записей в дневнике
    6
    хех... ну как я и говорил - проблемка в уарте, а не в функции serialcom

  13. #2450

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    если его убрать УАРТ вешается, или отказываться от ДМА или добивать этот чёртов уарт, по всей видимости переполняется буфер ДМА ибо пихаем слишком быстро в него, я как и писал выше воткнул этот костыль, ибо не нашел ошибку, при этом уарт на приём работает, а на выдачу затыкается,
    первая версия была такая:
    Код:
    // Receive buffer, circular DMA
    volatile uint8_t rxBuffer[UART_BUFFER_SIZE];
    uint32_t rxDMAPos = 0;
    volatile uint8_t txBuffer[UART_BUFFER_SIZE];
    uint32_t txBufferTail = 0;
    uint32_t txBufferHead = 0;
    
    
    static void uartTxDMA(void)
    {
        DMA2_Stream7->M0AR = (uint32_t)&txBuffer[txBufferTail];
        if (txBufferHead > txBufferTail) {
            DMA_SetCurrDataCounter(DMA2_Stream7, txBufferHead - txBufferTail);//DMA2_Stream7->NDTR = txBufferHead - txBufferTail;
            txBufferTail = txBufferHead;
        } else {
            DMA_SetCurrDataCounter(DMA2_Stream7, UART_BUFFER_SIZE - txBufferTail);//DMA2_Stream7->NDTR = UART_BUFFER_SIZE - txBufferTail;
            txBufferTail = 0;
        }
    
    
        DMA_Cmd(DMA2_Stream7, ENABLE);
    }
    
    
    void DMA2_Stream7_IRQHandler(void)
    {
    
    
        if(DMA_GetITStatus(DMA2_Stream7, DMA_IT_TCIF7))
               {
                            DMA_ClearITPendingBit(DMA2_Stream7, DMA_IT_TCIF7);
    
    
                            DMA_Cmd(DMA2_Stream7, DISABLE);
                         } 
    
    
        if (txBufferHead != txBufferTail)
            uartTxDMA();
    }
    
    
    void uartInit(uint32_t speed)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
    
    
       
            RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
            // USART1_TX    PA9
        // USART1_RX    PA10
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
          GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
    
    
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
    
    
        
     
      
     
    
    
        // DMA TX Interrupt
            /* Configure the Priority Group to 2 bits */
            NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream7_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
    
    
    
    
            RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 , ENABLE);
        USART_InitStructure.USART_BaudRate = speed;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init(USART1, &USART_InitStructure);
    
    
    
    
            RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
        // Receive DMA into a circular buffer
        DMA_DeInit(DMA2_Stream5);//
        DMA_InitStructure.DMA_Channel = DMA_Channel_4;//
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;//
        DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)rxBuffer;//
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//
        DMA_InitStructure.DMA_BufferSize = UART_BUFFER_SIZE;//
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//
        DMA_Init(DMA2_Stream5, &DMA_InitStructure);//
        DMA_Cmd(DMA2_Stream5, ENABLE);//
        /* Enable the USART Rx DMA request */
            USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
        rxDMAPos = DMA_GetCurrDataCounter(DMA2_Stream5);
        
    
    
    
    
    
    
        // Transmit DMA
        DMA_DeInit(DMA2_Stream7);
        DMA_InitStructure.DMA_Channel = DMA_Channel_4;
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
        DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
            DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
          DMA_InitStructure.DMA_FIFOMode =DMA_FIFOMode_Disable; 
        DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; 
        DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; 
        DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    
    
    
    
    
    
    
    
            DMA_Init(DMA2_Stream7, &DMA_InitStructure);
       
    
    
    
    
            DMA_ITConfig(DMA2_Stream7, DMA_IT_TC, ENABLE);
    
    
            DMA_SetCurrDataCounter(DMA2_Stream7, 0);//DMA2_Stream7->NDTR = 0;
    
    
            USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
    
    
            USART_Cmd(USART1, ENABLE);
    }
    
    
    uint16_t uartAvailable(void)
    {
        return (DMA_GetCurrDataCounter(DMA2_Stream5) != rxDMAPos) ? true : false;
    }
    
    
    bool uartTransmitEmpty(void)
    {
        return (txBufferTail == txBufferHead);
    }
    
    
    uint8_t uartRead(void)
    {
        uint8_t ch;
    
    
        ch = rxBuffer[UART_BUFFER_SIZE - rxDMAPos];
        // go back around the buffer
        if (--rxDMAPos == 0)
            rxDMAPos = UART_BUFFER_SIZE;
    
    
        return ch;
    }
    
    
    uint8_t uartReadPoll(void)
    {
        while (!uartAvailable()); // wait for some bytes
        return uartRead();
    }
    
    
    void uartWrite(uint8_t ch)
    {
        txBuffer[txBufferHead] = ch;
        txBufferHead = (txBufferHead + 1) % UART_BUFFER_SIZE;
    
    
        // if DMA wasn't enabled, fire it up
        if (DMA_GetCmdStatus(DMA2_Stream7) == DISABLE)//(!(DMA2_Stream7->CR & 1))
    
    
            uartTxDMA();
    }
    
    
    void uartPrint(char *str)
    {
        while (*str)
            uartWrite(*(str++));
    }
    она вешалась

    может сделать так:
    Код:
    void uartWrite(uint8_t ch) 
    // if DMA wasn't enabled, fire it up  
    {   
    if (!(DMA2_Stream7->CR & 1)) {     
    txBuffer[txBufferHead] = ch;   
      
    txBufferHead = (txBufferHead + 1) % UART_BUFFER_SIZE;          
           
    uartTxDMA();
    }
    }

  14. #2451

    Регистрация
    19.04.2010
    Адрес
    Ханты
    Возраст
    40
    Сообщений
    1,471
    Цитата Сообщение от okan_vitaliy Посмотреть сообщение
    void uartWrite( uint8_t ch)
    {
    LED3_ON;
    while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE) {
    };
    LED3_OFF;
    txBuffer[txBufferHead] = ch;

    Цикл ожидания равен примерно 87 мкс. И это на каждом байте. Можете прикинуть тормоза системы при усиленном обмене. Тут чето с дма не то.
    Верно, это косяк! Смысл использования ПДП как раз в том чтобы ничего не ждать! uartWrite должна вычислять хвост буфера ПДП и класть символ в [ХВОСТ+1], и увеличивать счетчик ПДП на один. Если ХВОСТ+1 упирается в конец буфера, то возвращать признак переполнения, по нему пропускать вывод в порт, либо ждать завершения с циклом счёта. А ещё лучше сделать кольцевой буфер и при записи писать по кругу, и только если догнал хвост возвращать переполнение. Важно перед операциями с регистрами ПДП запрещать запрос канала.

  15. #2452

    Регистрация
    07.04.2012
    Адрес
    Брянск
    Возраст
    29
    Сообщений
    1,674
    Записей в дневнике
    6
    кстати такой вопрос...
    а в чем глобальный смысл использовать ДМА для уарта?
    разницу в использовании процессора наврятли заметим - уарт работает без участия ЦПУ, а по времени засунуть байт в уарт или в ДМА -> уарт думаю что разницы не будет.

    единственная разница будет в том случае, если ДМА будем передавать весь буфер целиком.

    так что без переработки этого участка плюсов в ДМА не вижу.

  16. #2453

    Регистрация
    27.12.2009
    Адрес
    Днепродзержинск, Украина
    Возраст
    43
    Сообщений
    281
    Записей в дневнике
    3
    Короче без кольцевого тут не обойтись.

  17. #2454

    Регистрация
    19.04.2010
    Адрес
    Ханты
    Возраст
    40
    Сообщений
    1,471
    Цитата Сообщение от mataor Посмотреть сообщение
    а в чем глобальный смысл использовать ДМА для уарта?
    правильный вопрос! объем данных и частота передачи не высокие. Кольцевой буфер на прерываниях никак не замедлит проц.

    Цитата Сообщение от okan_vitaliy Посмотреть сообщение
    Короче без кольцевого тут не обойтись.
    это оптимальное решение.

  18. #2455

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    легко проверить - перенаправить всё во 2-й уарт (он без ДМА) если всё канает то и убирать ДМА к чертям, получается Ф4 пихает в UART столько, что тот не может пережевать, и увеличение буфера да и кольцевой тут не помогут - всё равно рано или позно наступит переполнение.
    во всех файлах где есть uart1 заменить на 2, остальное вроде идентично - третий по умолчанию gps...
    а если при переполнении буфера его тупо очищать - потеря нескольких пакетов ну как-то вообще ничего не испортит?
    у меня сейчас есть некоторые затруднения - сам проверить ничего не могу
    Последний раз редактировалось SergDoc; 01.08.2013 в 14:21.

  19. #2456

    Регистрация
    17.06.2011
    Адрес
    Минск
    Возраст
    39
    Сообщений
    1,941
    ИМХО, в данной ситуации, надо дропать пакеты. Протокол ессесно должен уметь это переваривать (ну т.е. ничего страшного не должно произойти если что то не дойдет до адресата).

  20. #2457

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    будет писать в счётчик ошибок пакетов в гуи - только и всего...

    вот это работает, только не знаю с ДМА или без, просто прошивку заливал себе проверить порт: http://code.google.com/p/uavp-mods/
    Код:
    void InitSerialPort(uint8 s) {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	USART_InitTypeDef USART_InitStructure;
    	DMA_InitTypeDef DMA_InitStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    	SerialPortDef * u;
    
    	u = &SerialPorts[s];
    
    	if (u->Used) {
    
    		GPIO_StructInit(&GPIO_InitStructure);
    		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    #ifdef STM32F1
    		GPIO_InitStructure.GPIO_Pin = u->TxPin;
    		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    		GPIO_Init(u->Port, &GPIO_InitStructure);
    
    		GPIO_InitStructure.GPIO_Pin = u->RxPin;
    		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    		GPIO_Init(u->Port, &GPIO_InitStructure);
    #else
    		GPIO_StructInit(&GPIO_InitStructure);
    		GPIO_InitStructure.GPIO_Pin = u->TxPin | u->RxPin;
    		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    		//GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    		GPIO_Init(u->Port, &GPIO_InitStructure);
    
    		GPIO_PinAFConfig(u->Port, u->TxPinSource, u->USART_AF);
    		GPIO_PinAFConfig(u->Port, u->RxPinSource, u->USART_AF);
    #endif
    		USART_StructInit(&USART_InitStructure);
    		//USART_InitStruct->USART_Parity = USART_Parity_No;
    		USART_InitStructure.USART_BaudRate = u->Baud;
    		USART_Init(u->USART, &USART_InitStructure);
    
    		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    
    		TxQTail[s] = TxQHead[s] = TxQNewHead[s] = 0;
    
    		if (u->DMAUsed) {
    			// Common
    			DMA_StructInit(&DMA_InitStructure);
    			DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    			DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
    			DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32) &u->USART->DR;
    			DMA_InitStructure.DMA_BufferSize = SERIAL_BUFFER_SIZE;
    
    			// Receive DMA
    			DMA_DeInit(u->RxDMAStream);
    
    			DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32) &u->USART->DR;
    			DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    #ifdef STM32F1
    			DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    			DMA_InitStructure.DMA_MemoryBaseAddr = (uint32) RxQ[s];
    #else
    			while (DMA_GetCmdStatus(u->RxDMAStream) != DISABLE) {
    			};
    			DMA_InitStructure.DMA_Channel = u->DMAChannel;
    			DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    			DMA_InitStructure.DMA_Memory0BaseAddr = (uint32) RxQ[s];
    #endif
    			DMA_Init(u->RxDMAStream, &DMA_InitStructure);
    			DMA_Cmd(u->RxDMAStream, ENABLE);
    			USART_DMACmd(u->USART, USART_DMAReq_Rx, ENABLE);
    
    			RxQTail[s] = RxQHead[s] = SERIAL_BUFFER_SIZE
    					- DMA_GetCurrDataCounter(u->RxDMAStream);
    
    			// Transmit DMA
    			NVIC_InitStructure.NVIC_IRQChannel = u->TxDMAISR;
    			NVIC_Init(&NVIC_InitStructure);
    
    			DMA_DeInit(u->TxDMAStream);
    #ifdef STM32F1
    			DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
    #else
    			while (DMA_GetCmdStatus(u->TxDMAStream) != DISABLE) {
    			};
    			DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    			//	DMA_InitStructure.DMA_Memory0BaseAddr = (uint32) TxQ[s];
    #endif
    			DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    			DMA_Init(u->TxDMAStream, &DMA_InitStructure);
    
    			DMA_SetCurrDataCounter(u->TxDMAStream, 0);
    			DMA_ITConfig(u->TxDMAStream, DMA_IT_TC, ENABLE);
    
    			USART_DMACmd(u->USART, USART_DMAReq_Tx, ENABLE);
    		} else if (u->InterruptsUsed) {
    			RxQTail[s] = RxQHead[s] = 0;
    			NVIC_InitStructure.NVIC_IRQChannel = u->ISR;
    			NVIC_Init(&NVIC_InitStructure);
    
    			USART_ITConfig(u->USART, USART_IT_RXNE, ENABLE);
    		}
    		USART_Cmd(u->USART, ENABLE);
    	}
    
    } // InitSerialPort
    Последний раз редактировалось SergDoc; 01.08.2013 в 15:12.

  21. #2458

    Регистрация
    26.11.2012
    Адрес
    Tambov
    Возраст
    46
    Сообщений
    777
    Цитата Сообщение от okan_vitaliy Посмотреть сообщение
    Короче мне так кажется - нужно loop садить куда нибудь в прерывание.
    Да, алгоритм стабилизации в первую очередь.., и других прерываний как можно меньше стараться делать тогда время цикла стабильно.
    Тем более все успевает обработаться включая ПИД даже на моих 72Мгц (не говоря уж 168)..

  22. #2459

    Регистрация
    19.04.2010
    Адрес
    Ханты
    Возраст
    40
    Сообщений
    1,471
    Цитата Сообщение от oleg70 Посмотреть сообщение
    все успевает обработаться включая ПИД даже на моих 72Мгц (не говоря уж 168)..
    У меня на Ф1 без аппаратной плавучки всё успевало работать в прерываниях.

  23. #2460

    Регистрация
    15.05.2013
    Адрес
    Казань
    Возраст
    28
    Сообщений
    99
    Приём по юсарту я использую в прерываниях, передачу - через DMA.

    Код:
    dmaInitStr.DMA_BufferSize=4; //неважно
    dmaInitStr.DMA_DIR=DMA_DIR_PeripheralDST;
    dmaInitStr.DMA_M2M=DMA_M2M_Disable; 
    dmaInitStr.DMA_MemoryBaseAddr=(u32)commTxBuffer;
    dmaInitStr.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
    dmaInitStr.DMA_MemoryInc=DMA_MemoryInc_Enable;
    dmaInitStr.DMA_Mode=DMA_Mode_Normal; 
    dmaInitStr.DMA_PeripheralBaseAddr=(uint32_t) &(COMM_USART->DR);
    dmaInitStr.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;  
    dmaInitStr.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
    dmaInitStr.DMA_Priority=DMA_Priority_Medium; 
    DMA_Init(COMM_DMA_CHANNEL,&dmaInitStr);

    Код:
    void sendCommInterface(unsigned short num)
    {
    if(DMA_GetCurrDataCounter(COMM_DMA_CHANNEL) ==0){
    DMA_SetCurrDataCounter(COMM_DMA_CHANNEL,num);
    DMA_Cmd(COMM_DMA_CHANNEL,ENABLE); }
    }
    Но, после отправки посылки через дма надо проверять флаг USART_SR_TC
    чтобы удостовериться что данные точно ушли, ибо конец передачи дма не означает конец передачи данных, и запись новых данных приводит к потерям.
    Последний раз редактировалось Coreglider; 02.08.2013 в 13:41.

  24. #2461

    Регистрация
    17.06.2011
    Адрес
    Минск
    Возраст
    39
    Сообщений
    1,941
    Очередная реклама 10DOF свалилась на почту, мот кому то будет интересно:

    Dear Aleksey,
    Wanted to take the opportunity to introduce Sensoplex’s 10 axis Motion Tracking Sensor + Bluetooth Low Energy Module.

    It includes the latest Invensense 9 axis MPU9250 (accel+gyro+compass) + a pressure sensor, CPU + 128K Flash + RF link (BTLE). It also includes a micro USB for Li-ion Battery charging and a connector for embedded applications. The internal DMP (digital motion processor) and on board CPU perform sensor fusion and provide the raw or fused data through the connector or RF link to the rest of the system.

    The module can be viewed as a technology platform or a stand-alone product which can be custom modified to your requirements.
    Different software loads can enable simple motion tracking or customized applications.
    It is offered in several standard flavors including 10/9/7 and 6 axis initially (pressure sense optional).

    Samples and Evaluation boards available Aug 14th2013.
    Single quantity pricing is $99.00 (100K < $20.00)
    Development kits options are
    - $649 (full version – 3 modules + 2 adapter cards + cable and software)
    - $399 (2 modules, 1 adapter board + cable and software)
    Let us know if we can assist you.
    Подробнее можно узнать у них на сайте. ИМХО, Dev кит должны чуть ли не бесплатно отдавать...

  25. #2462

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    вот злосчастный кодятник: https://github.com/SergDoc/Nev_Multi...src/drv_uart.c
    и точно не знаю, то-ли буфер переполняется, то-ли ещё что, сейчас проверить не могу
    работает с затычкой:
    Код:
    void uartWrite( uint8_t ch)
    {
    	  while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE) { // тормозилка :(
    			};
        txBuffer[txBufferHead] = ch;
    
    
        txBufferHead = (txBufferHead + 1) % UART_BUFFER_SIZE;
    
    
    
    
        // if DMA wasn't enabled, fire it up
        if (!(DMA2_Stream7->CR & 1))
            uartTxDMA();
    }
    естественно с тормозом

    Цитата Сообщение от Sir Alex Посмотреть сообщение
    Подробнее можно узнать у них на сайте
    А хде ? что за контора?

  26. #2463

    Регистрация
    17.06.2011
    Адрес
    Минск
    Возраст
    39
    Сообщений
    1,941
    Цитата Сообщение от SergDoc Посмотреть сообщение
    А хде ? что за контора?
    Дык написано жеж, Sensoplex: www.sensoplex.com

  27. #2464

    Регистрация
    07.04.2012
    Адрес
    Брянск
    Возраст
    29
    Сообщений
    1,674
    Записей в дневнике
    6
    блин таки решил занятся SD карточкой... начал ковырятся и встал перед такой дилемой: портануть библиотечки от обычных мег или воспользоватся готовой от атмел
    первый вариант удобен в кол-ве файлов, а второй в функционале, но минус в баальшой куче файлов из которых большинство ненужно...

  28. #2465

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    Цитата Сообщение от Sir Alex Посмотреть сообщение
    Дык написано жеж, Sensoplex:
    а мне по названию одни матрасы сыпапались

  29. #2466

    Регистрация
    15.06.2011
    Адрес
    Ростов-на-Дону
    Возраст
    45
    Сообщений
    867
    Цитата Сообщение от Sir Alex Посмотреть сообщение
    Дык написано жеж, Sensoplex: www.sensoplex.com
    неслабо ребятки хотят , 500% прибыли ... а главное зачто ???
    к блютузному процу прицепили MPU и BARO ... и все ... математики как я понял пока нет ...
    да и плат на 9250 пока нет ... те платы что на фото датчик стоит LGA24 , а должен быть LGA16 , и барометра невидно ...
    такчто на фото скорее всего SP-6BN а не SP-10BN , а вот SP-10B вполне реально существует , только там MPU6xxx + компас + baro скорее всего bmp180 ...
    с учетом того что с плат кроме USB и блютуза ничего не выведено оно неочень интересно для коптерной тематики ...

  30. #2467

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    Цитата Сообщение от mataor Посмотреть сообщение
    блин таки решил занятся SD карточкой...
    ну мне ещё верхняя плата не приехала, так что и даже ещё не заморачивался с карточкой....

    Цитата Сообщение от Gapey Посмотреть сообщение
    оно неочень интересно для коптерной тематики ...
    я пдф-ки посмотрел - хрень какая-то

  31. #2468

    Регистрация
    15.06.2011
    Адрес
    Ростов-на-Дону
    Возраст
    45
    Сообщений
    867
    Цитата Сообщение от SergDoc Посмотреть сообщение
    я пдф-ки посмотрел - хрень какая-то
    если в качестве полетного контроллера использовать какойнибудь гуглафон , гуглаплеер или Raspberry то эту хрень можно будет использовать в качестве датчиков ... только тогда нада думать еще одну плату , какминимум для управления моторами ...

  32. #2469

    Регистрация
    17.06.2011
    Адрес
    Минск
    Возраст
    39
    Сообщений
    1,941
    Цитата Сообщение от Gapey Посмотреть сообщение
    да и плат на 9250 пока нет ... те платы что на фото датчик стоит LGA24 , а должен быть LGA16 , и барометра невидно ...
    Так в прессрелизе и написано, что в продажу поступи тока 14 августа.
    Да, я то же согласен, что для нас неудачная девайсина. Все таки сейчас рулят готовые контроллеры, а не Arduino + IMU

  33. #2470

    Регистрация
    07.04.2012
    Адрес
    Брянск
    Возраст
    29
    Сообщений
    1,674
    Записей в дневнике
    6
    так, натолкнулся случайно, думаю есть смылс оставить ссылку тут
    (PDF) Preface
    что это такое - здоровенный (325 стр.) талмут с теорией, реализацией и практикой ИНС гиро+аксель+компас+баро+ЖПС с кучей соответствующих расчетов, графиками и кодом.
    кстати с калманом.

  34. #2471

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    тоска заела - хочется собрать обратно свою старую добрую трёху, за одно 8-й таймер потестить(сервы), а то только на столе проверял, да и складная она у меня, но блин и квадрик разбирать не хочу - вот и маюсь

  35. #2472

    Регистрация
    27.12.2009
    Адрес
    Днепродзержинск, Украина
    Возраст
    43
    Сообщений
    281
    Записей в дневнике
    3
    Цитата Сообщение от SergDoc Посмотреть сообщение
    тоска заела - хочется собрать обратно свою старую добрую трёху, за одно 8-й таймер потестить(сервы), а то только на столе проверял, да и складная она у меня, но блин и квадрик разбирать не хочу - вот и маюсь
    Надо действовать Сергей, а то китайцы нас сделают.

  36. #2473

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    В общем компактность победила - собираю трёху старую
    коробка с мосхом встала как влитая.... движки с регулями перекину за вечер...

    я кстати на днях забыл включить angle - и летал в акро - заметил только когда крен дал практически градусов под 70 - тогда только обратил внимание на переключатель - пока от mpu только тащусь
    Последний раз редактировалось SergDoc; 02.08.2013 в 22:05.

  37. #2474

    Регистрация
    07.04.2012
    Адрес
    Брянск
    Возраст
    29
    Сообщений
    1,674
    Записей в дневнике
    6
    по просьбе маховика еще выложу здесь:
    Цитата Сообщение от mahowik
    Тоже нарвался на сайтец http://www.mdpi.com/journal/sensors
    Просто кладезь свежих изысканий и научных работ!
    Вот парочка примеров:
    http://www.mdpi.com/1424-8220/13/8/9549
    http://www.mdpi.com/1424-8220/12/12/17372
    http://www.mdpi.com/1424-8220/12/9/11638
    http://www.mdpi.com/1424-8220/10/10/9424

    http://www.mdpi.com/search?q=INS&jou...&search=Search

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

    закинь в ветку плз, пока я забанен...

  38. #2475

    Регистрация
    27.12.2009
    Адрес
    Днепродзержинск, Украина
    Возраст
    43
    Сообщений
    281
    Записей в дневнике
    3
    Вчера летал на мультивии и случайно разгепал его об планету. Причем аппарат был в зоне видимости и резко начал падать вверх тормашками, как будто прервалась связь с пультом(для безопасности у меня при пропадании сигнала движки сразу отключаются). Упал классно - головой вниз, коробка развалилась на куски Поэтому предлагаю ввести в проект светодионую сигнализацию файлсева и других возможных ситуаций(типа отказ датчиков итд итп), что бы можно было как то диагностировать дрова после падения.

  39. #2476

    Регистрация
    07.04.2012
    Адрес
    Брянск
    Возраст
    29
    Сообщений
    1,674
    Записей в дневнике
    6
    при пропадании сигнала нужен возврат домой а не отключение движков....

    П.С. сегодня буду тестить в полете GPS/GLONASS мегамодуль омегапрайма, вернее платку я сам разводил по всем правилам + компас на ней...
    позавчера тестил на улице сам модуль, кол-во используемых спутников доходило до 23шт.
    патч антенна 35х35мм, платка 70х70мм

  40. #2477

    Регистрация
    27.12.2009
    Адрес
    Днепродзержинск, Украина
    Возраст
    43
    Сообщений
    281
    Записей в дневнике
    3
    Цитата Сообщение от mataor Посмотреть сообщение
    при пропадании сигнала нужен возврат домой а не отключение движков....
    Это как посмотреть. У меня главный критерий - безопасность полётов для окружающих. А файлсейф с возвратом домой такого могут начудить, что лучше и не думать о последствиях. У меня на мультивие 2.2 около 100 часов налёту и ниразу проблем не было и вот случилось, причем аппарат был буквально в 50 метрах от меня.

  41. #2478

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    Надо логи куда-нибудь писать, или флешку или sd... полночи трёху собирал, теперь на работе сижу как болван

  42. #2479

    Регистрация
    15.06.2011
    Адрес
    Ростов-на-Дону
    Возраст
    45
    Сообщений
    867
    какраз при пропадании сигнала возврат домой предпочтительнее , чем автоматическое падение на голову стоящего под коптером ....
    при отказе датчиков , мотора (если это не гекса/окта) , питания можно сразу падать , ибо вернуться всеравно неполучится , так хоть не придется работать газонокосилкой ...
    почасти индикации , то её имеет смысл делать бортовыми огнями , чтобы в полете было сразу видно что нетак ...
    а после падения мозгом об асфальт смотреть на индикацию смысла оч мало ... нужно логи писать в сЪёмную NVRAM , ака чёрный ящик ...

  43. #2480

    Регистрация
    07.04.2012
    Адрес
    Брянск
    Возраст
    29
    Сообщений
    1,674
    Записей в дневнике
    6
    Цитата Сообщение от okan_vitaliy Посмотреть сообщение
    У меня главный критерий - безопасность полётов для окружающих
    угумсь, только вот что будет если в момент срабатывания фейлсейва под аппаратом что-нить или даже кто-нить будет находится?

+ Ответить в теме

Похожие темы

  1. Система стабилизации гиро+акселерометр
    от Фантомас в разделе Полеты по камере, телеметрия
    Ответов: 32
    Последнее сообщение: 25.01.2011, 14:47
  2. Продам Продам Клона Trex 450SEV2 + Аппаратура + Запчасти+ система стабилизации RTF
    от omegapraim в разделе Барахолка. Вертолеты
    Ответов: 1
    Последнее сообщение: 12.01.2011, 18:16
  3. Продам Трёхосевую систему стабилизации Turnigy V-Bar 600
    от avi@tor в разделе Барахолка. Аппаратура
    Ответов: 1
    Последнее сообщение: 08.11.2010, 13:02
  4. Продам Gaui система стабилизации GU365, дёшево.
    от avi@tor в разделе Барахолка. Вертолеты
    Ответов: 3
    Последнее сообщение: 03.08.2010, 11:13
  5. Системы стабилизации
    от max815 в разделе Фото и видеосъемка, системы стабилизации
    Ответов: 16
    Последнее сообщение: 11.03.2010, 03:14

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения