Специальные цены   новые товары
+ Ответить в теме
Страница 38 из 165 ПерваяПервая ... 28 36 37 38 39 40 48 ... ПоследняяПоследняя
Показано с 1,481 по 1,520 из 6569

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

Тема раздела Квадрокоптеры. Общие вопросы в категории Квадрокоптеры и мультироторы; Сообщение от Razek Она кросплатформенная ага, надо ардуино 1 и выше, maple ide в пролёте, а потом спрашивает - а ...

  1. #1481

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    Цитата Сообщение от Razek Посмотреть сообщение
    Она кросплатформенная
    ага, надо ардуино 1 и выше, maple ide в пролёте, а потом спрашивает - а где ваши STM?, а где бутлоадер в проце? а есть там только на ф103, ну и т.д. буду ковырять дальше...

  2.  
  3. #1482

    Регистрация
    22.08.2011
    Адрес
    Калининград
    Возраст
    35
    Сообщений
    947
    Записей в дневнике
    2
    Либы там маполвские переписанные под F407. Все идет в дистре исходников. Компилер CodeSourcery ARM EABI (2011.09-69) новый криво компилирует, бутлоадер, да смотря чем заливать прошивки собираешься, могу скинуть оригинальный бутлоадер. Да кстати все что не 407 и не ардуино 100% поддержки нет.

  4. #1483

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

  5. #1484

    Регистрация
    22.08.2011
    Адрес
    Калининград
    Возраст
    35
    Сообщений
    947
    Записей в дневнике
    2
    Гробага будет скорей всего, надо эклипс настроить на CodeSourcery компилер

  6.  
  7. #1485

    Регистрация
    19.04.2010
    Адрес
    Ханты
    Возраст
    40
    Сообщений
    1,471
    Цитата Сообщение от oleg70 Посмотреть сообщение
    Т.е. прерывание от гиро " толкает" ПДП ? или SPI ? Как выстроить алгоритм по Вашему?
    Уменя так: готовность ДУС-вн.прерывание-запуск ПДП-прерывание окнчания ПДП-расчет ДУС

    Цитата Сообщение от Razek Посмотреть сообщение
    правда это кросплатформенность на дно их тянет
    Ну эт смотря как писать, ну и не скрешивать бульдога с носорогом (АВР и АРМ). У меня, допустим, достаточно 2 файла заменить для перехода между СТМами, и 3й файл если менять датчики.

  8. #1486

    Регистрация
    18.02.2013
    Адрес
    Москва
    Возраст
    31
    Сообщений
    61
    Подскажите, кто знает наверняка, в Atmega128 есть таймер с функцией захвата? Я смотрел в pdf, там есть много функций и есть что-то подобное на захват. Но оно ли это?

  9. #1487

    Регистрация
    26.11.2012
    Адрес
    Tambov
    Возраст
    46
    Сообщений
    777
    Цитата Сообщение от Alexsis1109 Посмотреть сообщение
    и есть что-то подобное на захват
    Захват у таймеров 1 и 3 , вход называется "input capture"

  10.  
  11. #1488

    Регистрация
    22.08.2011
    Адрес
    Калининград
    Возраст
    35
    Сообщений
    947
    Записей в дневнике
    2
    Цитата Сообщение от rual Посмотреть сообщение
    Ну эт смотря как писать, ну и не скрешивать бульдога с носорогом

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

  12. #1489

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

  13. #1490

    Регистрация
    06.04.2012
    Адрес
    Moscow
    Возраст
    34
    Сообщений
    202
    Цитата Сообщение от SergDoc Посмотреть сообщение
    а по поводу с чего всё начиналось: один человек мне пообещал опупенный алгоритм, а как только я начал делать что-то, утёк в кусты, вот и мучаюсь
    У меня тоже единомышленники сливались как только дело доходило до серьезного проектирования В итоге ушло времени в разы больше чем планировал и приходится разбираться в том, во что лезть совершенно не предполагал

  14. #1491

    Регистрация
    18.02.2013
    Адрес
    Москва
    Возраст
    31
    Сообщений
    61
    Цитата Сообщение от oleg70 Посмотреть сообщение
    Захват у таймеров 1 и 3 , вход называется "input capture"
    спасибо. т.е. их два. а для считываня шимов с каналов достаточно только одного таймера? его просто по событиям переключать, сначало из 0 в 1 , потом из 1 в 0?

  15. #1492

    Регистрация
    17.06.2011
    Адрес
    Минск
    Возраст
    39
    Сообщений
    1,941
    Цитата Сообщение от Alexsis1109 Посмотреть сообщение
    а для считываня шимов с каналов достаточно только одного таймера? его просто по событиям переключать, сначало из 0 в 1 , потом из 1 в 0?
    Я уже писал вам, одного ICP(Input Capture Pin) хватит для обработки PPM(CPPM) сигнала. Для этого достаточно ловить только Rising Edge (из 0 в 1). Если вам надо каждый канал по отдельности обрабатывать, то разумеется вам надо столько ICP пинов, сколько у вас каналов и в этом случае надо его переключать из 0 в 1 и 1 в 0.

  16. #1493

    Регистрация
    26.11.2012
    Адрес
    Tambov
    Возраст
    46
    Сообщений
    777
    Цитата Сообщение от Alexsis1109 Посмотреть сообщение
    спасибо. т.е. их два.
    Если Вы хотите сделать "систему стабилизации для моделей" то аппаратных ресурсов чтения ШИМ Вам не хватит (на таймерах AVR по захвату),
    я Вам выше постом изложил приблизительный алгоритм чтения по прерыванию на "ноге" где счетчик используется в обычном режиме измерения длительности, его надо по положительному фронту импульса запустить и по отрицательному фронту остановить....

    Цитата Сообщение от rual Посмотреть сообщение
    Уменя так: готовность ДУС-вн.прерывание-запуск ПДП-прерывание окнчания ПДП-расчет ДУС ........
    В Вашем проекте нашел функции по ДЕинициализации петли ДУСа, каково их применение ?
    И еще, я так понял, что для чтения акселя и магнетометра ПДП не применяется (?).
    Последний раз редактировалось oleg70; 16.03.2013 в 15:03.

  17. #1494

    Регистрация
    18.02.2013
    Адрес
    Москва
    Возраст
    31
    Сообщений
    61
    Цитата Сообщение от Sir Alex Посмотреть сообщение
    Если вам надо каждый канал по отдельности обрабатывать, то разумеется вам надо столько ICP пинов, сколько у вас каналов и в этом случае надо его переключать из 0 в 1 и 1 в 0.
    вот на примере приемника Futaba 7C, по идее выход - РРМ сигнал, но опрашивать же нужно каждый канал в отдельности?

  18. #1495
    DVE
    DVE вне форума

    Регистрация
    16.06.2008
    Адрес
    EU
    Возраст
    37
    Сообщений
    4,386
    Именно поэтому в первых контроллерах так любили приемники Спектрум - у них весь PPM идет по одному проводу, что-то типа такого.
    http://api.ning.com/files/WmjViE3faL...g_Diagram1.jpg

    Для Футабы есть приемники FsSky, которые можно переключить в режим PPM sum.

  19. #1496

    Регистрация
    26.12.2011
    Адрес
    Киров
    Возраст
    32
    Сообщений
    156
    Всем добрый вечер.
    камень stm32f407.
    Возник такой вопрос, переписал захват ШИМ так, чтобы использовать только 1 канал таймера, вместо двух, как советует даташит.
    Вроде бы все хорошо, данные захватываются верно, но примерно раз 1 сек. идет сбой. как я понимаю, происходит это в тот момент, когда происходит переполнение счетчика таймера. Его обрабатываю следующим образом:
    // newData - значение счетчика в момент спада
    // oldData - значение счетчика в момент фронта

    if(newData > oldData)
    {
    // считаем разницу тиков между подъемом и спадом
    capture = newData - oldData;
    }
    else
    {
    // считаем разницу тиков между подъмом и спадом с учетом что между этими 2-мя событиями было переполнение счетчика таймера
    capture = (UINT16_MAX - oldData) + newData;
    }

    Такое условие не помогает. Кто как обрабатывает данную ситуацию ?
    Миниатюры Миниатюры Нажмите на изображение для увеличения
Название: Скрин.jpg‎
Просмотров: 29
Размер:	45.4 Кб
ID:	767054  
    Последний раз редактировалось Geniok; 17.03.2013 в 00:43.

  20. #1497

    Регистрация
    26.11.2012
    Адрес
    Tambov
    Возраст
    46
    Сообщений
    777
    А как это Вы так один канал настроили, что он оба фронта ловит,
    если не секрет...?

  21. #1498

    Регистрация
    26.12.2011
    Адрес
    Киров
    Возраст
    32
    Сообщений
    156
    Цитата Сообщение от oleg70 Посмотреть сообщение
    А как это Вы так один канал настроили, что он оба фронта ловит,
    если не секрет...?
    Не секрет конечно.

    вот настройка канала:

    Timer* timer = Timer::getInstance();
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge; // ловим оба перехода
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // данные напрямую со входа
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; // делитель отключен
    TIM_ICInitStructure.TIM_ICFilter = 0x0; // фильтр отключен
    timer->TIM_ICInit(TIMx, &TIM_ICInitStructure);

    Ловлю переход из 0 в 1, запоминаю значение счетного таймера в переменную oldData, ловлю переход из 1 в 0, запоминаю значение из счетного таймера в newData.
    Таймер тикает с частотой 1 Мг.
    Так как частота ШИМ стандартно 50Гц, значит период будет 0,2 с, и мне его считать не надо. Таким образом получаю скважность ШИМ.

    Снимая показания с пульта, получаю разницу между newData и oldData от 1000мкс до 2000мкс (минимальное - максимальное значение газа). 1500мкс - центральное положение.

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

    Раз в 0,4 сек. получаю "слейку" 2-х периодов. Вот ее мне и надо убрать...

    Собственно сейчас подключил к мотору, вроде бы эти "склейки" не мешают.
    Хотелось бы конечно от них избавится на всякий случай, кто знает когда регуль рассинхрон словит..
    Последний раз редактировалось Geniok; 17.03.2013 в 02:44.

  22. #1499

    Регистрация
    18.02.2013
    Адрес
    Москва
    Возраст
    31
    Сообщений
    61
    Цитата Сообщение от Geniok Посмотреть сообщение
    В будущем если нужен будет захват на другой частоте, учесть коэффициент не проблема.
    так получается система не универсальная. под каждый приемник настраивать надо

  23. #1500

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    так как сейчас ковыряюсь с AeroQad32
    радио PWM
    Код:
    /*
      Copyright (c) 2011 ala42.  All rights reserved.
    
      STM32 receiver class by ala42 using time input capture
      for use with AeroQuad software and Maple library
      V 1.0 Oct 15 2011
      V 1.1 Jan 22 2012	class free version for AeroQuad 3.0 compatibility
    
      Define the pin numbers used for the receiver in receiverPin[]
    
      Timer and timer channels are accessed using the Maple PIN_MAP array.
      Make sure libmaple and this receiver class are compiled using the
      same structure alignment mode. When in doubt, change the stm32_pin_info
      declaration in wirish_types.h to align the size to a multiple of 4 byte
      by adding a filler byte at the end of the structure declaration.
    */
    
    #ifndef _AEROQUAD_RECEIVER_STM32_H_
    #define _AEROQUAD_RECEIVER_STM32_H_
    
    #if defined(AeroQuadSTM32)
    
    #include "Receiver.h"
    #include "wirish.h"
    
    //#define STM32_TIMER_DEBUG // enable debug messages
    
    ///////////////////////////////////////////////////////////////////////////////
    // configuration part starts here
    // definition of pins used for PWM receiver input
    
    
    /*
    	ROLL     0	3
    	PITCH    1	1
    	YAW      2	0
    	THROTTLE 3	2
    	MODE     4	4
    	AUX      5	6
    	AUX2     6	5
    	AUX3     7	7
    */
    static byte ReceiverChannelMap[] = {0, 1, 2, 3, 4, 5, 6, 7}; // default mapping
    
    
    ///////////////////////////////////////////////////////////////////////////////
    // implementation part starts here.
    // forward declaration, array is defined at the end of this file
    extern voidFuncPtr PWM_in_handler[];
    
    typedef struct {
      timer_dev   *TimerDev;
      timer_gen_reg_map *TimerRegs;
      __io uint32	*Timer_ccr;
      int			Low;
      int			High;
      uint16		HighTime;
      uint16		RiseTime;
      uint16		LastChange;
      int			Channel;
      int			TimerChannel;
      int			PolarityMask;
      int			Valid;
      int			Debug;
    } tFrqData;
    
    #define FRQInputs 8
    volatile tFrqData FrqData[FRQInputs];
    
    void FrqInit(int aChannel, int aDefault, volatile tFrqData *f, timer_dev *aTimer, int aTimerChannel) {
    
      aTimerChannel--;  // transform timer channel numbering from 1-4 to 0-3
    
      f->Channel      = aChannel;
      f->Valid        = false;
    
      f->TimerDev     = aTimer;
      timer_gen_reg_map *timer = aTimer->regs.gen;
      f->TimerRegs    = timer;
    
      f->Timer_ccr    = &timer->CCR1 + aTimerChannel;
      f->Debug        = false;
      f->HighTime     = aDefault;
      f->TimerChannel = aTimerChannel;
    
      int TimerEnable = (1 << (4*aTimerChannel));
      f->PolarityMask = TimerEnable << 1;
    
      uint32 clock_speed = rcc_dev_timer_clk_speed(f->TimerDev->clk_id);
      timer->PSC	= (clock_speed/1000000)-1;
      timer->ARR	= 0xffff;
      timer->CR1	= 0;
      timer->DIER &= ~(1);
    
      timer->CCER &= ~TimerEnable; // Disable timer
      timer->CCER &= ~(f->PolarityMask);
    
      volatile uint32 *mr;
      if(aTimerChannel < 2) {
        mr = &(timer->CCMR1);
      }
      else {
        mr = &(timer->CCMR2);
      }
      *mr &= ~(0xFF << (8*(aTimerChannel&1)));	// prescaler 1
      *mr |= 0x61 << (8*(aTimerChannel&1));		// 0x61 -> 6=filter, 1=inputs 1,2,3,4
    
      timer->CCER |= TimerEnable; // Enable
      timer->CR1 = 1;
    }
    
    
    void InitFrqMeasurement() {
    
      for(int rcLine = 0; rcLine < (int)(sizeof(receiverPin) / sizeof(receiverPin[0])); rcLine++) {
        int pin = receiverPin[rcLine];
        timer_dev *timer_num = PIN_MAP[pin].timer_device;
        if(timer_num != NULL) {
          gpio_set_mode(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, GPIO_AF_INPUT_PD);
          FrqInit(rcLine, 1500, &FrqData[rcLine], timer_num, PIN_MAP[pin].timer_channel);
          timer_attach_interrupt(timer_num, PIN_MAP[pin].timer_channel, PWM_in_handler[rcLine]);
        }
      }
    }
    
    
    void PWMInvertPolarity(volatile tFrqData *f) {
      f->TimerRegs->CCER ^= f->PolarityMask; // invert polarity
    }
    
    void FrqChange(volatile tFrqData *f) {
    
      timer_gen_reg_map *timer = f->TimerRegs;
      uint16_t c = *(f->Timer_ccr);
      bool rising = (timer->CCER & f->PolarityMask) == 0;
    
      if(f->Valid) {
        if(rising) {
          f->RiseTime = c;
        } 
        else {
          uint16_t highTime = c - f->RiseTime;
          if(highTime > 900 && highTime < 2100) {
            f->HighTime = highTime;
          } 
          else {
            f->Valid = false;
          }
        }
      } 
      else if(rising) {
        // rising edge, store start time
        f->RiseTime = c;
        f->Valid = true;
      }
    
      PWMInvertPolarity(f);
    }
    
    // hide the class details from the interrupt handler
    void IrqChangeValue(int chan) {
      FrqChange(&FrqData[chan]);
    }
    
    
    ///////////////////////////////////////////////////////////////////////////////
    // definition of interrupt handler functions, one for each channel
    void PWM_in_0() { IrqChangeValue(0); }
    void PWM_in_1() { IrqChangeValue(1); }
    void PWM_in_2() { IrqChangeValue(2); }
    void PWM_in_3() { IrqChangeValue(3); }
    void PWM_in_4() { IrqChangeValue(4); }
    void PWM_in_5() { IrqChangeValue(5); }
    void PWM_in_6() { IrqChangeValue(6); }
    void PWM_in_7() { IrqChangeValue(7); }
    
    voidFuncPtr PWM_in_handler[] = { PWM_in_0, PWM_in_1, PWM_in_2, PWM_in_3, PWM_in_4, PWM_in_5, PWM_in_6, PWM_in_7 };
    
    
    ///////////////////////////////////////////////////////////////////////////////
    // interface part starts here
    
    void initializeReceiver(int nbChannel = 8) {
    
        initializeReceiverParam(nbChannel);
    	InitFrqMeasurement();
    }
    
    
    int getRawChannelValue(const byte channel) {
    	int chan = ReceiverChannelMap[channel];
    	if(chan < (int)sizeof(receiverPin)) {
    		volatile tFrqData *f = &FrqData[chan];
    		uint16_t PulsLength = f->HighTime;
    		return PulsLength;
    	} else {
    		return 1500;
    	}
    }
    
    
    void setChannelValue(byte channel,int value) {
    }
    
    #endif
    
    #endif
    радио PPM
    Код:
    /*
      Copyright (c) 2012 kha.  All rights reserved.
    
      STM32 PPM receiver by kha based on
      STM32 receiver class by ala42 using time input capture
      for use with AeroQuad software and Maple library
      V 1.0 Jun 14 2012
    
      Define the pin numbers used for the receiver in receiverPinPPM
    
      Timer and timer channels are accessed using the Maple PIN_MAP array.
      Make sure libmaple and this receiver class are compiled using the
      same structure alignment mode. When in doubt, change the stm32_pin_info
      declaration in wirish_types.h to align the size to a multiple of 4 byte
      by adding a filler byte at the end of the structure declaration.
    */
    
    #ifndef _AEROQUAD_RECEIVER_STM32PPM_H_
    #define _AEROQUAD_RECEIVER_STM32PPM_H_
    
    #if defined(AeroQuadSTM32)
    
    #include "Receiver.h"
    #include "wirish.h"
    #include "Receiver_PPM_common.h"
    
    static byte ReceiverChannelMap[PPM_CHANNELS] = {SERIAL_SUM_PPM};
    
    uint16 rawChannelValue[PPM_CHANNELS] =  {1500,1500,1500,1500,1500,1500,1500,1500,1500,1500};
    byte   currentChannel;
    
    
    ///////////////////////////////////////////////////////////////////////////////
    // implementation part starts here.
    
    typedef struct {
      timer_dev   *TimerDev;
      timer_gen_reg_map *TimerRegs;
      __io uint32	*Timer_ccr;
      uint16		RiseTime;
      int			TimerChannel;
      int			PolarityMask;
    } tFrqData;
    
    volatile tFrqData FrqData;
    
    void FrqInit(int aDefault, timer_dev *aTimer, int aTimerChannel)
    {
      aTimerChannel--;  // transform timer channel numbering from 1-4 to 0-3
    
      FrqData.TimerDev     = aTimer;
      timer_gen_reg_map *timer = aTimer->regs.gen;
      FrqData.TimerRegs    = timer;
    
      FrqData.Timer_ccr    = &timer->CCR1 + aTimerChannel;
      FrqData.TimerChannel = aTimerChannel;
    
      int TimerEnable = (1 << (4*aTimerChannel));
      FrqData.PolarityMask = TimerEnable << 1;
    
      uint32 clock_speed = rcc_dev_timer_clk_speed(FrqData.TimerDev->clk_id);
      timer->PSC	= (clock_speed/1000000)-1;
      timer->ARR	= 0xffff;
      timer->CR1	= 0;
      timer->DIER &= ~(1);
    
      timer->CCER &= ~TimerEnable; // Disable timer
      timer->CCER &= ~(FrqData.PolarityMask);
    
      volatile uint32 *mr;
      if(aTimerChannel < 2) {
        mr = &(timer->CCMR1);
      } 
      else {
        mr = &(timer->CCMR2);
      }
      *mr &= ~(0xFF << (8*(aTimerChannel&1)));	// prescaler 1
      *mr |= 0x61 << (8*(aTimerChannel&1));		// 0x61 -> 6=filter, 1=inputs 1,2,3,4
    
      timer->CCER |= TimerEnable; // Enable
      timer->CR1 = 1;
    
    }
    
    void FrqChange()
    {
      uint16_t c = *(FrqData.Timer_ccr);
      uint16_t diffTime = c - FrqData.RiseTime;
      if ((diffTime > 900) && (diffTime < 2100)) {
        if (currentChannel < PPM_CHANNELS) {
          rawChannelValue[currentChannel] = diffTime;
          currentChannel++;
        }
      } 
      else if (diffTime > 2500) {
        currentChannel = 0;
      } 
      else {
        // glitch; stop and wait next round
        currentChannel = PPM_CHANNELS;
      }
      FrqData.RiseTime = c;
    }
    
    void InitFrqMeasurement()
    {
      int pin = receiverPinPPM;
      timer_dev *timer_num = PIN_MAP[pin].timer_device;
    
      currentChannel=8;
      if(timer_num != NULL) {
        gpio_set_mode(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, GPIO_AF_INPUT_PD);
        FrqInit(1500, timer_num, PIN_MAP[pin].timer_channel);
        timer_attach_interrupt(timer_num, PIN_MAP[pin].timer_channel, FrqChange);
      }
    
    }
    
    
    
    ///////////////////////////////////////////////////////////////////////////////
    // interface part starts here
    
    void initializeReceiver(int nbChannel = 8) {
      initializeReceiverParam(nbChannel);
      InitFrqMeasurement();
    }
    
    
    int getRawChannelValue(const byte channel) {
      return rawChannelValue[ReceiverChannelMap[channel]];
    }
    
    
    void setChannelValue(byte channel,int value) {
    }
    
    #endif
    
    #endif

  24. #1501

    Регистрация
    26.12.2011
    Адрес
    Киров
    Возраст
    32
    Сообщений
    156
    Цитата Сообщение от Alexsis1109 Посмотреть сообщение
    так получается система не универсальная. под каждый приемник настраивать надо
    Ну в вообщем-то да, вся настройка выглядит вот так:

    int main(void)
    {
    STM32* mk = STM32::getInstance();
    Clock* clc = Clock::getInstance();
    PWM* pwm = PWM::getInctance();

    // Инициализируем железо
    mk->Init();

    // Настраиваем системный таймер
    clc->Setup();

    pwm->Setup(PB7, TIM4, CH_2, INPUT, 50); // приемник
    pwm->Setup(PA0, TIM2, CH_1, OUTPUT, 50); // мотор

    while(1)
    {
    pwm->Write(TIM2, CH_1, pwm->Read(TIM4, CH_2)); // передаю на мотор сигнал с приемника
    }
    }

    Это полный текст главного цикла, где с одного канала ( с приемника) получаю ШИМ и передаю на другой ( на мотор).

    Цифра 50 - это и есть частота ШИМ.

  25. #1502

    Регистрация
    26.11.2012
    Адрес
    Tambov
    Возраст
    46
    Сообщений
    777
    Цитата Сообщение от Geniok Посмотреть сообщение
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
    Видимо у 407-го (не смотрел) есть настройка на оба фронта, а у меня F303 только "или"-"или"...
    Вы посмотрите, - есть ли аппаратная возможность сброса счетчика по первому фронту (в моем кажется есть, сейчас как раз копаюсь), тогда все проблемы отпадут..

  26. #1503

    Регистрация
    26.12.2011
    Адрес
    Киров
    Возраст
    32
    Сообщений
    156
    Цитата Сообщение от oleg70 Посмотреть сообщение
    Видимо у 407-го (не смотрел) есть настройка на оба фронта, а у меня F303 только "или"-"или"...
    Вы посмотрите, - есть ли аппаратная возможность сброса счетчика по первому фронту (в моем кажется есть, сейчас как раз копаюсь), тогда все проблемы отпадут..
    А сбрасывать ведь нельзя...
    Если к этому таймеру подключены еще 3 канала ШИМ ?
    Вы ведь сбросите счетчик таймера для все каналов он же единый...
    И если на одном получите правильное значение, то для всех остальных будет "мусор"

    Я бы тогда конечно сбрасывал по второму фронту и проблем бы с переполнением не было.

  27. #1504

    Регистрация
    26.11.2012
    Адрес
    Tambov
    Возраст
    46
    Сообщений
    777
    Цитата Сообщение от Geniok Посмотреть сообщение
    А сбрасывать ведь нельзя...
    .
    Согласен.., затупил , к тому же "разул глаза" благодаря Вам, и на моем можно по обеим фронтам настроить.., будем думать..

    Однако имейте в виду (проверено) что в реальном времени импульсы всех каналов разнесены и не пересекаются (они из PPM вырезаны), так что насчет сброса еще подумать надо...
    Последний раз редактировалось oleg70; 17.03.2013 в 13:08.

  28. #1505

    Регистрация
    26.12.2011
    Адрес
    Киров
    Возраст
    32
    Сообщений
    156
    Цитата Сообщение от oleg70 Посмотреть сообщение
    Согласен.., затупил , к тому же "разул глаза" благодаря Вам, и на моем можно по обеим фронтам настроить.., будем думать..

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

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

  29. #1506

    Регистрация
    18.02.2013
    Адрес
    Москва
    Возраст
    31
    Сообщений
    61
    Цитата Сообщение от Geniok Посмотреть сообщение
    чуть задержался в прерываниях, пришел импульс с другого канала и все, пиши пропало.
    на то они и прерывания чтобы в них не задерживаться

  30. #1507

    Регистрация
    26.11.2012
    Адрес
    Tambov
    Возраст
    46
    Сообщений
    777
    Цитата Сообщение от Geniok Посмотреть сообщение
    и все, пиши пропало.
    Вот и я всю голову изломал, даже всерьез подумываю слепить преобразователь на простеньком Avr-e в PPM и тогда получим: 1 нога STM под приемник ! ПДП на чтение всех каналов ! никаких прерываний !

  31. #1508

    Регистрация
    26.12.2011
    Адрес
    Киров
    Возраст
    32
    Сообщений
    156
    Цитата Сообщение от Alexsis1109 Посмотреть сообщение
    на то они и прерывания чтобы в них не задерживаться
    Ну имелось в виду не само прерывание как таковое, а функция его обработки.
    Пока обработываешь, пришло другое прерывание, значение счетчика изменилось, а мы его сбросили... Потому сбрасывать его не желательно. ИМХО.
    Вообщем, проверять это все дело надо.

    Цитата Сообщение от oleg70 Посмотреть сообщение
    Вот и я всю голову изломал, даже всерьез подумываю слепить преобразователь на простеньком Avr-e в PPM и тогда получим: 1 нога STM под приемник ! ПДП на чтение всех каналов ! никаких прерываний !
    Вот уж не знаю, стоит ли шкурка выделки...
    По мне так лучше как сейчас, 1 канал таймера - 1 канал приемника.При таких настройках моторы вчера гонял весь вечер, проблем не было.

  32. #1509

    Регистрация
    16.12.2005
    Адрес
    Москва
    Возраст
    34
    Сообщений
    4,452
    Записей в дневнике
    13
    Цитата Сообщение от oleg70 Посмотреть сообщение
    Однако имейте в виду (проверено) что в реальном времени импульсы всех каналов разнесены и не пересекаются
    Увы, не во всех приемниках так. В некоторых они как раз одновременно идут
    Вот пример картинки с сайта Эксперта

  33. #1510

    Регистрация
    26.12.2011
    Адрес
    Киров
    Возраст
    32
    Сообщений
    156
    Цитата Сообщение от leprud Посмотреть сообщение
    Увы, не во всех приемниках так. В некоторых они как раз одновременно идут
    Вот пример картинки с сайта Эксперта
    Вот-вот, тем более даже если взять 1-ю картинку, то по ней спад 1 канала совпадает с фронтом 2-го. Даже в этом случае расчитывать на сброс счетчика уже опасно, пока считаешь первый канал, со второго пришло прерывание. И не факт что сбросить счетчик успеешь до прихода прерывания со второго канала.
    А если учесть что на 1 таймере весит аж 4 канала управления, игра в рулетку какая-то получается.

  34. #1511

    Регистрация
    26.11.2012
    Адрес
    Tambov
    Возраст
    46
    Сообщений
    777
    Цитата Сообщение от leprud Посмотреть сообщение
    Увы, не во всех приемниках так.
    Странно.. не знал, ведь в радиосигнале информация не может быть параллельна, как же это они так "измудрились" к одному фронту привязать все каналы, хотя ... пути господни..

    Получается, что все алгоритмы летят к ".... бабушке".

  35. #1512

    Регистрация
    18.02.2013
    Адрес
    Москва
    Возраст
    31
    Сообщений
    61
    Цитата Сообщение от Geniok Посмотреть сообщение
    И не факт что сбросить счетчик успеешь до прихода прерывания со второго канала.
    действительно, что делать если прерывание следующего канала сработает сразу с завершением фронта предыдущего? как успеть записать значение шима???

  36. #1513
    DVE
    DVE вне форума

    Регистрация
    16.06.2008
    Адрес
    EU
    Возраст
    37
    Сообщений
    4,386
    Цитата Сообщение от oleg70 Посмотреть сообщение
    Странно.. не знал, ведь в радиосигнале информация не может быть параллельна, как же это они так "измудрились" к одному фронту привязать все каналы, хотя ... пути господни..
    Это же цифровой сигнал, приходит пакет, приемник его декодирует и выставляет значения каналов, к примеру.

  37. #1514

    Регистрация
    26.11.2012
    Адрес
    Tambov
    Возраст
    46
    Сообщений
    777
    Цитата Сообщение от DVE Посмотреть сообщение
    Это же цифровой сигнал.
    У меня futaba PCM (типа "цифра") но импульсы всеж разнесены причем с "зазором", как и в реале..

  38. #1515

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    Вот PPM SUM - это просто (очередное простое решение проблемы) простая ловилка PWM на tiny 2313 сам сейчас с такой летаю, как пишет автор, там ссылка есть на первоисточник, работает с любыми выходами приёмника...
    I have used it without problems with my mikrokopter. It works without skipping frames on my Corona CR8D type 2 receiver (all servo channels output simultaneously). It should work fine on type 1 receivers also (servo channels output sequentially), but I don't own any so I can't test it.
    Последний раз редактировалось SergDoc; 17.03.2013 в 15:30.

  39. #1516

    Регистрация
    26.12.2011
    Адрес
    Киров
    Возраст
    32
    Сообщений
    156
    Цитата Сообщение от Alexsis1109 Посмотреть сообщение
    действительно, что делать если прерывание следующего канала сработает сразу с завершением фронта предыдущего? как успеть записать значение шима???
    Если сделать как у меня, то ничего страшного в этом не будет, я же не сбрасываю значение счетчика. А вот если сбрасывать, тогда да, будут проблемы.

    Цитата Сообщение от oleg70 Посмотреть сообщение
    У меня futaba PCM (типа "цифра") но импульсы всеж разнесены причем с "зазором", как и в реале..
    А зазор какой, сколько есть времени на обработку?

  40. #1517

    Регистрация
    26.11.2012
    Адрес
    Tambov
    Возраст
    46
    Сообщений
    777
    Цитата Сообщение от Geniok Посмотреть сообщение
    А зазор какой, сколько есть времени на обработку?
    0.3 мили/сек

    Цитата Сообщение от SergDoc Посмотреть сообщение
    простая ловилка PWM на tiny
    Вот, а я еще хочу скажем в RS232 преобразовать (не проблема) тогда прям в USART заливай 16 байт (8х2), ПДП, и вперед...

  41. #1518

    Регистрация
    26.12.2011
    Адрес
    Киров
    Возраст
    32
    Сообщений
    156
    Провел эксперимент.
    Вот сигнал с 3-х каналов приемника.
    Аппа Турнига 9х

    Как видно, фронт идет сразу по всем каналам.

    И сразу назревает проблема.
    2 канала я еще более-менее успеваю обрабатывать, а вот уже не 3-х происходит сбой. Счетчик же тикает, пока до 3-го канала добираюсь, половину скважности ШИМ успевает обрезать.
    Про 4 канала уже и говорить не хочется...

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

    Зато теперь знаю как избавится от слеек, сбрасывать счетчик по фронту.
    Миниатюры Миниатюры Нажмите на изображение для увеличения
Название: screenshot.jpg‎
Просмотров: 16
Размер:	38.1 Кб
ID:	767338  
    Последний раз редактировалось Geniok; 17.03.2013 в 17:05.

  42. #1519

    Регистрация
    26.11.2012
    Адрес
    Tambov
    Возраст
    46
    Сообщений
    777
    Цитата Сообщение от Geniok Посмотреть сообщение
    И сразу назревает проблема.
    "Простая задача" оказалась не простой (хорошо, что я плату еще не начал делать), даааа....
    Спасибо за эксперимент.. (у меня только футабы есть), не знал..

  43. #1520

    Регистрация
    26.12.2011
    Адрес
    Киров
    Возраст
    32
    Сообщений
    156
    Нашел решение, как обрабатывать все правильно.
    Делать надо так:
    сначала ловим переход из 0 в 1. Сбрасываем счетчик таймера.
    Далее проводим переинициализацию таймера, чтобы он ловил переход из 1 в 0.
    Записываем значения. снова проводим перенастройку. чтоб ловил из 0 в 1 и т.д. по кругу.
    Таким образом ничего нигде не обрезается и все данные по всем 4-м каналом на 1-м таймере соответствуют действительности.

    Плюс к этому избавляемся от переполнения счетчика таймера.


    И к 303 камню как раз подходит!

    Код нужен ?

    Цитата Сообщение от oleg70 Посмотреть сообщение
    "Простая задача" оказалась не простой (хорошо, что я плату еще не начал делать), даааа....
    Спасибо за эксперимент.. (у меня только футабы есть), не знал..
    Возможно для футабы придется писать код отдельно, также как для спектрумов...

    Получаем вот такую ровную картину.

    Все каналы кроме 3-го в центре, 3-й в минимуме.

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

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

    Плюс к этому экономим на памяти, так как хранить нужно всего 1 значение, вместо 3-х, как раньше.
    Миниатюры Миниатюры Нажмите на изображение для увеличения
Название: screenshot_2.jpg‎
Просмотров: 10
Размер:	40.8 Кб
ID:	767368   Нажмите на изображение для увеличения
Название: screenshot_3.jpg‎
Просмотров: 11
Размер:	36.8 Кб
ID:	767382  
    Последний раз редактировалось Geniok; 17.03.2013 в 18:15.

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

Похожие темы

  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

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

Ваши права

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